捕获异常后执行Cleanup的AWS Step Functions如何最终返回失败状态
解决方案
完全基于Step Functions原生能力实现,无需引入外部缓存,操作步骤如下:
1. 修改阶段1、阶段2的Catch块,存储错误标记
在原有Catch配置中新增ResultPath字段,将捕获到的错误信息存入状态机执行上下文的指定路径,不会覆盖原有输入数据:
"Catch": [ { "ErrorEquals": [ "States.ALL" ], "ResultPath": "$.error", "Next": "Cleanup" } ]
配置后只要阶段1或2触发异常,$.error字段就会写入错误详情,执行正常时该字段不存在。
2. 调整Cleanup阶段配置,传递错误状态给Batch任务
通过Step Functions的动态参数能力,将是否存在前置错误的标记作为参数传给Cleanup的Batch任务:
"Cleanup": { "Type": "Task", "Resource": "arn:aws:states:::batch:submitJob.sync", "Parameters": { "JobDefinition": "arn:aws:batch:<region>:<account>:job-definition/MyCleanupJob", "JobName": "cleanup", "JobQueue": "arn:aws:batch:<region>:<account>:job-queue/MyCleanupQueue", "ContainerOverrides": { "Command": [ "java", "-jar", "cleanup.jar", "--has-error.$": "States.ToString(States.IsPresent($.error))" ] } }, "Next": "CheckFinalState" }
说明:
- 参数名后缀
.$表示该值为动态解析的路径或内置函数 - 用内置函数
States.IsPresent($.error)判断是否存在前置错误,转成字符串后作为命令行参数传给jar包,你可以在cleanup.jar的代码中读取该参数做差异化逻辑处理 - 移除原有
End: true配置,改为跳转到后续的最终状态判断节点
3. 新增Choice状态控制最终执行结果
在Cleanup阶段后新增状态判断节点,根据是否存在错误标记返回对应最终状态:
"CheckFinalState": { "Type": "Choice", "Choices": [ { "Variable": "$.error", "IsPresent": true, "Next": "WorkflowFailed" } ], "Default": "WorkflowSucceeded" }, "WorkflowFailed": { "Type": "Fail", "Error": "PreviousStageFailure", "Cause": "阶段1或阶段2执行异常,已完成清理流程" }, "WorkflowSucceeded": { "Type": "Succeed" }
配置后流程逻辑为:
- 所有阶段执行正常:Cleanup完成后进入Succeed状态,最终状态为成功
- 阶段1/2执行异常:先完成Cleanup流程,再进入Fail状态,最终状态为失败,完全符合需求
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

