Всем привет. Не так давно в AWS добавили новую возможность запуска задачи по расписанию, что, на мой взгляд, является очень удобной функцией для выполнения некоторых задач.
К сожалению, пока (надеюсь, только пока) HashiCorp не добавила возможность управлять ими как ресурсом в терраформе.
Но есть способ обойти эту (надеюсь) временную проблему, используя набор сервисов, доступных в AWS, и дальше я расскажу, как я это сделал.
Решение, которое я нашел, — использовать события AWS Cloudwatch, которые запускают задачу AWS ECS, которая будет выполняться и завершаться.
Ссылка на репозиторий с шаблоном teraform: https://github.com/dark4igi/ecs-scheduled-task-using-terraform-example В своем примере я использую вариант Fargate для запуска контейнеров, потому что он проще.
Также задача, которую необходимо выполнить, — это чтение таблицы DynamoDB и добавление не новой записи со следующим Id и временем запуска контейнера, как по мне это отличный и понятный пример, не требующий уникального имени типа S3. Вот пример кода, который необходимо выполнять по расписанию.
также файл template.json#!/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'
{
"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. Для запуска и тестирования:
- git-клон
- Раскомментируйте и заполните раздел предоставления
- терраформирование инициализации
- применить терраформирование
- Решение представляет собой демо-версию и может иметь множество недостатков безопасности.
- Это моя первая статья и тоже может быть куча ошибок.
-
Эмоциональное Облегчение
19 Oct, 24 -
У Бак Проблемы С Электричеством
19 Oct, 24 -
Новые Уловки Блогспамеров
19 Oct, 24