将数据传递给步进功能捕获

时间:2019-03-12 19:33:44

标签: amazon-web-services aws-lambda aws-step-functions

我正在AWS上使用步进功能。考虑由lambda组成的状态机:

"StartAt": "Metadata",
              "States": {
                    "Metadata": {
                    "Type": "Task",
                    "Resource": "${metadataArn}",
                    "Next": "StoreMetadata",
                    "Retry" : [
                            {
                                "ErrorEquals": [ "States.All" ],
                                "IntervalSeconds": 2,
                                "MaxAttempts": 3
                            }
                    ],
                    "Catch": [
                        {
                            "ErrorEquals": [ "States.All" ],
                            "Next": "ErrorHandler"
                        }
                    ]
                  } ...
                      ...

如何将特定数据传递给“ ErrorHandler”。例如,失败的步骤可能是一条数据。我正在使用nodejs,但可以推断到任何运行时。

例如,在节点中,我们可能有一个lambda,其中:

module.exports.handler = async input => {
  const ids = JSON.parse(input).ids
  // try to read in data for ids.
  // read fails / throws exception
}

如何让错误处理程序获取ID数组,以便将其标记为失败?如果此“ ErrorHandler”是多个步骤的陷阱,我如何知道哪些步骤失败了?

2 个答案:

答案 0 :(得分:0)

我想在@Zachscs 的答案中补充一点,在 "Catch" 上执行 "Type": "Map" 时需要小心,因为这样做并且执行 "ResultPath": "$.error",会抛出:< /p> <块引用>

无法将步骤“错误”应用于输入 [...]

这是有道理的,因为输入是一个数组。您可以通过向错误添加一个简单的从零开始的索引来解决它,如下所示:

"Type": "Map",
"Next": "Finish",
"Catch": [
  {
    "ErrorEquals": [ "States.All" ],
    "Next": "ErrorHandler",
    "Comment": "Note the $[0] down below",
    "ResultPath": "$[0].error"
  }
]

这会将它附加到数组 $[1].error 的第二个索引

答案 1 :(得分:0)

对于那些使用 AWS CDK 创建阶梯函数的人:

yourTask.addCatch(sendFailureNotify, {
  resultPath: '$.error'
});

其中 sendFailureNotify 是您的 lambda。而道具 resultPath? 是您设置 $.error

的地方
/**
 * Error handler details.
 */
export interface CatchProps {
    /**
     * Errors to recover from by going to the given state.
     *
     * A list of error strings to retry, which can be either predefined errors
     * (for example Errors.NoChoiceMatched) or a self-defined error.
     *
     * @default All errors
     */
    readonly errors?: string[];
    /**
     * JSONPath expression to indicate where to inject the error data.
     *
     * May also be the special value DISCARD, which will cause the error
     * data to be discarded.
     *
     * @default $
     */
    readonly resultPath?: string;
}