无法在AWS Step Functions中捕获Lambda函数完整响应的问题
AWS Step Functions无法捕获Java Lambda完整响应体的问题
问题说明
使用AWS Step Functions状态机调用Java Lambda函数时,仅能捕获到状态码(如200),无法获取Lambda返回的完整JSON响应体。单独通过Postman测试Lambda时,可正常返回预期的JSON数据。
Lambda Java代码
public ResponseEntity<Object> fetchCertificateStatus() { String jsonData = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"; // 解析JSON为Java对象 Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class); return ResponseEntity.ok(person); }
Step Functions状态机配置
{ "Comment": "A description of my state machine", "StartAt": "Lambda Invoke", "States": { "Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:lambda:ap-southeast-2:72806977b", "ResultPath": "$.LambdaResponse", "End": true } } }
当前输出与预期结果
- 当前Step Functions输出:
{ "LambdaResult": 200 }
- 预期输出:
{ "name": "John", "age": 30, "city": "New York" }
已排查步骤
- 验证状态机中Lambda函数的ARN配置正确
- 确认Lambda单独调用可返回符合预期的JSON响应体
- 检查Lambda与Step Functions的CloudWatch日志,未发现错误信息
- 尝试修改
ResultPath为$.LambdaResult、$.LambdaResponseBody等,均未得到预期结果
解决方案
方案1:修改Lambda返回值类型
将Lambda的返回类型从ResponseEntity<Object>改为直接返回Person对象,Step Functions会直接捕获到序列化后的完整JSON数据:
public Person fetchCertificateStatus() { String jsonData = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"; Gson gson = new Gson(); return gson.fromJson(jsonData, Person.class); }
方案2:在Step Functions中提取响应体
若无法修改Lambda代码,可通过ResultSelector从Lambda返回的ResponseEntity结构中提取body内容。修改状态机配置如下:
{ "Comment": "A description of my state machine", "StartAt": "Lambda Invoke", "States": { "Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:lambda:ap-southeast-2:72806977b", "ResultSelector": { "LambdaResponse": "$.body" }, "ResultPath": "$.LambdaResponse", "End": true } } }
方案3:检查Lambda Handler配置
若使用Spring Cloud Function部署Lambda,需确保handler配置正确,避免ResponseEntity被额外包装。例如,handler应直接指向具体的函数方法,而非默认的包装类。
内容的提问来源于stack exchange,提问作者Muddu Madesh
相关产品推荐
相关产品推荐

