AWS Step Functions报错:无法应用ReferencePath $.output问题排查
AWS Step Functions Map迭代报错解决方案
问题原因
你的报错Unable to apply ReferencePath $.output to input "task_abc"本质是数据类型不匹配:
- 第一个Lambda返回的
taskArray.Payload是字符串数组(比如["task_abc", ...]),Map迭代时每个元素是纯字符串"task_abc",而非JSON对象。 - 你给第二个Lambda的
LambdaInvoke设置了resultPath: '$.output',Step Functions会尝试把Lambda的结果(因Lambda返回None,默认返回输入也就是字符串"task_abc")赋值给输入数据的output属性。但字符串没有属性,JSONPath无法在字符串上执行属性赋值操作,因此报错。
解决方案
根据你的需求,有三种可行方案:
方案1:不保留第二个Lambda的输出
如果不需要保存第二个Lambda的执行结果,直接移除resultPath配置(默认会替换整个输入),或者显式设置resultPath: null(丢弃结果,保留原输入):
this.stepTwoState = new LambdaInvoke(this, 'stepTwoState', { lambdaFunction: this.infra.stepTwoLambda, // 移除resultPath,或设为null });
方案2:将任务包装为JSON对象
修改第一个Lambda的输出,把任务字符串包装成JSON对象,比如:
// 原输出:["task_abc", "task_def"] // 修改后输出:[{"taskId": "task_abc"}, {"taskId": "task_def"}]
这样Map迭代时每个输入是对象,resultPath: '$.output'就能正常给对象添加属性。
方案3:在Map迭代前包装字符串输入
如果无法修改第一个Lambda的输出,可在LambdaInvoke的Parameters里把字符串包装成对象,让输入变成可操作的JSON结构:
this.stepTwoState = new LambdaInvoke(this, 'stepTwoState', { lambdaFunction: this.infra.stepTwoLambda, parameters: { "task.$": "$" // 把原字符串输入包装成{"task": "task_abc"} }, resultPath: '$.output' });
此时输入是对象,就能正常给$.output赋值。
关于你的疑惑
为什么无法给"$.output"赋值字符串?因为JSONPath的属性操作($.xxx)仅适用于JSON对象或数组。当输入是纯字符串时,它没有可扩展的属性,Step Functions无法完成赋值操作,因此抛出错误。
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

