Используя AWS Step Functions, API Gateway и Lambda, запланируйте выполнение событий с определенной временной меткой без необходимости проведения опроса - опроса вообще нет!

Чрезвычайно распространенный вариант использования для множества приложений - необходимость иметь запланированные события. В основном есть два типа запланированных событий: одни запускаются как задания CRON, а другие должны запускаться в определенное время.

Задания CRON - это программные утилиты (обычно команды или сценарии оболочки), которые запускаются периодически в фиксированное время, дату или интервалы. Они могут быть разовыми или повторяющимися. С другой стороны, запланированные триггеры - это события, которые должны запускаться в очень конкретное время, для которого обычно ожидается динамическое или настраиваемое время в зависимости от ввода.

Наиболее распространенный подход к решению проблемы запланированного триггера - выполнение так называемого опроса. Опрос - это когда мы запускаем задание каждые x единиц времени и проверяем, является ли время выполнения текущим временем или оно уже прошло. Хотя это может работать для более простых и небольших вариантов использования, его чрезвычайно сложно масштабировать. Сразу видно, что точность этого задания зависит от интервала, на котором оно вызывается. Уменьшите разрыв, точнее и ближе к запланированному времени срабатывания функции. Но это влечет за собой проблему нерационального использования ресурсов и вычислительных мощностей, и, если задействована база данных, ненужные операции чтения из нее чрезвычайно часто.

Нам нужен способ, чтобы всякий раз, когда мы получаем событие с будущей отметкой времени выполнения, оно автоматически переходило в состояние WAITING и запускалось, когда отметка времени произошла без нашего вмешательства. К счастью, это именно тот вариант использования, для которого были созданы пошаговые функции, также известные как State Machines в облаке.

AWS Step Functions - это сервис визуального рабочего процесса с низким кодом, используемый для оркестровки сервисов AWS, автоматизации бизнес-процессов и создания бессерверных приложений. Рабочие процессы управляют сбоями, повторными попытками, распараллеливанием, интеграцией сервисов и наблюдаемостью, поэтому разработчики могут сосредоточиться на бизнес-логике более высокого уровня.

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

В этом руководстве используются Node.js и Serverless Framework, и для того, чтобы продолжить, вам потребуется установить Node.js и NPM в вашей системе. Наряду с этим убедитесь, что у вас также установлен глобально пакет serverless NPM. Если нет, выполните следующую команду и настройте пост-установку профиля AWS с помощью ссылки эта -

npm install -g serverless

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

Для начала нам нужно установить зависимость для пошаговых функций -

npm i --save-dev serverless-step-functions

Этот пакет позволяет нам использовать ключевое слово stepFunctions в нашем serverless.yml, которое после завершения настройки выглядит примерно так.

Давайте пройдемся по разделам в файле serverless.yml -

  • provider - содержит всю конфигурацию, касающуюся региона развертывания, облачного провайдера, деталей времени выполнения, стадии и т. д.
  • package - этот раздел содержит информацию о том, как наш код должен быть упакован и собран, а также включает параметры для индивидуальной упаковки в случае, если у вас несколько функций, параметры включения / исключения и т. д.
  • функции -

Здесь находится определение наших лямбда-функций. Ему нужно значение handler, чтобы указывать на файл в нашем каталоге. Существуют дополнительные параметры, такие как память, тайм-аут, retryAttempts, которые позволяют дополнительно настраивать наши лямбда-функции.

  • stepFunctions -

Это настраиваемое свойство, которое мы можем использовать благодаря ранее установленному пакету. В нем содержится определение нашей пошаговой функции, написанное на YAML. Объект events определяет триггеры для нашей функции Step, которая в нашем случае является запросом HTTP POST.

definition ступенчатой ​​функции содержит различные состояния и соединения ступенчатой ​​функции. Это происходит от языка Amazon States Language (ASL), который представляет собой JSON-подобный язык, используемый Amazon для определения пошаговых функций. Подробное описание, а также доступные состояния и варианты выбора можно найти здесь. Недавно Amazon запустил Workflow Studio, который представляет собой интерфейс перетаскивания, используемый для создания пошаговых функций, который во много раз упрощает процесс создания пошаговых функций, чем раньше.

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

Поскольку наше решение запускается с помощью запроса POST, как только мы отправляем запрос POST в конечную точку API Gateway с необходимыми данными, API Gateway пересылает эти данные в функцию Step. Затем функция Step перейдет в состояние START и вскоре перейдет в состояние WAITING и останется там до тех пор, пока не будет получена отметка времени, полученная в теле запроса POST. По достижении отметки времени функция Step переходит в следующее состояние, называемое ACTION, в котором срабатывает наша лямбда-функция, после чего функция Step переходит в состояние END, завершая, таким образом, цикл выполнения. Наша функция Step здесь зависит от конкретного параметра в теле запроса, называемого dueDate, который должен быть передан в запросе POST вместе с любыми другими данными, которые могут нам понадобиться.

curl --location --request POST 'https://...../execute' \
--header 'Content-Type: application/json' \
--data-raw '{ 
"dueDate": "2021-08-28T15:00:00Z", 
"data": { .... }
}'

dueDate параметр находится в формате UTC Timestamp и содержит дату и время события.

Чтобы развернуть все эти службы, просто запустите - serverless deploy из терминала и все! Ваше приложение развернуто, и после завершения развертывания в выводе консоли будет отображаться POST конечная точка.

Хотя это отличное решение, у этого подхода есть ограничения, которые очень хорошо освещены вместе с полезными показателями в следующем сообщении в блоге AWS Guru, Yan Cui:



И напоследок ссылка на готовый репозиторий кода -



Большое спасибо за то, что прочитали и дошли до этого места. Я надеюсь, что это поможет кому-то, кто в этом нуждается, и если да, обязательно помогите кому-то еще! Ваше здоровье!

использованная литература

[1] AWS Step Functions - https://aws.amazon.com/step-functions/?step-functions&step-functions

[2] Бессерверное планирование событий - https://medium.com/serverless-transformation/serverless-event-scheduling-using-aws-step-functions-b4f24997c8e2

[3] Бессерверные функции как специальный механизм планирования - https://blog.smirnov.la/step-functions-as-an-ad-hoc-scheduling-mechanism-ed1787e44bb1

[4] Вызов пошаговой функции из AWS Lambda - https://iamnoah1.medium.com/invoke-aws-step-function-from-aws-lambda-using-the-serverless-framework-21b7fde38a42