You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的输出数组:

  1. 在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"
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:04:57