AWSECS

TerraformでFireLensを設定するとECSタスク定義の差分が毎回出る

TerraformでECSのFireLensを設定したときに、とくに何も変更していないのにterraform applyを実行するたびに毎回差分が出力され、タスクが更新されてしまうことに悩まされたのでメモっておきます。

スポンサーリンク

事象

こちらの記事で紹介したFireLensをTerraformで設定するときに、terraform applyを実行するたびに以下のような差分が出力される状態でした。(Terraform v1.3.6, AWS provider v4.47.0)

  # aws_ecs_task_definition.demo must be replaced
-/+ resource "aws_ecs_task_definition" "demo" {
      ~ arn                      = "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/demo:66" -> (known after apply)
      ~ container_definitions    = jsonencode(
          ~ [ # forces replacement
              ~ {
                  - environment      = [] -> null
                  - mountPoints      = [] -> null
                    name             = "nginx"
                  ~ portMappings     = [
                      ~ {
                          - protocol      = "tcp" -> null
                            # (2 unchanged elements hidden)
                        },
                    ]
                  - volumesFrom      = [] -> null
                    # (5 unchanged elements hidden)
                } # forces replacement,
              ~ {
                  - environment           = [] -> null
                  - mountPoints           = [] -> null
                    name                  = "fluent-bit"
                  - portMappings          = [] -> null
                  - user                  = "0" -> null
                  - volumesFrom           = [] -> null
                    # (6 unchanged elements hidden)
                } # forces replacement,
            ]
        )
      ~ id                       = "demo" -> (known after apply)
      - requires_compatibilities = [] -> null
      ~ revision                 = 66 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (7 unchanged attributes hidden)
    }

Plan: 1 to add, 1 to change, 1 to destroy.

Terraformコードのタスク定義抜粋部分は以下のような感じです。(全体はこちらのGitHubにコミットしました。)

container_definitions = jsonencode([
    {
      name      = "nginx"

      logConfiguration = {
        logDriver = "awsfirelens"
...
    },
    {
      name = "fluent-bit"

      firelensConfiguration = {
        type = "fluentbit"
      }
...
    }

原因と対応

こちらのissueに書いてあるとおりFluentBitコンテナの設定に“user” : “0”を追記したら差分は出なくなりました。

    {
      name = "fluent-bit"
...
      firelensConfiguration = {
        type = "fluentbit"
      }
      "user" : "0",
    }

原因は不明ですが、生成されたタスク定義のJSONを見る限り、userを記載してなくてもFluentBitコンテナには”user” : “0”(rootのuid)として値が設定されており、この “0” が null になると検知されてしまっているのかなと思います。

ちなみに一緒に生成されたNginxコンテナのほうは”user” : nullでこれは特に対応しなくても差分は出ませんでした。

今回は以上です〜ノシ

参考

(´・ω・`)ゞアリガトゴザイマス.。.・゚

Terraform forcing replacement of ECS task definition