问题描述
在下面的简化 AWS Step Function 中,如果三个状态 foo1
、foo2
或 foo3
中的任何抛出错误,则状态 fooerr
将捕获错误。
我的问题是,如何通知 fooerr
哪个它正在捕获错误的状态?
(在这个例子中,所有四个 foo* 状态都调用了一个 lambda,所以我想将状态名称“foo2”和一个字符串文字(例如“foo2_literal”)传递给 fooerr
lambda if foo2
一个错误。)
例如,如果定义了状态 foo2
:
"foo2": {
"Type": "Task","Resource": "arn:aws:states:::lambda:invoke","Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:11111111111:function:foo2:$LATEST","Payload": {
"Input.$": "$"
}
},"Next": "foo3","Catch": [
{
"ErrorEquals": [
"States.ALL"
],"Next": "fooerr"
}
]
},
我在 Catch 中找不到任何用于插入将传递给 fooerr
的标识符字符串的语法示例。
同样,我看不到导致错误的状态如何/在哪里名称被传递给捕获的状态(fooerr)错误。
在此示例中,如果 foo2
中发生错误,我希望 foorerr
将标识符“foo2”和“foo2_literal_string”“发送”到 foo2
。
解决方法
不完全是您要找的,但我可以想到这 3 个替代方案:
- 您可以在
ResultPath
、foo1
和foo2
中使用不同的foo3
,例如对于foo1
使用:
"Catch": [
{
"ErrorEquals": [
"States.ALL"
],"ResultPath": "$.foo1-error","Next": "fooerr"
}
]
这样在 fooerr
中,您可以使用选择状态并检查 foo1-error
是否存在。
- 为每个状态(
foo1
、foo2
和foo3
)创建单独的错误捕获器。foo1
-catch->fooerr1
foo2
-catch-> fooerr2
foo2
-catch-> fooerr3
- 不要在 catch 块中使用
fooerr
作为Next
步骤,而是使用中间的另一个步骤来添加每个步骤所需的数据。所以创建这样的东西:
foo1
-catch-> foo1-with-error-data
-> fooerr
foo2
-catch-> foo2-with-error-data
-> fooerr
foo2
-catch-> foo2-with-error-data
-> fooerr