在AWS Step Function中将多个输入传递到Map State

时间:2019-12-03 03:43:06

标签: amazon-web-services aws-lambda aws-step-functions

我正在尝试使用AWS Step Functions通过Lambda触发非常大的S3文件的操作。为此,我要使用具有文件S3键的输入和该文件的字节范围来调用步进函数(每个并行迭代将在文件的不同部分上进行操作)。输入看起来像

{
  "job-spec": {
    "file": "some_s3_key",
    "array": [
      "0-100",
      "101-200",
      "201-300", ...
    ]
  }
}

我的Step函数非常简单,接受输入并将其映射出来,但是我似乎无法同时获取文件和数组作为lambda的输入。这是我的步进函数定义

{
  "Comment": "An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2.",
  "StartAt": "Map",
  "States": {
    "Map": {
      "Type": "Map",
      "ItemsPath": "$.job-spec",
      "ResultPath": "$.array",
      "MaxConcurrency": 2,
      "Next": "Final State",
      "Iterator": {
        "StartAt": "My Stage",
        "States": {
          "My Stage": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "arn:aws:lambda:us-east-1:<>:function:some-lambda:$LATEST",
              "Payload": {
                "Input.$": "$.array"
              }
            },
            "End": true
          }
        }
      }
    },
    "Final State": {
      "Type": "Pass",
      "End": true
    }
  }
}

如上所述,它抱怨job-spec不是ItemsPath的数组。如果将其更改为$.job-spec.array,则会得到我正在寻找的array,但key丢失了。我试着用|将两者结合在一起但我在“步骤函数”中可以传递的数据量达到了极限

基本上,我希望每个python lambda都获得文件密钥,并从数组中获得一个条目

看起来Parameters值可用于此目的,但我不太理解语法

1 个答案:

答案 0 :(得分:1)

终于能够正确使用语法。

      "ItemsPath": "$.job-spec.array",
      "Parameters": {
        "byte_array.$": "$$.Map.Item.Value",
        "file.$": "$.job-spec.file"
      },

似乎Paramaters可用于为每个阶段创建自定义输入。 $$正在访问阶段的上下文,而不是实际的输入。似乎ItemsPath接受了数组并将其放入一个上下文中,以便以后使用。