如何使用 AWS Step Functions 将失败任务的输入和错误传递给回退任务?

Jor*_*uez 3 error-handling amazon-web-services 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
Run Code Online (Sandbox Code Playgroud)

在“发送电子邮件通知”上,我需要在执行失败之前输入,但正如我之前所说,我只是得到这样的信息:

{
  "Error": "Error",
  "Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
Run Code Online (Sandbox Code Playgroud)

我想要得到这样的东西:

{
  "data": "{...}",
  "Error": "Error",
  "Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?有可能吗?

Erm*_*ary 8

使用ResultPathin aCatch将错误包含在原始输入中,而不是替换它。

结果路径(可选)

确定将哪些输入发送到“下一步”字段中指定的状态的路径。


如果不指定该ResultPath字段,则默认为$

这会选择并覆盖整个输入,以将其替换为状态输出(在本例中这是一个错误),这就是为什么您没有收到任何输入数据的原因。

这是一个例子 -这不是你想要的,但却是当前正在发生的事情

在此输入图像描述


指定ResultPath错误输出的位置。

这样,它将获取状态输出(在本例中这是一个错误)并将其包含在输入中。

这不会覆盖所有状态输入,这允许您保留输入。

这是一个例子 -这就是你想要的

在此输入图像描述


尝试:

Catch:
  - ErrorEquals:
    - States.ALL
    Next: Send Email Notification
    ResultPath: $.error
Run Code Online (Sandbox Code Playgroud)

如果前面的Catch语句捕获到错误,它将在状态输入内的error节点中包含错误输出(该节点被称为我们指定的路径)。error$.error

这与上面的第二个图类似。


例如,如果发送通知的状态输入是:

{
    "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

当捕获错误时,发送到Send Email notification的状态输出如下。

{
  "foo": "bar",
  "error": {
    "Error": "Error here"
  }
}
Run Code Online (Sandbox Code Playgroud)

它也可能是下面的内容,因为对象通常也包含该Cause字段(就像您的情况一样)。该字段的值是人类可读的错误描述。

{
  "foo": "bar",
  "error": {
    "Error": "Error here",
    "Cause": "{\"errorType\":\"Error\",\"errorMessage\"
  }
}
Run Code Online (Sandbox Code Playgroud)

重要的提示:

根据您的输入数据为节点选择一个唯一的名称error,正如我刚刚用于error演示目的的那样。

如果指定的节点已经存在,例如您已经有一个名为 name 的字段errorResultPath则将使用您的错误输出更新并覆盖该节点,这不是您想要的。

一张图片胜过一千个单词,所以这是使用 a 可能的第三条路径ResultPath(同样,这不是你想要的):

在此输入图像描述


如果您好奇,最后一条可能的路径(与问题无关,但很高兴知道)是丢弃状态结果(您需要它,因此它不相关)并保留原始输入。

设置ResultPathnull实现此目的,如此处所述