Запланированное Задание Aws Ecs С Использованием Terraform

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

К сожалению, пока (надеюсь, только пока) HashiCorp не добавила возможность управлять ими как ресурсом в терраформе.

Но есть способ обойти эту (надеюсь) временную проблему, используя набор сервисов, доступных в AWS, и дальше я расскажу, как я это сделал.

Решение, которое я нашел, — использовать события AWS Cloudwatch, которые запускают задачу AWS ECS, которая будет выполняться и завершаться.

Ссылка на репозиторий с шаблоном teraform: https://github.com/dark4igi/ecs-scheduled-task-using-terraform-example В своем примере я использую вариант Fargate для запуска контейнеров, потому что он проще.

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

  
   

#!/bin/sh jq --arg date "$(date)" --arg number "$(aws dynamodb scan --table-name "$TABLE" | jq .

Count)" '.

Id.N = ($number) | .

Value.S = ($date)' template.json > item.json && echo 'generation done' || echo 'generation false' aws dynamodb put-item --table-name "$TABLE" --item file://item.json && echo 'put done' || echo 'put false'

также файл template.json

{ "Id": { "N": "" }, "Value": { "S": "" } }

Dockerfile: загрузите скрипт и шаблон, добавьте разрешения на запуск скрипта, установите awscli и jq, CMD = script.sh При запуске контейнера вам необходимо передать в качестве аргумента имя таблицы DynamoDB. Для локального запуска вам также необходимо передать access_key и secret_key. Для корректной работы наших ресурсов в AWS нам необходимо создать роли для Cloudwatch Events, с возможностью запуска ECS таска и роль для таска, с возможностью работы с DynamoDB. Это описано в файлах infra.tf и data.tf. Infra.tf также описывает создание таблицы и кластера.

Нам также необходимо определение задачи для запуска задачи ECS, описание в том же файле.

Я использовал функцию terraform template_file, чтобы не прописывать имя таблицы в определении задачи.

Для начала нам также понадобится VPC, подсети и группа безопасности.

Я использовал стандартные, получение их идентификатора описано в data.tf. Ну и самое важное создание aws_cloudwatch_event_rule и aws_cloudwatch_event_target описано в Scheduled_task.tf. Для запуска и тестирования:

  1. git-клон
  2. Раскомментируйте и заполните раздел предоставления
  3. терраформирование инициализации
  4. применить терраформирование
Затем вы можете посмотреть логи в Cloudwatch /ecs/cron-worker и проверить содержимое таблицы DynamoDB. P.S.:
  • Решение представляет собой демо-версию и может иметь множество недостатков безопасности.

  • Это моя первая статья и тоже может быть куча ошибок.

Теги: #облачные сервисы #terraform #docker #Amazon Web Services #aws ecs #запланированная задача
Вместе с данным постом часто просматривают: