如何使用 AWS Step Functions 将失败任务的输入和错误传递给回退任务?
How can I pass the input and error of my failing task to a fallback task using AWS Step Functions?
我正在尝试向我的步骤函数状态机添加一些错误处理,但我在特定情况下遇到了问题,例如,如果我在某个步骤中失败,我有一个捕获器可以将其发送到另一个函数,但在那个函数中我需要使用最后一步输入数据(失败的那个)执行逻辑,但是,我只是收到一个错误,有没有办法传递带有错误的输入数据?
Send Notification:
Type: Task
Resource: !GetAtt CommunicationSendCertifiedEmail.Arn
Retry:
- ErrorEquals:
- TierOneError
IntervalSeconds: 2
MaxAttempts: 9
BackoffRate: 1.5
- ErrorEquals:
- TierTwoError
IntervalSeconds: 4
MaxAttempts: 6
BackoffRate: 1.5
- ErrorEquals:
- TierThreeError
IntervalSeconds: 4
MaxAttempts: 3
BackoffRate: 2
- ErrorEquals:
- States.Timeout
- States.Runtime
- States.TaskFailed
- Lambda.ServiceException
IntervalSeconds: 4
MaxAttempts: 3
BackoffRate: 2
Catch:
- ErrorEquals:
- States.ALL
Next: Send Email Notification
关于“发送电子邮件通知”是我在执行失败之前需要输入的地方,但正如我之前所说,我只是得到这样的东西:
{
"Error": "Error",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
我想得到这样的东西:
{
"data": "{...}",
"Error": "Error",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
有什么想法吗?有可能吗?
在 Catch
中使用 ResultPath
将错误包含在原始输入中,而不是替换它。
ResultPath (Optional)
A path that determines what input is sent to the state specified in the Next field.
If you don't specify the ResultPath
field, it defaults to $
.
这会选择并覆盖 整个 输入以将其替换为状态输出(在这种情况下是一个错误),这就是您没有获得任何输入数据的原因通过。
这是一个示例 - 这不是您想要的,而是当前正在发生的事情:
指定 ResultPath
作为错误输出的位置。
这样,它会获取状态输出(在这种情况下是一个错误)并且将它包含在输入中。
这不会覆盖所有状态输入,这样您就可以保留输入。
这是一个例子 - 这就是你想要的:
尝试:
Catch:
- ErrorEquals:
- States.ALL
Next: Send Email Notification
ResultPath: $.error
如果前面的 Catch
语句捕获到错误,它将在 error
节点 中包含错误输出 状态输入(节点被称为 error
因为我们将路径指定为 $.error
).
这就像上面的第二个图。
例如,如果 发送通知 的状态输入是:
{
"foo": "bar"
}
发送到发送电子邮件通知的状态输出,当捕获错误时,将是以下内容。
{
"foo": "bar",
"error": {
"Error": "Error here"
}
}
它也可能是下面的,因为对象通常也包含 Cause
字段(就像你的情况一样)。该字段的值是人类可读的错误描述。
{
"foo": "bar",
"error": {
"Error": "Error here",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\"
}
}
重要提示:
根据您的输入数据为 error
节点选择一个唯一的名称,因为我刚刚使用 error
进行演示。
如果指定的节点已经存在,例如您已经有一个名称为 error
的字段,ResultPath
将 更新 并使用您不想要的错误输出覆盖节点。
一张图片胜过一千个字,所以这是使用 ResultPath
的第三条路径(同样,这不是您想要的):
如果你很好奇,最后一条可能的路径(与问题无关但很高兴知道)是丢弃状态结果(你需要它,因此它不相关)并保留原始输入。
将 ResultPath
设置为 null
可实现此目的,如 here 所述。
我正在尝试向我的步骤函数状态机添加一些错误处理,但我在特定情况下遇到了问题,例如,如果我在某个步骤中失败,我有一个捕获器可以将其发送到另一个函数,但在那个函数中我需要使用最后一步输入数据(失败的那个)执行逻辑,但是,我只是收到一个错误,有没有办法传递带有错误的输入数据?
Send Notification:
Type: Task
Resource: !GetAtt CommunicationSendCertifiedEmail.Arn
Retry:
- ErrorEquals:
- TierOneError
IntervalSeconds: 2
MaxAttempts: 9
BackoffRate: 1.5
- ErrorEquals:
- TierTwoError
IntervalSeconds: 4
MaxAttempts: 6
BackoffRate: 1.5
- ErrorEquals:
- TierThreeError
IntervalSeconds: 4
MaxAttempts: 3
BackoffRate: 2
- ErrorEquals:
- States.Timeout
- States.Runtime
- States.TaskFailed
- Lambda.ServiceException
IntervalSeconds: 4
MaxAttempts: 3
BackoffRate: 2
Catch:
- ErrorEquals:
- States.ALL
Next: Send Email Notification
关于“发送电子邮件通知”是我在执行失败之前需要输入的地方,但正如我之前所说,我只是得到这样的东西:
{
"Error": "Error",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
我想得到这样的东西:
{
"data": "{...}",
"Error": "Error",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
有什么想法吗?有可能吗?
在 Catch
中使用 ResultPath
将错误包含在原始输入中,而不是替换它。
ResultPath (Optional)
A path that determines what input is sent to the state specified in the Next field.
If you don't specify the ResultPath
field, it defaults to $
.
这会选择并覆盖 整个 输入以将其替换为状态输出(在这种情况下是一个错误),这就是您没有获得任何输入数据的原因通过。
这是一个示例 - 这不是您想要的,而是当前正在发生的事情:
指定 ResultPath
作为错误输出的位置。
这样,它会获取状态输出(在这种情况下是一个错误)并且将它包含在输入中。
这不会覆盖所有状态输入,这样您就可以保留输入。
这是一个例子 - 这就是你想要的:
尝试:
Catch:
- ErrorEquals:
- States.ALL
Next: Send Email Notification
ResultPath: $.error
如果前面的 Catch
语句捕获到错误,它将在 error
节点 中包含错误输出 状态输入(节点被称为 error
因为我们将路径指定为 $.error
).
这就像上面的第二个图。
例如,如果 发送通知 的状态输入是:
{
"foo": "bar"
}
发送到发送电子邮件通知的状态输出,当捕获错误时,将是以下内容。
{
"foo": "bar",
"error": {
"Error": "Error here"
}
}
它也可能是下面的,因为对象通常也包含 Cause
字段(就像你的情况一样)。该字段的值是人类可读的错误描述。
{
"foo": "bar",
"error": {
"Error": "Error here",
"Cause": "{\"errorType\":\"Error\",\"errorMessage\"
}
}
重要提示:
根据您的输入数据为 error
节点选择一个唯一的名称,因为我刚刚使用 error
进行演示。
如果指定的节点已经存在,例如您已经有一个名称为 error
的字段,ResultPath
将 更新 并使用您不想要的错误输出覆盖节点。
一张图片胜过一千个字,所以这是使用 ResultPath
的第三条路径(同样,这不是您想要的):
如果你很好奇,最后一条可能的路径(与问题无关但很高兴知道)是丢弃状态结果(你需要它,因此它不相关)并保留原始输入。
将 ResultPath
设置为 null
可实现此目的,如 here 所述。