我正在尝试使用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
值可用于此目的,但我不太理解语法
答案 0 :(得分:1)
终于能够正确使用语法。
"ItemsPath": "$.job-spec.array",
"Parameters": {
"byte_array.$": "$$.Map.Item.Value",
"file.$": "$.job-spec.file"
},
似乎Paramaters
可用于为每个阶段创建自定义输入。 $$
正在访问阶段的上下文,而不是实际的输入。似乎ItemsPath
接受了数组并将其放入一个上下文中,以便以后使用。