terraformでecs serviceやecs taskをいい感じに管理することを考える

2024/12/22追記
ecs task definitionにtrack_latestが追加されたことにより、これで良くなりました。
本文
ecs serviceのlifecycleで ignore_changes = [task_definition]
を入れる?
ecs serviceのイニシャライズでecs service & ecs task definition を定義する必要がある。
が、ecs task definition とかは別の箇所にライフサイクルがあるパターン (e.g. terraform repoと app repoが分かれていて、app repoのCDで新しい ecs task definitionを作成するとか) があるある。
ここでecs serviceのlifecycleで ignore_changes = [task_definition]
を入れてもいいんだけど、terraform で管理している ecs task definition にdiffが出たりする(もしくはなんか別のアプローチをとってecs task definitionを黙らせるとか)。
もしくはインフラのイニシャライズ時にはecs task definition と ecs serviceを記述するけど、途中でecs task definition の記述を消して別の形でimportするとか。
その辺の辛みを解消するために aws_ecs_task_definition
に track_latest
というパラメータが追加された。
これをfalseにすることによって aws_ecs_task_definition が container_definitions
を追跡しなくなるので、例えばapp repoでtask definitionを書き換えられたとしてもdiffには出なくなる。

ただ、この状態でもterraform上では aws_ecs_service
の task_definition
パラメータが terraform に表記された古い aws_ecs_task_definition
を捕捉したままなので、 ignore_changes = [task_definition]
は必要。
そこで、 aws_ecs_service
の task_definition
パラメータの参照方法を工夫する。
data.aws_ecs_task_definition を定義することにより、最新のタスク定義を参照することができる。
data "aws_ecs_task_definition" "latest" {
task_definition = "app-task-definiton"
}
resource "aws_ecs_service" "main" {
name = var.service_name
cluster = var.cluster_arn
task_definition = data.aws_ecs_task_definition.latest.arn
lifecycle {
ignore_changes = [desired_count]
}
これで実態に即した矛盾しないterraform (途中でecs task definitionの記述を削除させたり)をキープできる