ECSでタスクスケジューリングする時に最新のrevisionのタスク定義を参照する方法


ECS環境(Fargate含む)でバッチを動かす場合の選択肢として、ECSのScheduleTask機能を使う方法があります。
この方法で、常に最新のtask定義(task_definitions)の最新を参照する方法について説明します。

ECSのタスクスケジューリング機能について

Amazon ECS タスクのスケジューリング - Amazon Elastic Container Service
Amazon ECS ScheduledTaskで実現するスマートなDockerベースのバッチ実行環境 - コネヒト開発者ブログ
AWS ECSを使ったバッチサーバ環境を試してみる - Qiita

ECSでバッチを動かす場合、いくつか選択肢がありますが、ECSのScheduleTask(スケジューリング)機能が便利です(詳しくは上記をリンクを参照ください)。ScheduleTaskを使うと、cron的に定期的にタスクを立ち上げて、定期的に処理を実行する事ができます。

このScheduleTaskはECSと統合されていますが、実際にはAmazon EventBridgeのrule機能になります。さらに、Amazon EventBridgeは、CloudWatch Eventsという名前だったもので、まだCloudWatch のコンソール画面から操作が可能です。

最新を参照する@AWSコンソール画面

画面でいうとここで「最新」を選べば、起動時に最新のrevisionのtask_definitions(タスク定義)を使って、タスクが起動します。

が、ここで一つ罠がありまして、前述の通り、

ECSのスケジューリング機能 ≒ Amazon EventBridge ≒ CloudWatch Events

でして(≒の表現は誤解を招きそうですがこの記事の趣旨では無いので軽くスルーしてください)、同じ設定が、

  • ECS
  • EventBridge
  • CloudWatch

の3画面で可能となっています。

この3画面のうち、ECSの画面から追加しようとした場合は、「最新」の選択肢がでてきません。残念。

というわけで、EventBridgeかCloudWatchの画面から作成する必要があります。

おそらくそのうち対応されると思いますがご注意ください。

最新を参照する@terraform

terraformだとこのようになります(抜粋なのでこのままじゃ動かないかも)。
resourcの名前はcloudwatchなので注意が必要です。

resource "aws_cloudwatch_event_rule" "rule" {
  name = "name"
  schedule_expression = "cron(30 * * * ? *)"
}

resource "aws_cloudwatch_event_target" "target" {
  target_id = "name"
  rule      = aws_cloudwatch_event_rule.rule.name
  arn       = aws_ecs_cluster.main.arn 

  ecs_target {
    launch_type      = "EC2"
    task_count       = 1
    task_definition_arn = "arn:aws:ecs:ap-northeast-1:XXXXXXXX:task-definition/name" # ここがポイント
  }
}

ポイントは、task_definition_arnでして、ここでrevisionを指定しなければ、画面で「最新」を選んだことになります。

revisionを指定する場合は

arn:aws:ecs:ap-northeast-1:XXXXXXXX:task-definition/name:15

のようになります。

補足

Terraform v0.13.5 で動作確認しました。