Передача данных в перехватчик пошаговой функции

#amazon-web-services #aws-lambda #aws-step-functions

#amazon-веб-сервисы #aws-lambda #aws-step-функции

Вопрос:

Я использую пошаговые функции в AWS. Рассмотрим конечный автомат, состоящий из лямбд:

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

Как я могу передать определенные данные в «обработчик ошибок». Например, завершившийся ошибкой шаг, возможно, фрагмент данных. Я использую nodejs, но могу экстраполировать на любую среду выполнения.

Например, в node у нас может быть лямбда-выражение, где:

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

Как я могу заставить обработчик ошибок получить массив идентификаторов, чтобы я мог пометить их как сбойные? если этот «ErrorHandler» является перехватом для нескольких шагов, как я могу узнать, какие шаги завершились неудачей?

Ответ №1:

Я нашел ответ, который вы можете использовать ResultPath для передачи исходного ввода вместе с ошибкой. Полагаю, я включу step как свойство во все входные данные, чтобы я мог знать, какой шаг не удался. Смотрите документы для объяснения. По сути, для достижения этой цели вам просто нужно добавить ResultPath свойство следующим образом:

 "Catch": [
  {
    "ErrorEquals": [ "States.All" ],
    "Next": "ErrorHandler"
    "ResultPath": "$.error"
  }
]
  

Комментарии:

1. Вы спасаете жизнь! <3

2. Вы только что избавили меня от 4-х часовой отладки! Огромный реквизит!

Ответ №2:

Я хотел добавить к ответу @Zachscs, что вам нужно быть осторожным при выполнении "Catch" on "Type": "Map" , так как это и выполнение «ResultPath»: «$.error», приведет к:

Не удается применить «ошибку» шага для ввода […]

Это имеет смысл, поскольку входными данными является массив. Вы решаете эту проблему, добавляя простой индекс на основе нуля к ошибке, подобной этой:

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

Это добавит их ко второму индексу массива $[1].error

Ответ №3:

И для тех, кто использует AWS CDK для создания функции step:

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

где sendFailureNotify — это ваш лямбда-код. А реквизит 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;
}
  

Комментарии:

1. Отлично! Рад видеть, что кто-то продолжил реализацию CDK