【Terraform】最新のECSタスク定義をCloudWatch Eventsで起動する

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

}

以上。

← Blog