簡體   English   中英

我可以使用迭代步驟使用 lambda:invoke.waitForTaskToken 的 ItemSelector 從 Map state 訪問 TaskToken 嗎?

[英]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 TestPassPayload 。有沒有辦法讓它工作?


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM