如何在AWS Step Functions的Map状态后调整输出为指定JSON结构?
调整AWS Step Functions MAP状态输出结构的方案
场景说明
我们有一个AWS Step Functions的MAP状态,输入结构如下:
{ "Id":"djhkjs", "Orders":["1","2","3"] }
MAP状态遍历Orders列表,通过Lambda为每个订单追加地址,执行完成后输出是一个订单对象数组:
[ { "Order": "1", "Address": "CA" }, { "Order": "2", "Address": "CA" }, { "Order": "3", "Address": "CA" } ]
现在需要将该输出转换成指定的JSON结构:
{ "ProcessedOrders": [ { "Order": "1", "Address": "CA" }, { "Order": "2", "Address": "CA" }, { "Order": "3", "Address": "CA" } ], "ID":"hjshjdhsj", "Name":"Services" }
方法1:用Pass状态重组输出
在MAP状态之后添加一个Pass状态,通过Parameters字段直接构建目标结构:
基础配置(固定ID和Name)
如果MAP状态的输出就是订单数组,Pass状态的配置如下:
{ "Type": "Pass", "Parameters": { "ProcessedOrders.$": "$", "ID": "hjshjdhsj", "Name": "Services" }, "End": true }
ProcessedOrders.$: "$" 直接引用MAP的输出数组,赋值给ProcessedOrders字段- 直接指定
ID和Name的固定值
保留原输入的Id值
如果需要把原输入中的Id(djhkjs)作为输出的ID,需要先在MAP状态中用ResultPath保留原输入:
{ "Type": "Map", "ItemsPath": "$.Orders", "ResultPath": "$.ProcessedOrdersTemp", // 其他MAP配置(比如迭代器、Lambda调用) }
此时MAP执行后,输入会保留原结构,同时新增ProcessedOrdersTemp存储订单数组。接着配置Pass状态:
{ "Type": "Pass", "Parameters": { "ProcessedOrders.$": "$.ProcessedOrdersTemp", "ID.$": "$.Id", "Name": "Services" }, "End": true }
方法2:用Lambda生成目标结构
在MAP状态之后新增一个Lambda任务,让Lambda直接处理MAP的输出并生成指定结构。
Python Lambda示例(固定值)
import json def lambda_handler(event, context): # event是MAP状态的输出数组 return { "ProcessedOrders": event, "ID": "hjshjdhsj", "Name": "Services" }
Python Lambda示例(动态获取原输入Id)
如果需要传递原输入的Id,可以在Step Functions中将原输入和MAP输出一起传入Lambda,代码调整为:
import json def lambda_handler(event, context): # event包含原输入的Id和MAP生成的订单数组 return { "ProcessedOrders": event["ProcessedOrdersTemp"], "ID": event["Id"], "Name": "Services" }
内容的提问来源于stack exchange,提问作者tejaswi
相关产品推荐
相关产品推荐

