Node.js下API Gateway调用Step Functions时Lambda任务数据传递故障求助
解决Step Functions任务2输入不匹配及空白响应问题
核心问题分析
任务1执行后,Step Functions默认会将其输出(APIGatewayProxyResult)作为任务2的输入,导致L2收到不符合预期的数据。同时空白响应是因为最终输出未满足API Gateway要求的APIGatewayProxyResult格式。
解决方案
场景1:任务串行执行(先L1后L2)
通过resultPath保留原始输入,避免被任务1的输出覆盖:
- 任务1配置:
"Task1": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "L1", "Payload.$": "$" // 传入原始APIGatewayProxyEvent }, "ResultPath": "$.task1Result", // 将L1输出存入task1Result字段,原始输入保留在根节点 "Next": "Task2" }
- 任务2配置:
"Task2": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "L2", "Payload.$": "$" // 根节点仍为原始APIGatewayProxyEvent }, "ResultPath": "$.task2Result", "Next": "AggregateAndFormat" }
场景2:任务并行执行(更高效的方案)
使用Parallel状态,让两个任务直接读取原始输入:
"ParallelTasks": { "Type": "Parallel", "Branches": [ { "StartAt": "Task1", "States": { "Task1": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "L1", "Payload.$": "$" }, "End": true } } }, { "StartAt": "Task2", "States": { "Task2": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "L2", "Payload.$": "$" }, "End": true } } } ], "Next": "AggregateAndFormat" }
聚合结果并格式化响应
无论串行还是并行,最后需要将结果整合为API Gateway可识别的格式:
串行场景的聚合配置:
"AggregateAndFormat": { "Type": "Pass", "Parameters": { "statusCode": 200, "body.$": "States.Stringify({\"task1\": $.task1Result.Payload, \"task2\": $.task2Result.Payload})" }, "End": true }
并行场景的聚合配置:
"AggregateAndFormat": { "Type": "Pass", "Parameters": { "statusCode": 200, "body.$": "States.Stringify({\"task1\": $[0].Payload, \"task2\": $[1].Payload})" }, "End": true }
关键注意事项
- 所有任务的
Payload.$必须指向原始输入($),确保L1和L2都收到APIGatewayProxyEvent - 串行执行时,
resultPath不能设为$(会覆盖原始输入),需指定子字段存储任务输出 - 最终输出必须包含
statusCode和body字段,否则API Gateway会返回空白响应
内容的提问来源于stack exchange,提问作者arun karthick
相关产品推荐
相关产品推荐

