Нет, не всегда!

AWS Step Functions — это бессерверный сервис оркестровки, который помогает создать рабочий процесс с различными этапами, соединяющими разные сервисы AWS. Эти шаги определены в Машине состояний, которая будет реализована на Языке состояний Amazon (ASL).

В Step Functions есть два типа рабочих процессов:

  1. Экспресс поток
  2. Стандартный поток

Среди множества отличий экспресс-поток может работать только до пяти минут, а стандартный поток — до одного года.

Поскольку даже пять минут — это много, существует возможность активного выполнения при обновлении конечного автомата. В этой статье я собираюсь обсудить, как такие активные выполнения затрагиваются при обновлении конечного автомата и как обрабатывать эти сценарии.

Предположим, у нас есть простой конечный автомат с двумя лямбда-функциями следующим образом. Существует состояние «Ожидание» с трехминутным временем ожидания между вызовами Lambda.

Сценарий 1

Здесь мы запустим указанный выше конечный автомат, и пока идет активное выполнение, мы обновим конечный автомат, добавив третью лямбда-функцию после второй лямбда-функции.

В результате активное выполнение не затрагивается.

Причина в том, что когда инициализируется новое выполнение, пошаговая функция сохраняет «моментальный снимок» конечного автомата, и любые обновления конечного автомата не влияют на этот «моментальный снимок».

Сценарий 2

Здесь мы запустим конечный автомат, показанный на рис. 1, и на этот раз мы сохраним конечный автомат как есть, но обновим второй код функции Lambda.

В результате это влияет на активное выполнение.

Причина в том, что хотя Step Function сохраняет «моментальный снимок» конечного автомата в начале выполнения, ссылки на лямбда-функции в конечном автомате имеют свои ARN. Это последняя версия лямбды. Таким образом, если функции Lambda обновляются, это влияет на текущее выполнение, поскольку всегда ссылается на последнюю версию Lambda.

Как предотвратить изменения активных исполнений при обновлении лямбда-функций?

Для этого есть простое решение: использовать версии Lambda.

При развертывании создайте версию Lambda и в конечном автомате обратитесь к функции Lambda с версией в ARN.

Пример: arn:aws:lambda:[region]:[accountId]:function:[functionName]:[Version]

Примером такой реализации является этот фрагмент кода CDK.

Ранее (без версий Lambda):

Теперь (с версиями Lambda):

Заключение

При использовании лямбда-функций в пошаговых функциях используйте версии лямбда-функций, чтобы гарантировать, что никакие активные выполнения не затронуты обновлениями лямбда.

Напротив, если вам нужно обновить какие-либо активные выполнения последним кодом Lambda, не используйте версии функции Lambda.

Ресурсы

  1. Рабочие процессы AWS Step Functions Express и Standard: https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html
  2. Документация — язык штата Amazon:
    https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html
  3. Документация — State Machine:
    https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-state-machine-structure.html