AWS Step Functions - 如何在捕获错误时忽略 "ResultSelector"?
AWS Step Functions - How to ignore "ResultSelector" when error is catched?
我有一个 AWS Step Functions 状态机,它作为第一个状态启动 Lambda 函数。这个函数做一些事情然后 returns 一个 JSON 像 { temp_a: "temporary a" }
。
这个输出应该被发送到这个状态机的第二个状态,但是,我不想发送 temp_a
作为键,而是我想重命名它 a
,所以第一个的结果状态应该是 { a: "temporary a" }
.
这很简单,可以使用 ResultSelector 完成。为此,Step Functions 将如下所示:
{
"StartAt": "State1",
"States": {
"State1": {
"Next": "State2",
"Resource": "arn:aws:lambda:eu-west-1:XXX:function:sfexample-LambdaFunction",
"ResultSelector": {
"a.$": "$.temp_a"
},
"Type": "Task"
},
"State2": {
"End": true,
"Type": "Pass"
}
}
}
而 Lambda 将是尽可能简单的东西,因为它只包含一条指令 return { temp_a: "temporary a" };
。
状态机启动后,一切正常,因为 temp_a
已成功 重命名 为 a
(感谢 ResultSelector
) 然后发送到 State2
。太棒了!
有时,Lambda 会抛出一个 CustomError
异常,我会在状态机中捕获该异常。当错误被捕获时,流程必须转移到状态 CustomErrorState
.
为了使事情成为可能,我在 State1
中添加了一个 Catch
语句,并添加了另一个状态 CustomErrorState
,类型为 Fail
。
{
"StartAt": "State1",
"States": {
"CustomErrorState": {
"Cause": "Error happens",
"Type": "Fail"
},
"State1": {
"Catch": [
{
"ErrorEquals": [
"CustomError"
],
"Next": "CustomErrorState"
}
],
"Next": "State2",
"Resource": "arn:aws:lambda:eu-west-1:XXX:function:sfexample-LambdaFunction",
"ResultSelector": {
"a.$": "$.temp_a"
},
"Type": "Task"
},
"State2": {
"End": true,
"Type": "Pass"
}
}
}
这似乎是合理的,但是当 Lambda 抛出 CustomError
时,我收到运行时错误,因为 State1
无法执行我在 ResultSelector
属性 中指定的内容。
什么意思?如果发现错误,我该如何处理结果?当我在某个状态下捕获错误时,可以忽略 ResultSelector's
指令吗?
更多详情:
Here 您可以获取所有必要的文件来测试您的帐户。
幸好今天遇到了同样的问题。我相信你必须做的是在你的代码中手动处理异常,没有办法忽略 ResultSelector
。如果代码失败,您必须 return 与您的代码相同 dict/json ,然后只有 SFN 将被完全执行。这是我尝试过的:
我有意引发异常以检查状态机的行为。
下面是我 运行 代码时状态机的执行:
问题已解决。请参阅下面的 post。
我已经 post 编辑了 same question on AWS discussion forum,表明该行为看起来像一个错误。他们确认了问题,事实上:
The "ResultSelector" field should only be applied to the successful
result of a Task, Map or Parallel State. In the case of a caught
error, "ResultSelector" should NOT be applied.
我是 Step Functions 的一名工程师,我想更新此 post 以通知您问题已得到解决。
ResultSelector 字段将不会应用于捕获的错误输出,之前的行为是一个错误。
感谢您提出这个问题。
我有一个 AWS Step Functions 状态机,它作为第一个状态启动 Lambda 函数。这个函数做一些事情然后 returns 一个 JSON 像 { temp_a: "temporary a" }
。
这个输出应该被发送到这个状态机的第二个状态,但是,我不想发送 temp_a
作为键,而是我想重命名它 a
,所以第一个的结果状态应该是 { a: "temporary a" }
.
这很简单,可以使用 ResultSelector 完成。为此,Step Functions 将如下所示:
{
"StartAt": "State1",
"States": {
"State1": {
"Next": "State2",
"Resource": "arn:aws:lambda:eu-west-1:XXX:function:sfexample-LambdaFunction",
"ResultSelector": {
"a.$": "$.temp_a"
},
"Type": "Task"
},
"State2": {
"End": true,
"Type": "Pass"
}
}
}
而 Lambda 将是尽可能简单的东西,因为它只包含一条指令 return { temp_a: "temporary a" };
。
状态机启动后,一切正常,因为 temp_a
已成功 重命名 为 a
(感谢 ResultSelector
) 然后发送到 State2
。太棒了!
有时,Lambda 会抛出一个 CustomError
异常,我会在状态机中捕获该异常。当错误被捕获时,流程必须转移到状态 CustomErrorState
.
为了使事情成为可能,我在 State1
中添加了一个 Catch
语句,并添加了另一个状态 CustomErrorState
,类型为 Fail
。
{
"StartAt": "State1",
"States": {
"CustomErrorState": {
"Cause": "Error happens",
"Type": "Fail"
},
"State1": {
"Catch": [
{
"ErrorEquals": [
"CustomError"
],
"Next": "CustomErrorState"
}
],
"Next": "State2",
"Resource": "arn:aws:lambda:eu-west-1:XXX:function:sfexample-LambdaFunction",
"ResultSelector": {
"a.$": "$.temp_a"
},
"Type": "Task"
},
"State2": {
"End": true,
"Type": "Pass"
}
}
}
这似乎是合理的,但是当 Lambda 抛出 CustomError
时,我收到运行时错误,因为 State1
无法执行我在 ResultSelector
属性 中指定的内容。
什么意思?如果发现错误,我该如何处理结果?当我在某个状态下捕获错误时,可以忽略 ResultSelector's
指令吗?
更多详情: Here 您可以获取所有必要的文件来测试您的帐户。
幸好今天遇到了同样的问题。我相信你必须做的是在你的代码中手动处理异常,没有办法忽略 ResultSelector
。如果代码失败,您必须 return 与您的代码相同 dict/json ,然后只有 SFN 将被完全执行。这是我尝试过的:
我有意引发异常以检查状态机的行为。
下面是我 运行 代码时状态机的执行:
问题已解决。请参阅下面的 post。
我已经 post 编辑了 same question on AWS discussion forum,表明该行为看起来像一个错误。他们确认了问题,事实上:
The "ResultSelector" field should only be applied to the successful result of a Task, Map or Parallel State. In the case of a caught error, "ResultSelector" should NOT be applied.
我是 Step Functions 的一名工程师,我想更新此 post 以通知您问题已得到解决。
ResultSelector 字段将不会应用于捕获的错误输出,之前的行为是一个错误。
感谢您提出这个问题。