You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

捕获异常后执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:09:02