Как получить выходные данные параллельного конечного автомата в функции AWS Step - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужно запустить функцию шага AWS, которая запускает параллельный конечный автомат, скажем, два конечных автомата.Мое требование состоит в том, чтобы проверить окончательное состояние выполнения параллельной машины и, если есть какой-либо сбой, вызвать службу SNS для отправки электронной почты.Довольно стандартные вещи, но я не могу понять, как отразить объединенную ошибку машины с параллельным шагом.Этот пример параллельной машины запускает

  1. «passtask», которая является простой функцией лямбда-прохода, и
  2. Запускает failtask с таймером ожидания в течение 5 секунд и, как предполагается, не работаетчерез 5 секунд.

Если я запускаю эту машину, эта машина правильно отображает passtask как выполненное успешно, failtask как отмененное, General Parallel Task как выполненное (?????), Notify Failure задача как отмененное и общее выполнениеконечный автомат так же "провалился".

Я бы хотел, чтобы passtask был выполнен успешно, сбойная задача как сбойная, общая параллельная задача как сбойная, уведомление о сбое завершилось успешно.

{
  "Comment": "Parallel Example",
  "StartAt": "Parallel Task",
  "TimeoutSeconds": 120,
  "States": {
    "Parallel Task": {
      "Type": "Parallel",
      "Branches": [
       {
         "StartAt": "passtask",
         "States": {
           "passtask": {
             "Type": "Task",
             "Resource":"arn:xxxxxxxxxxxxxxx:function:passfunction",
             "End": true
           }
         }
       },
       {
         "StartAt": "failtask",
         "States": {
           "failtask": {
             "Type": "Task",
             "Resource":"arn: xxxxxxxxxxxxxxx:function:failfunction",
             "End": true
           }
         }
       }
      ],
      "ResultPath": "$.status",
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "Notify Failure"
        }
      ],
      "Next": "Notify Success"
    },
    "Notify Failure": {
      "Type": "Pass",
      "InputPath": "$.input.Cause",
      "End": true
    },
    "Notify Success": {
      "Type": "Pass",
      "Result": "This is a fallback from a task success",
      "End": true
    }
  }
}

1 Ответ

0 голосов
/ 27 декабря 2018

Из вашего требования «Мое требование состоит в том, чтобы проверить окончательное состояние выполнения параллельной машины и, в случае какого-либо сбоя, вызвать службу 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
    }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...