AWS Step Function错误处理求助:遇错后继续执行并传递Lambda输入
我之前刚好折腾过类似的需求,其实用Step Functions的错误捕获(Catch)加上ResultSelector配置就能完美解决,给你一步步说清楚:
核心思路
当Lambda状态出错时,通过Catch块捕获错误,然后强制将该状态的原始输入作为输出传递给下一个状态,这样就能保证流程继续执行,同时下一个状态拿到的内容和正常执行时一致(毕竟你说大多数Lambda输出和输入一致)。
具体配置示例
假设你有一个处理数据的Lambda状态ProcessData,出错后要跳转到FinalizeProcessing,配置如下:
{ "Comment": "出错时保留原始输入继续执行的状态机", "StartAt": "ProcessData", "States": { "ProcessData": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProcessDataFunction", "Next": "FinalizeProcessing", "Catch": [ { "ErrorEquals": ["States.ALL"], // 捕获所有类型的错误 "ResultSelector": { "$": "$" // 强制输出为当前状态的原始输入 }, "Next": "FinalizeProcessing" // 出错后和成功走同一个下一个状态 } ] }, "FinalizeProcessing": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FinalizeFunction", "End": true } } }
关键参数解释
ErrorEquals: 指定要捕获的错误类型,用States.ALL可以覆盖所有可能的错误(包括Lambda运行时异常、权限错误等),也可以指定具体的错误类型比如Lambda.ServiceException来精准捕获。ResultSelector: 这里的"$": "$"是核心——它告诉Step Functions,不管错误结果是什么,都把当前状态的原始输入($代表整个输入对象)作为输出传递给下一个状态。Next: 让出错后的跳转目标和成功时一致,确保流程不会中断。
可选扩展:保留错误信息
如果你需要同时保留原始输入和错误详情(方便后续排查),可以调整ResultSelector把错误信息附加到输入里:
"ResultSelector": { "originalInput": "$", "errorDetails": "$.error" }
这样下一个状态就能拿到包含原始数据和错误信息的对象了。
测试建议
你可以故意让ProcessDataFunction抛出一个异常(比如返回new Error("测试错误")),然后查看FinalizeProcessing的输入,确认是否是ProcessData状态的原始输入,以此验证配置是否生效。
内容的提问来源于stack exchange,提问作者naesmanak
相关产品推荐
相关产品推荐

