Open2

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

2357gi2357gi

2024/12/22追記

ecs task definitionにtrack_latestが追加されたことにより、これで良くなりました。
https://dev.classmethod.jp/articles/aws-ecs-task-definition-supports-track-latest-args/

本文

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_definitiontrack_latest というパラメータが追加された。
これをfalseにすることによって aws_ecs_task_definition が container_definitions を追跡しなくなるので、例えばapp repoでtask definitionを書き換えられたとしてもdiffには出なくなる。

2357gi2357gi

ただ、この状態でもterraform上では aws_ecs_servicetask_definition パラメータが terraform に表記された古い aws_ecs_task_definition を捕捉したままなので、 ignore_changes = [task_definition] は必要。

そこで、 aws_ecs_servicetask_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の記述を削除させたり)をキープできる