#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