У меня проблема с рабочим процессом с пошаговыми функциями aws. Я определил несколько состояний и хотел добавить к ним обработку ошибок. Проблема в том, что для любой ошибки функции (возникшее исключение, отклонение необработанного обещания или ошибки кода) конечный автомат всегда получает LambdaFunctionSucceeded и продолжает выполнение до тех пор, пока не завершится последнее состояние.
Вот пример определения конечного автомата, я не предоставляю собственное определение, потому что для этого примера оно слишком сложно.
{
"Comment": "Example state machine",
"StartAt": "State1",
"States": {
"State1": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-2:123456789012:function:State1Function",
"Next": "Finish",
"ResultPath": "$.State1Result",
"Catch": [
{
"ErrorEquals": [
"States.TaskFailed"
],
"Next": "Failure"
}
]
},
"Failure": {
"Type": "Fail",
"Error": "$"
},
"Finish": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-2:123456789012:function:FinishFunction",
"End": true,
"Catch": [
{
"ErrorEquals": [
"States.TaskFailed"
],
"Next": "Failure"
}
]
}
}
}
State1Function пример:
module.exports = async event => {
not().defined; // but execution does not fail
// do stuff
};
Я тестирую его в локальной среде, используя sam local start-lambda
и amazon/aws-stepfunctions-local
образ докера. Вывод sam
для выполнения State1Function:
2019-11-19T08: 37: 40.910Z b2421c61-d31c-1482-6a65-f6cbd42328a7 ERROR Ошибка вызова {"errorType": "ReferenceError", "errorMessage": "not is not defined", "stack": ["ReferenceError: not не определено "," в Runtime.module.exports [как обработчик] (/var/task/path/to/state1function.js:7:5) "," в Runtime.handleOnce (/ var / runtime / Runtime. js: 66: 25) "]}
Вывод из контейнера amazon/aws-stepfunctions-local
(который обрабатывает выполнение конечного автомата):
2019-11-19 08: 37: 41.348: arn: aws: состояния: eu-west-2: 123456789012: выполнение: test: test4: {"Тип": "LambdaFunctionSucceeded", "PreviousEventId": 4, "LambdaFunctionSucceededEventDetails": {"Вывод": "{\" errorType \ ": \" ReferenceError \ ", \" errorMessage \ ": \" не не определено \ "}"}}
Казнь продолжалась.
Когда я остановил sam local start-lambda
и конечный автомат не смог вызвать одну из пошаговых функций, результат был таким:
2019-11-19 08: 37: 53.406: arn: aws: состояния: eu-west-2: 123456789012: выполнение: test: test4: {"Тип": "LambdaFunctionFailed", "PreviousEventId": 23, "LambdaFunctionFailedEventDetails": {"Ошибка": "Lambda.SdkClientException", "Причина": "Невозможно выполнить HTTP-запрос: целевой сервер не ответил"}}
Тогда казнь не удалась. Я ожидал бы аналогичного поведения при ошибках пошаговой функции.
Как правильно справляться со сбоями ступенчатой функции?