AWS Step Functions:如何将Lambda输出指定为顶层属性?
问题描述
我有一个返回JSON对象数组的Lambda函数,希望将其结果以指定属性名传入AWS Step Functions。
- 执行Lambda的任务输入:
{"foo": "abc", "bar": "def"}
- 期望输出:保留原有字段,并新增
lambdaOutput字段存储Lambda返回的数组
{"foo": "abc", "bar": "def", "lambdaOutput": [...]}
我尝试使用以下ResultSelector和ResultPath配置:
"ResultSelector": {"lambdaOutput.$": "$.Payload"}, "ResultPath": "$.lambdaOutput"
但生成了嵌套结构,想知道问题出在哪里?
问题原因与解决方法
问题原因
同时使用ResultSelector和ResultPath是导致嵌套的核心原因:
ResultSelector会先将Lambda的返回结果($.Payload)包装成{"lambdaOutput": [...]}的结构- 随后
ResultPath: "$.lambdaOutput"会把这个包装后的对象赋值给原输入的lambdaOutput字段
最终得到的结构会是{"foo":"abc", "bar":"def", "lambdaOutput": {"lambdaOutput": [...]}},也就是你看到的嵌套。
解决方法
方法一:仅使用ResultPath(推荐)
不需要ResultSelector,直接通过ResultPath指定Lambda结果的存储位置即可:
"ResultPath": "$.lambdaOutput"
该配置会直接把Lambda返回的$.Payload(即目标JSON数组)赋值给原输入的lambdaOutput字段,同时完整保留原输入的所有字段,最终输出完全符合你的期望。
方法二:结合ResultSelector使用(适用于需额外结果转换场景)
如果确实需要用ResultSelector做额外的结果处理,需将ResultPath设为"$",并在ResultSelector中手动声明所有要保留的原字段:
"ResultSelector": { "foo.$": "$.foo", "bar.$": "$.bar", "lambdaOutput.$": "$.Payload" }, "ResultPath": "$"
这种方式需要逐一列出原输入的所有字段,不如第一种方法简洁,仅在有特殊转换需求时使用。
内容的提问来源于stack exchange,提问作者Jeremy Fisher
相关产品推荐
相关产品推荐

