【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
}

以上。

← Posts