[英]Can I access the TaskToken from a Map state with ItemSelector where the iteration step uses lambda:invoke.waitForTaskToken?
我正在使用 AWS 步驟 function 迭代輸入文檔中的列表,對於每次迭代,我都需要調用外部服務。 因此,我想遍歷每個項目並使用lambda:invoke.waitForTaskToken
運行一個步驟,並將TaskToken
傳遞到每次迭代的執行中。
我遇到的問題是如何在 Map state 級別使用ItemSelector
,但也在內部步驟中注入TaskToken
。 我需要使用ItemSelector
,因為我希望每個項目還包含從輸入到 Map state 的信息。 AWS 文檔 state :
ItemSelector 字段替換了 Map state 中的 Parameters 字段。如果您使用 Map state 定義中的 Parameters 字段來創建自定義輸入,我們強烈建議您將它們替換為 ItemSelector。
但他們也說:
在執行過程中,上下文 object 會被訪問參數字段的相關數據填充。 如果參數字段在任務 state 之外,則任務字段的值為 null。
這兩個陳述似乎暗示我試圖做的事情是不可能的。
所以,我想要的是這樣的:
{
"StartAt": "ExampleMapState",
"States": {
"ExampleMapState": {
"Type": "Map",
"ItemsPath": "$.items",
"ItemSelector": {
"dynamic.$": "$.dynamic",
"ContextIndex.$": "$$.Map.Item.Index",
"ContextValue.$": "$$.Map.Item.Value"
},
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "TestPass",
"States": {
"TestPass": {
"Type": "Task",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-west-2:123456789012:function:echo-lambda",
"Payload": {
"item.$": "$",
"token.$": "$$.Task.Token"
}
},
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"End": true
}
}
},
"End": true
}
}
}
但這不起作用,因為ItemSelector
覆蓋了內部 TestPass TestPass
的Payload
。有沒有辦法讓它工作?
ETA:我想我會嘗試將 $$.Task.Token 放在 ItemSelector 中,以防萬一它會神奇地工作,但最終會拋出錯誤,因為 $$.Task 在該級別的上下文 object 中不存在。
此(無效)配置的示例:
{
"StartAt": "ExampleMapState",
"States": {
"ExampleMapState": {
"Type": "Map",
"ItemsPath": "$.items",
"ItemSelector": {
"dynamic.$": "$.dynamic",
"ContextIndex.$": "$$.Map.Item.Index",
"ContextValue.$": "$$.Map.Item.Value",
"token.$": "$$.Task.Token"
},
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "TestPass",
"States": {
"TestPass": {
"Type": "Task",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-west-2:123456789012:function:echo-lambda"
},
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"End": true
}
}
},
"End": true
}
}
}
根據我的研究,我認為我正在嘗試做的事情是不可能的。 我最終實施的是一種解決方法。 我修改了 function 為這個步驟 function 提供輸入,將我需要的dynamic
信息放入我正在迭代的列表中的每個項目中。 所以我的步驟 function 定義現在看起來像這樣
{
"StartAt": "ExampleMapState",
"States": {
"ExampleMapState": {
"Type": "Map",
"ItemsPath": "$.items",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "TestPass",
"States": {
"TestPass": {
"Type": "Task",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-west-2:123456789012:function:echo-lambda",
"Payload": {
"item.$": "$",
"token.$": "$$.Task.Token"
}
},
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"End": true
}
}
},
"End": true
}
}
}
此步驟 function 的示例輸入如下所示:
{
"dynamic": "info",
"items": [
{
"dynamic": "info",
"resize": "true",
"format": "jpg"
},
{
"dynamic": "info",
"resize": "false",
"format": "png"
},
{
"dynamic": "info",
"resize": "true",
"format": "jpg"
}
]
}
這不是很好,因為我必須提前將信息重復到每個項目中,但它有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.