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

События CloudWatch + Lambda

Это, вероятно, самый простой вариант, если ваш код можно упаковать как AWS Lambda и задание будет завершено в течение 15 минут (текущее ограничение по времени для вызова Lambda).

Для этого создайте Правило CloudWatch и выберите Расписание в качестве источника события. Вы можете использовать выражение cron или указать фиксированную скорость (например, каждые 5 минут).

Затем выберите «Лямбда-функция» в качестве цели. У вас должна быть возможность выбрать свою лямбду из раскрывающегося списка и даже указать собственный JSON в качестве входных данных для вызова функции лямбда.

Обычно я называю свои правила CloudWatch на основе их расписания (например, EVERY_15_MIN или MIDNIGHT_CST) и прикрепляю к ним несколько целей. Это помогает мне легко находить все задания, которые выполняются по определенному расписанию.

Запланированные задачи ECS

Этот вариант требует, чтобы код был упакован как контейнер Docker и не имеет временных ограничений, связанных с вызовами Lambda. В остальном он очень похож на параметр CloudWatch Events + Lambda.

Для этого вам нужно будет создать образ Docker и загрузить его в реестр контейнеров, такой как Amazon Elastic Container Registry (ECR) или Docker Hub.

Затем создайте определение задачи в Amazon Elastic Container Service (ECS), используя Fargate в качестве типа запуска. Определение задачи - это то место, где вы указываете параметры задачи - изображение, среду, команду и т. Д.

Вы также можете использовать Amazon Elastic Compute Cloud (EC2) в качестве типа запуска, если у вас уже есть работающий кластер ECS. Это было бы идеально, если у вас есть емкость кластера для выполнения задания. Но если это не вариант, Fargate позволит вам запускать контейнеры без управления серверами, и вы будете платить только за ресурсы (ЦП и память), которые использует задание.

Чтобы запланировать задание, вы можете использовать CloudWatch, как мы делали выше (просто выберите «Задача ECS» в качестве цели вместо Lambda). Вы также можете перейти в кластер «по умолчанию» в ECS (который создается для вас, когда вы впервые начинаете использовать ECS) и запланировать его на вкладке «Запланированные задачи». Этот второй вариант по-прежнему создает правило CloudWatch, но он упрощает создание из консоли ECS.

События CloudWatch + Lambda + EC2

Это отличный вариант, если вы не можете (или не хотите) упаковать свой код как контейнер Lambda или Docker и хотите использовать экземпляр EC2, который запускается и завершает работу по завершении задания.

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

Напомним, что для запуска Lambda используйте правило CloudWatch. Это запустит экземпляр EC2 с «пользовательскими данными», который будет содержать сценарий в кодировке Base64, который запускается на экземпляре при его запуске. Этот сценарий запустит задание и завершит работу экземпляра, как только оно будет выполнено.

Вот для этого Python Lambda, который использует спотовые экземпляры для дальнейшей экономии затрат на EC2…

А вот как можно завершить работу экземпляра из сценария оболочки Linux…

AWS Batch

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

На каждом этапе задания могут выполняться параллельно на нескольких узлах. AWS Batch заботится о планировании заданий, выделении необходимого ЦП и памяти для каждого задания, повторном запуске неудачных заданий и запуске следующего этапа, когда все задания предыдущего этапа выполнены успешно. По сути, это простой механизм рабочего процесса для пакетных заданий.

Однако для этого требуется, чтобы код был упакован как образ Docker, поскольку он использует кластеры ECS для выполнения заданий. Опять же, вы можете использовать CloudWatch в качестве механизма запуска для создания экземпляров заданий напрямую в AWS Batch. Вы также можете пройти через Lambda, которая может применять логику для разделения работы на несколько заданий.

Например, если вы пытаетесь обрабатывать файлы в Amazon Simple Storage Service (S3), ваша функция Lambda может просмотреть общее количество файлов, обработать их, а затем разделить их на части, чтобы создать экземпляры заданий в AWS Batch для каждого из них. кусок.

Следует отметить, что традиционные инструменты извлечения, преобразования, загрузки (ETL) обычно поставляются со своим собственным планировщиком заданий. Если вы используете эти инструменты (локально или AWS), по-прежнему имеет смысл использовать встроенный планировщик из-за его неотъемлемых преимуществ при выполнении заданий, которые являются родными для этого инструмента.

Здесь мы рассмотрели четыре способа выполнения периодических заданий с использованием собственных сервисов AWS, которые могут заменить традиционный сервер cron в локальных развертываниях. Я надеюсь, что это будет полезно, когда вы думаете о переносе своих заданий cron на AWS.