Terraformではaws_cloudwatch_event_targetで既存のECSタスク定義から容易にタスクスケジューリングを実現できる。
このとき、タスク定義のARNにはリビジョンを含むことに注意。
Cloudwatch Eventsには terraform apply
時点のリビジョンで登録されてしまうので、常に最新のタスク定義で起動したい場合は replace
関数でリビジョン部分を外す。
resource "aws_cloudwatch_event_target" "ecs_scheduled_task" {
target_id = "run-scheduled-task-every-hour"
arn = aws_ecs_cluster.cluster_name.arn
rule = aws_cloudwatch_event_rule.every_hour.name
role_arn = aws_iam_role.ecs_events.arn
ecs_target {
task_count = 1
# リビジョンあり
# task_definition_arn = aws_ecs_task_definition.task_name.arn
# リビジョンなし ... ステータスが ACTIVE な最新のリビジョン
task_definition_arn = replace(aws_ecs_task_definition.task_name.arn, "/:\\d+$/", "")
}
input = <<DOC
{
"containerOverrides": [
{
"name": "name-of-container-to-override",
"command": ["bin/console", "scheduled-task"]
}
]
}
DOC
}
合わせてIAMポリシーにもリビジョンなしを追加しておく。
resource "aws_iam_role_policy" "ecs_events_run_task_with_any_role" {
name = "ecs_events_run_task_with_any_role"
role = aws_iam_role.ecs_events.id
policy = <<DOC
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ecs:RunTask",
"Resource": [
"${replace(aws_ecs_task_definition.task_name.arn, "/:\\d+$/", ":*")}",
"${replace(aws_ecs_task_definition.task_name.arn, "/:\\d+$/", "")}"
]
}
]
}
DOC
}
以上。