Из вашего требования «Мое требование состоит в том, чтобы проверить окончательное состояние выполнения параллельной машины и, в случае какого-либо сбоя, вызвать службу SNS для отправки электронной почты». Я понимаю, что «failtask» только для отладкицели и в будущем это не обязательно потерпит неудачу.Таким образом, проблема в том, что в тот момент, когда пошаговые функции обнаруживают сбой в ветви, все другие ветви завершаются, а их выходы отбрасываются, используется только выход отказавшей ветви.Поэтому, если вы хотите сохранить выходные данные каждой ветви и проверить, произошел ли сбой, вам нужно будет обработать ошибки в каждой ветви и не сообщать о всей ветви как о сбое.Кроме того, вам нужно будет добавить поле вывода в каждую ветвь, в котором будет указано, был ли сбой или нет (Choice State выдаст ошибку, если поле не существует).Также помните, что выходные данные ParralelState представляют собой массив с выходными данными каждой ветви, например, этот конечный автомат должен позволить каждой ветви завершить выполнение и правильно обрабатывать ошибки:
{
"Comment": "Parallel Example",
"StartAt": "Parallel Task",
"TimeoutSeconds": 120,
"States": {
"Parallel Task": {
"Type": "Parallel",
"Branches": [{
"StartAt": "passtask",
"States": {
"passtask": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXXXXXXX",
"Next": "SuccessBranch1",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "FailBranch1"
}]
},
"SuccessBranch1": {
"Type": "Pass",
"Result": {
"Error": false
},
"ResultPath": "$.Status",
"End": true
},
"FailBranch1": {
"Type": "Pass",
"Result": {
"Error": true
},
"ResultPath": "$.Status",
"End": true
}
}
},
{
"StartAt": "failtask",
"States": {
"failtask": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXXXXXXX",
"Next": "SuccessBranch2",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "FailBranch2"
}]
},
"SuccessBranch2": {
"Type": "Pass",
"Result": {
"Error": false
},
"ResultPath": "$.Status",
"End": true
},
"FailBranch2": {
"Type": "Pass",
"Result": {
"Error": true
},
"ResultPath": "$.Status",
"End": true
}
}
}
],
"ResultPath": "$.ParralelOutput",
"Catch": [{
"Comment": "This catch should never catch any errors, as the error handling is done in the individual Branches",
"ErrorEquals": ["States.ALL"],
"ResultPath": "$.ParralelOutput",
"Next": "ChoiceStateX"
}],
"Next": "ChoiceStateX"
},
"ChoiceStateX": {
"Type": "Choice",
"Choices": [{
"Or": [{
"Variable": "$.ParralelOutput[0].Status.Error",
"BooleanEquals": true
},
{
"Variable": "$.ParralelOutput[1].Status.Error",
"BooleanEquals": true
}
],
"Next": "Notify Failure"
}],
"Default": "Notify Success"
},
"Notify Failure": {
"Type": "Pass",
"End": true
},
"Notify Success": {
"Type": "Pass",
"Result": "This is a fallback from a task success",
"End": true
}
}
}
Что касается консолив отчете (состояние Parrarel Succeeded и не отображается ошибка в состоянии задачи), похоже, что консоль немного сломана, если вы обнаружите какую-либо ошибку в состоянии Parralel, она сообщит как об успешном, а также, если какая-либо из ваших ветвей потерпела неудачуне будет сообщать об этой ветви как сбой по некоторым причинам.Так что не беспокойтесь о том, что показывает консоль, и убедитесь, что поток работает правильно.Это можно проверить, заменив состояние задачи на FailState:
{
"Comment": "Parallel Example",
"StartAt": "Parallel Task",
"TimeoutSeconds": 120,
"States": {
"Parallel Task": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "passtask",
"States": {
"passtask": {
"Type": "Succeed"
}
}
},
{
"StartAt": "failtask",
"States": {
"failtask": {
"Type": "Fail"
}
}
}
],
"ResultPath": "$.status",
"Catch": [
{
"ErrorEquals": ["States.ALL"],
"Next": "Notify Failure"
}
],
"Next": "Notify Success"
},
"Notify Failure": {
"Type": "Pass",
"End": true
},
"Notify Success": {
"Type": "Pass",
"Result": "This is a fallback from a task success",
"End": true
}
}
}