AWS Step Function传递到下一状态前如何覆盖输入字段?
结论
有内置语法可以直接实现该需求,不需要额外调用Lambda等外部服务,通过亚马逊状态语言(ASL)的内置能力即可完成names数组的批量字段更新。
实现方案
目前有两种常用的原生实现方式,你可以根据你的Step Functions版本选择:
方式1:使用States.JsonMap固有函数(推荐,代码最简洁)
Step Functions 2023年及之后推出的新版本支持States.JsonMap映射函数,可以直接在Parameters字段中完成数组转换,无需新增额外状态。示例配置如下:
// 状态C的Parameters配置示例 "Parameters": { // 遍历names数组,每个元素合并新的lastName字段 "names.$": "States.JsonMap($.names, function($item) { return States.JsonMerge($item, {\"lastName\": $.newLastName}, false) })" // 状态C需要的其他参数 }
参数说明:
States.JsonMap第一个参数为待遍历的names数组,第二个参数为逐元素执行的转换逻辑States.JsonMerge最后一个参数设为false,代表如果两个对象有同名字段,优先用第二个对象的属性值,刚好实现旧lastName的覆盖
方式2:使用内嵌Map状态(兼容性更好)
如果使用的是旧版本Step Functions,不支持States.JsonMap函数,可以在状态B和状态C之间新增一个内嵌Map状态完成批量更新,配置示例如下:
// 状态B的Next指向该UpdateLastNames状态,该状态执行完后跳转至C "UpdateLastNames": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "UpdateSingleName", "States": { "UpdateSingleName": { "Type": "Pass", "Parameters": { "firstName.$": "$.firstName", "lastName.$": "$.newLastName" }, "End": true } } }, "ItemsPath": "$.names", "ItemSelector": { "firstName.$": "$$.Map.Item.Value.firstName", "newLastName.$": "$.newLastName" }, "ResultPath": "$.names", "Next": "C" }
该方案不需要调用任何外部资源,所有逻辑都在Step Functions内部执行,性能损耗极低。
内容的提问来源于stack exchange,提问作者Yunhan Zou
相关产品推荐
相关产品推荐

