Terraformを使って常に最新のタスク定義でECS Scheduled Taskを実行する

ターゲットにはリビジョン番号無しのタスク定義のARN指定が可能です

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部トクヤマシュンです。

ECS Scheduled TaskをTerraformで構築する機会がありました。
その際、常に最新のタスク定義を指定するよう設定するのに少しハマったので、本エントリによって情報発信します。

はじめに結論

ecs_targetのtask_definition_arnにリビジョン番号無しのタスク定義のarnを指定しましょう。

どこがハマりどころなのか?

コンソール画面からECS Scheduled Taskを設定する際は、EventBridgeの設定画面で常に最新版を実行するかどうか選択できます。

しかし、Terraformでは本設定を選択できるような項目はありません
どのようにすれば、常に最新版を実行することができるのか分からず、少しハマりました。

解決策

答えは、タスク定義のARNを指定する際、リビジョン番号無しにするでした。
下にEventBridgeのルールとECS Scheduled Taskのターゲットを作成するTerraformテンプレートの例を示します。

resource "aws_cloudwatch_event_rule" "test_ecs_scheduled_task_event_rule" {
  name                = "test-ecs-scheduled-task-event-rule"
  schedule_expression = "cron(0-59/5 * * * ? *)"
  is_enabled          = true
}

resource "aws_cloudwatch_event_target" "test_ecs_scheduled_task_target" {
  target_id = "test-ecs-scheduled-task-target"
  rule      = aws_cloudwatch_event_rule.test_ecs_scheduled_task_event_rule.name
  arn       = <タスクを実行するECS ClusterのARN>
  role_arn  = <ECS Scheduled Taskを実行するためのRoleのARN>
  ecs_target {
    // リビジョン番号なしのARNを指定
    task_definition_arn = "arn:aws:ecs:ap-northeast-1:<アカウントID>:task-definition/test-ecs-scheduled-task"
    task_count          = "1"
    launch_type         = "FARGATE"
    platform_version    = "1.4.0"
    network_configuration {
      assign_public_ip = false
      security_groups  = [ <タスクに割り当てるSecurity GroupのID> ]
      subnets          = [ <タスクを起動するサブネットのID> ]
    }
  }
}

このように、ecs_targetのtask_definition_arnにリビジョン番号なしのARNを指定することで、最新のタスク定義を実行することができます。
なお、リビジョン指定して実行したい場合はARNの最後に:リビジョン番号をつけましょう。

試してみる

いくつかの変数を環境に合わせて修正した後、実際にTerraformテンプレートを実行してECS Scheduled Taskを作成しました。
タスク定義にはリビジョン指定のないARNが登録されています。

この状態で編集ボタンを押すと、常に最新のタスク定義リビジョンを実行するようになっていることが確認できます。

実際に最新のタスク定義を実行するのか、動作を確認してみます。

まず、Batch Scheduled Taskの初回実行を確認します。
タスク定義test-ecs-scheduled-taskのリビジョン1が実行されています。

ここで、タスク定義test-ecs-scheduled-taskを更新し、リビジョン2を作成します。

その後、Batch Scheduled Taskの2回目の実行を確認します。
タスク定義test-ecs-scheduled-taskのリビジョン2が実行されており、常に最新のリビジョン番号が実行されていることが分かります。

以上のように、Terraformでも、常に最新のタスク定義を実行するよう指定ができることが確認できました。

趣味のスパイスカレー

私の趣味はスパイスカレー作りで、ブログに投稿していってます。
相変わらずAWSには全然関係ありませんが、お付き合いいただけますと幸いです。

  • チキンドピアザ

玉ねぎがたっぷり入ったチキンカレーです。
インドでは「ド」が2、「ピアザ」が玉ねぎの意味で、ベースの玉ねぎと煮込み用の玉ねぎを2回いれて作るチキンカレーです。
その分手間暇はかかりましたが、玉ねぎの甘味・旨味がしっかりと感じられる、とても美味しいカレーでした!

最後に

Terraformを使って常に最新のタスク定義でECS Scheduled Taskを実行しました。
本ブログによってやり方が分からずハマってしまう人を一人でも無くせたら幸いです。