Имеются ли в функциях шага AWS функция тайм-аута? - PullRequest
0 голосов
/ 01 ноября 2019

Сейчас у меня есть шаговая функция AWS для создания, запуска и завершения кластерных заданий EMR. Я хочу добавить функцию тайм-аута, чтобы остановить работу и завершить работу кластера в случае, если кластер завис или слишком долго запускается (например, передается входная переменная "TIMEOUT_AFTER_X_HOURS": 12 в конечный автомат вместе с конфигурациями кластера, которыеавтоматически остановит работу и уничтожит кластер, если он все еще будет работать через 12 часов). Кто-нибудь знает, как этого добиться?

1 Ответ

1 голос
/ 05 ноября 2019

К сожалению, вы не можете динамически указать время ожидания для состояния, но вы можете динамически определить состояние ожидания, как долго оно должно ждать. С учетом сказанного я бы порекомендовал вам использовать параллельное состояние с двумя ветвями и блоком перехвата. Первая ветвь содержит состояние ожидания и состояние отказа (ваше время ожидания). Другая ветвь содержит вашу обычную логику конечного автомата и состояние отказа.

Всякий раз, когда ветка выходит из строя в параллельном состоянии, она отменяет все запущенные состояния в других ветвях. К счастью, вы можете перехватить эти ошибки в параллельном состоянии и перенаправить их в другое состояние, в зависимости от того, какая ветвь не удалась. Вот пример того, что я имею в виду (измените значения в состоянии HardCodedInputs, чтобы указать, какая ветвь не работает).

{
"StartAt": "HardCodedInputs",
"States": {
    "HardCodedInputs": {
        "Type": "Pass",
        "Parameters": {
            "WaitBranchInput": {
                "timeout": 5,
                "Comment": "Change the value of timeout"
            },
            "WorkerBranchInput": {
                "SecondsPath": 3,
                "Comment": "SecondsPath is used for testing purposes to simulate how long the worker will run"
            }
        },
        "Next": "Parallel"
    },
    "Parallel": {
        "Type": "Parallel",
        "End": true,
        "Catch": [{
            "ErrorEquals": ["TimeoutExpired"],
            "ResultPath": "$.ParralelStateOutput",
            "Next": "ExecuteIfTimedOut"
        }, {
            "ErrorEquals": ["WorkerSuccess"],
            "ResultPath": "$.ParralelStateOutput",
            "Next": "ExecuteIfWorkerSuccesfull"
        }],
        "Branches": [{
                "StartAt": "DynamicTimeout",
                "States": {
                    "DynamicTimeout": {
                        "Type": "Wait",
                        "InputPath": "$.WaitBranchInput",
                        "SecondsPath": "$.timeout",
                        "Next": "TimeoutExpired"
                    },
                    "TimeoutExpired": {
                        "Type": "Fail",
                        "Cause": "TimeoutExceeded.",
                        "Error": "TimeoutExpired"
                    }
                }
            },
            {
                "StartAt": "WorkerState",
                "States": {
                    "WorkerState": {
                        "Type": "Wait",
                      "InputPath": "$.WorkerBranchInput",
                        "SecondsPath": "$.SecondsPath",
                        "Next": "WorkerSuccessful"
                    },
                    "WorkerSuccessful": {
                        "Type": "Fail",
                        "Cause": "Throw Worker Success Exception",
                        "Error": "WorkerSuccess"
                    }
                }
            }
        ]
    },
    "ExecuteIfTimedOut": {
        "Type": "Pass",
        "End": true
    },
    "ExecuteIfWorkerSuccesfull": {
        "Type": "Pass",
        "End": true
    }
 }
}
...