如何在AWS Step Functions的Map循环触发特定错误时中断执行
解决方案
方案1:利用Map状态容错配置实现中断(推荐)
AWS Step Function的Map原生支持通过失败容忍阈值控制整体执行行为,只需少量修改即可实现需求:
- 给Map节点配置
ToleratedFailureCount: 0,只要任意一个迭代抛出未被内部Catch处理的错误,整个Map会立刻终止所有未完成的迭代,整体进入失败状态 - 在Map节点外层新增Catch配置,捕获你自定义的中断错误,跳转到Map外的目标状态即可
- Iterator内部的BreakLoop保持Fail类型,抛出固定名称的自定义错误方便外层区分
修改后的状态机参考:
{ "StartAt": "Job", "States": { "Job": { "Type": "Map", "InputPath": "$.content", "ItemsPath": "$.data", "MaxConcurrency": 0, "ToleratedFailureCount": 0, "Iterator": { "StartAt": "Validate", "States": { "Validate": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val", "Catch": [ { "ErrorEquals": [ "ErrorOne" ], "Next": "BreakLoop" }, { "ErrorEquals": ["States.ALL"], "Next": "FailUncaughtError" } ] }, "FailUncaughtError":{ "Type": "Fail", "Error": "UncaughtError" }, "BreakLoop":{ "Type": "Fail", "Error": "LoopBreakSignal" } } }, "ResultPath": "$.content.data", "Catch": [ { "ErrorEquals": ["LoopBreakSignal"], "Next": "YourTargetStateOutsideMap", "ResultPath": "$.breakError" } ], "Next": "NormalProcessAfterAllIterationSuccess" }, "YourTargetStateOutsideMap": { "Type": "Pass", "End": true }, "NormalProcessAfterAllIterationSuccess": { "Type": "Pass", "End": true } } }
方案2:自定义循环实现
如果不想让Map进入失败状态,且迭代数量较少,可以放弃内置Map组件,自己通过计数器+Choice状态实现遍历:
- 提前把待遍历的数组放到输入参数里,同时新增
currentIndex计数器字段 - 每次迭代取
currentIndex对应的数组元素处理 - 处理完成后判断是否遇到中断信号,是则跳转到循环外;否则计数器+1,判断是否还有未处理元素,有则继续迭代,无则退出循环
内容的提问来源于stack exchange,提问作者Amor.o
相关产品推荐
相关产品推荐

