如何在AWS Step Functions ASL中配置Lambda结果路径并保留原有数据
问题描述
向AWS Lambda传入的输入JSON:
{ "level1": { "level2_a": { "data1": "data1", "data2": "data2" }, "level2_b": 42 } }
Lambda执行后输出的Payload:
{ "Payload": { "data1": "data1_changed", "data2": "data2_changed" } }
需求:将level1.level2_a替换为Lambda输出的Payload内容,同时保留level1.level2_b,最终得到如下JSON:
{ "level1": { "level2_a": { "data1": "data1_changed", "data2": "data2_changed" }, "level2_b": 42 } }
尝试以下两种配置均未达到预期:
- 配置一:
"ResultSelector": { "$": "$.Payload" }, "ResultPath": "$.level1.level2_a"
- 配置二:
"ResultSelector": "$.Payload", "ResultPath": "$.level1.level2_a"
此前使用以下配置会丢失level2_b:
"ResultSelector": { "level2_a.$": "$.Payload" }, "ResultPath": "$.level1"
正确ASL配置方案
使用如下配置即可实现需求:
"LambdaTask": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "你的Lambda函数ARN", "Payload.$": "$" }, "ResultSelector": "$.Payload", "ResultPath": "$.level1.level2_a", "Next": "后续任务名称" }
配置说明
Parameters:将当前状态机的完整输入传递给Lambda函数,确保Lambda能获取到所需的原始数据。ResultSelector: 提取Lambda输出中的Payload部分,也就是更新后的data1和data2数据。ResultPath: 指定将提取的结果替换到原状态树的$.level1.level2_a节点,仅覆盖该节点,不会影响level1下的其他属性(如level2_b)。
如果你的Step Functions版本不支持直接用字符串路径作为ResultSelector,可以改用对象形式的ResultSelector:
"ResultSelector": { "data1.$": "$.Payload.data1", "data2.$": "$.Payload.data2" }, "ResultPath": "$.level1.level2_a"
内容的提问来源于stack exchange,提问作者Daniel Sapoundjiev
相关产品推荐
相关产品推荐

