在Step Function中过滤输入数组并分流至不同状态的实现问询
问题:如何根据状态分流数组条目并跳转不同状态?
给定如下输入数组,能否将状态为FAILED的条目分流到一个状态,SUCCESS的条目分流到另一个状态?
[ { "Status": "SUCCESS", "Stack": "metadata" }, { "Status": "FAILED", "Stack": "metadata-roles" }, { "Status": "FAILED", "Stack": "master-storage" }, { "Status": "SUCCESS", "Stack": "appstream-storage" }, { "Status": "SUCCESS", "Stack": "capability-storage" }, { "Status": "SUCCESS", "Stack": "action-storage" }, { "Status": "SUCCESS", "Stack": "domain-action-storage" }, { "Status": "FAILED", "Stack": "auth0-clients" }, { "Status": "FAILED", "Stack": "ecr-repository" }, { "Status": "FAILED", "Stack": "ecr-replication" } ]
我考虑用Choice状态,但不确定是否支持这个功能。需求如下:
- 若所有条目都是
SUCCESS,则跳转至All succeed状态 - 若存在至少一个
FAILED条目,则跳转至Partially succeed状态,最好能把失败条目带入这个状态,不过这不是强制要求
解决方案
完全可以用Choice状态实现这个需求,步骤如下:
1. 筛选失败条目(可选,用于携带失败数据)
先通过Filter状态(以AWS Step Functions这类工作流服务为例)从输入数组里把所有Status为FAILED的条目筛选出来,存到$.FailedStacks路径下,后续跳转时就能直接拿到失败数据。
配置示例:
{ "Type": "Filter", "InputPath": "$", "ItemsPath": "$", "ResultPath": "$.FailedStacks", "Filter": { "Variable": "$.Status", "StringEquals": "FAILED" } }
如果不需要携带失败数据,这一步可以跳过,直接用Choice状态判断原数组中是否存在FAILED条目即可。
2. 用Choice状态做分支判断
接下来配置Choice状态,根据筛选出的失败条目数量做分支:
- 当
$.FailedStacks的长度大于0时,说明存在失败条目,跳转到Partially succeed状态,此时$.FailedStacks里就是所有失败的栈信息 - 当长度为0时,说明全部成功,跳转到All succeed状态
配置示例:
{ "Type": "Choice", "Choices": [ { "Variable": "$.FailedStacks.length", "NumericGreaterThan": 0, "Next": "Partially succeed" } ], "Default": "All succeed" }
3. 分流SUCCESS条目(可选)
如果需要单独处理SUCCESS条目,同样可以用Filter状态筛选出Status为SUCCESS的条目,存到$.SuccessStacks,在对应状态中使用即可。
内容的提问来源于stack exchange,提问作者rbasniak
相关产品推荐
相关产品推荐

