我正在尝试使用状态机语言中定义的 Parallel 和 Catch 块在我的步进函数流中添加错误处理。
以下是我的步骤功能的流程图:
因为我想要一个用于所有步进函数的通用错误处理程序,所以我将它们包装在一个 Parallel 块中,并添加了一个通用 Catch 块来捕获任何步进函数中的任何错误。在浏览各种示例和博客时,我遵循了这个链接并实现了类似的方法。
我观察到的是,每当任何状态引发异常时,控件都会进入 catch 块。catch 块的输入是引发的异常,该异常包含 JSON 对象中的错误和原因。由于我想要错误以及传递给该状态的输入,因此我在 catch 块中将ResultPath添加为“$.error”。以下是定义状态机的 JSON 规范。
{
"StartAt": "Try",
"States": {
"Try": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Step-1",
"States": {
"Step-1": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-1:1234:function:step-1-lambda",
"Next": "Step-2"
},
"Step-2": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.some_variable",
"StringEquals": "some_string",
"Next": "Step-3"
},
{
"Variable": "$.some_variable",
"StringEquals": "some_other_string",
"Next": "Step-4"
}
],
"Default": "Step-6"
},
"Step-3": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-1:1234:function:step-3-lambda",
"Next": "Step-6"
},
"Step-4": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-1:1234:function:step-4-lambda",
"Next": "Step-6"
},
"Step-6": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-1:1234:function:step-6-lambda",
"End": true
}
}
}
],
"Catch": [
{
"ErrorEquals": [
"States.ALL"
],
"ResultPath": "$.error",
"Next": "ErrorHandler"
}
],
"Next": "UnwrapOutput"
},
"UnwrapOutput": {
"Type": "Pass",
"InputPath": "$[0]",
"End": true
},
"ErrorHandler": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-1:1234:function:step-7-lambda",
"End": true
}
}
}
例如,考虑第 4 步生成异常。这个状态的输入是:
{
"foo": "abc",
"bar": "def"
}
触发状态机的输入是:
{
"boo": "jkl",
"baz": "mno"
}
在 ErrorHandler 中,当第 4 步生成异常时,我期望 ErrorHandler 状态的输入是:
{
"foo": "abc",
"bar": "def",
"error": {
"Error": "SomeError",
"Cause": "SomeCause"
}
}
但是,接收到的输入包含用于触发流的原始输入。
{
"boo": "jkl",
"baz": "mno",
"error": {
"Error": "SomeError",
"Cause": "SomeCause"
}
}
我需要访问导致 ErrorHandler 异常的状态的输入字段。使用“$”它提供用于触发流程的输入。有没有办法可以做到这一点?
任何帮助将不胜感激,我一直在努力解决这个问题。