AWS Step Function:多Map状态下输入与输出的关联问题
如何在AWS Step Functions的两个Map状态间关联输入与对应输出?
输入数据
{ "input_array": ["blue", "green", "orange"] }
现有状态机配置
{ "StartAt": "Step One", "States": { "Step One": { "Type": "Map", "ItemsPath": "$.input_array", "ResultPath": "$.step_one_output", "Next": "Step Two", "Iterator": { "StartAt": "Find fruit matching colour", "States": { "FindFruitMatchingColour": { "Type": "Task", "Resource": "[some resource]", "End": true } } } }, "Step Two": { "Type": "Map", "ItemsPath": "$.step_one_output", "ResultPath": "$.step_two_output", "Next": "End", "Iterator": { "StartAt": "Do Thing With Colour And Its Fruit", "States": { "DoThingWithColourAndFruitCombination": { "Type": "Task", "Resource": "[some resource]", "End": true } } } }, "End": { "Type": "Succeed" } } }
需求目标
将Step One的输入(颜色)与其对应的输出(水果)关联,生成包含两者的对象数组传入Step Two,最终格式如下:
[ {"colour": "blue", "fruit": "blueberry"}, {"colour": "green", "fruit": "apple"}, {"colour": "orange", "fruit": "orange"} ]
已尝试方案及问题
- 曾在Map状态层级配置
ResultSelector,但无法访问单个迭代项,因为该层级处于整体输出数组的上下文:{ "ResultSelector": { "fruit.$": "$", "colour.$": "$$.Map.Item" } } - 尝试将两个步骤放在同一个Iterator中,仍无法实现单个输入与对应输出的关联。
- 考虑过添加独立步骤合并输入和Step One的输出,但担心输出顺序不可靠,导致颜色与水果匹配错误。
- 不愿修改现有Task资源,希望仅通过状态机配置完成需求。
可行解决方案
方案1:在Step One的Iterator内部关联输入与输出
直接在Iterator的Task步骤中配置ResultSelector,此时处于单个迭代项的上下文,可正常访问$$.Map.Item(当前迭代的输入颜色)。修改后的Step One配置如下:
"Step One": { "Type": "Map", "ItemsPath": "$.input_array", "ResultPath": "$.step_one_output", "Next": "Step Two", "Iterator": { "StartAt": "Find fruit matching colour", "States": { "FindFruitMatchingColour": { "Type": "Task", "Resource": "[some resource]", "ResultSelector": { "fruit.$": "$", "colour.$": "$$.Map.Item" }, "End": true } } } }
修改后,Step One的输出step_one_output即为需求中的关联对象数组,Step Two只需将ItemsPath设为$.step_one_output,即可直接传入包含colour和fruit的对象给后续Task。
方案2:通过Pass步骤合并输入与输出(保留原Step One逻辑)
AWS Step Functions的Map状态默认保持输入数组与输出数组的顺序一致,即使开启并行执行也不会打乱顺序。基于此,可添加Pass步骤合并原输入数组和Step One的输出数组:
- 在Step One之后、Step Two之前新增
Combine Input and Output步骤:
"Combine Input and Output": { "Type": "Pass", "Parameters": { "colours.$": "$.input_array", "fruits.$": "$.step_one_output" }, "ResultSelector": { "combined.$": "States.ArrayZip($.colours, $.fruits)" }, "ResultPath": "$.combined_data", "Next": "Step Two" }
- 修改Step Two的配置,将合并后的数组作为迭代源,并在Iterator中转换为目标对象格式:
"Step Two": { "Type": "Map", "ItemsPath": "$.combined_data", "ResultPath": "$.step_two_output", "Next": "End", "Iterator": { "StartAt": "Format Combined Data", "States": { "Format Combined Data": { "Type": "Pass", "Parameters": { "colour.$": "$[0]", "fruit.$": "$[1]" }, "Next": "Do Thing With Colour And Its Fruit" }, "DoThingWithColourAndFruitCombination": { "Type": "Task", "Resource": "[some resource]", "End": true } } } }
这里使用States.ArrayZip内置函数将两个数组按索引配对,生成二维数组,再在Step Two的Iterator中转换为包含colour和fruit的对象。
内容的提问来源于stack exchange,提问作者Liam T
相关产品推荐
相关产品推荐

