😊

【Terraform】AWS Fargateでタスク定義にFluent Bitを含めると意図せぬ差分が発生する

2022/09/19に公開

概要

Terraform で AWS Fargate のタスク定義に カスタムログルーティング(FireLens)用の Fluent Bit をサイドカーコンテナとして追加した場合、タスク定義を何も変更していないにもかかわらず、なぜかterraform plan時にchangedが必ず発生してしまいます。

~ {
    - essential              = true -> null
    - mountPoints            = [] -> null
      name                   = "app"
    - volumesFrom            = [] -> null
      # (7 unchanged elements hidden)
  } # forces replacement,
~ {
    - cpu                    = 0 -> null
    - environment            = [] -> null
    - mountPoints            = [] -> null
      name                   = "log-router"
    - portMappings           = [] -> null
    - user                   = "0" -> null
    - volumesFrom            = [] -> null
      # (6 unchanged elements hidden)
  } # forces replacement,

環境

Terraform 1.2.5
Terraform AWS Provider 4.22.0

解決策

Fluent Bit コンテナで差分が発生しているパラメータをすべて明示的に記載すれば、changedが発生しなくなります。
user = "0"をタスク定義に追加するだけでも、同様にchangedが発生しなくなりました。

サイドカー以外のコンテナのパラメータでも差分が発生していますが、それらのコンテナのパラメータは記載しなくても問題ありません。

以下は Fluent Bit コンテナにuser = "0"を追加した例です。

{
  "name" : "log-router",
  "image" : "public.ecr.aws/aws-observability/aws-for-fluent-bit:latest",
  "essential" : true,
  "firelensConfiguration" : {
    "type" : "fluentbit",
    "options" : {
      "enable-ecs-log-metadata" : "true",
      "config-file-type" : "file",
      "config-file-value" : "/fluent-bit/configs/parse-json.conf"
    }
  },
  "readonlyRootFilesystem" : true,
  "memoryReservation" : 50,
  "user" : "0"
}

ちなみに、userはコンテナで使用するユーザーで、デフォルトのUID0rootユーザーです。

参考

Discussion