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 字段将不会应用于捕获的错误输出,之前的行为是一个错误。

感谢您提出这个问题。