AWS Step Functions-捕获错误时如何忽略“ ResultSelector”?

问题描述

我有一个AWS Step Functions状态机,作为第一个状态,它启动了Lambda函数。该函数执行某些操作,然后返回JSON,例如{ temp_a: "temporary a" }。 此输出应发送到该状态机的第二个状态,但是,我不想将temp_a作为键发送,而是想将其重命名a,因此第一个结果状态应为{ a: "temporary a" }

这很简单,可以使用ResultSelector完成。为此,“步骤功能”将如下所示:

{
  "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

为了使事情变得可能,我在Catch添加一个State1语句,并添加一个类型为CustomErrorState的状态Fail

{
  "StartAt": "State1","States": {
    "CustomErrorState": {
      "Cause": "Error happens","Type": "Fail"
    },"State1": {
      "Catch": [
        {
          "ErrorEquals": [
            "CustomError"
          ],"Next": "CustomErrorState"
        }
      ],"Next": "State2","Type": "Pass"
    }
  }
}

这似乎是合理的,但是当Lambda抛出CustomError时,由于State1无法执行我在ResultSelector属性中指定的操作,我遇到了运行时错误

是什么意思?如果发现错误,我该如何处理结果?当我在某种状态下遇到错误时,可以忽略ResultSelector's指令吗?

更多详细信息: Here,您可以获取所有必要的文件以将其测试到您的帐户中。

解决方法

问题已解决。请参见下面的帖子。


我已经发布了same question on AWS discussion forum,表示该行为看起来像个错误。他们确认了这个问题,实际上:

“ ResultSelector”字段仅应应用于成功 任务,地图或并行状态的结果。在被抓住的情况下 错误,不应应用“ ResultSelector”。

,

我是Step Functions的工程师,并希望更新此信息,以使您知道该问题已解决。

ResultSelector字段将不会应用于捕获的错误输出,并且以前的行为是错误。

感谢您提出来。

,

幸运的是,今天我遇到了同样的问题。我相信您要做的是在代码中手动处理异常,无法忽略ResultSelector。如果失败,则必须从代码中返回相同的dict / json,只有SFN会被完全执行。这是我尝试过的: enter image description here

我故意提出一个异常来检查状态机的行为。

下面是我运行该代码时状态机的执行情况:

enter image description here