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 で動作確認しました。