TerraformでS3に配置するファイルの更新は、etagでトリガーする必要がある

2024.02.07

こんにちは、ゲームソリューション部のsoraです。
今回は、TerraformでS3に配置するファイルの更新は、etagでトリガーする必要があることについて書いていきます。

事象

TerraformでS3バケットにファイルを配置した後、そのファイルを更新してapply使用とすると、以下のように変更が検知されませんでした。

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so   
no changes are needed.

Terraformのコードは以下です。
S3バケットを作成して、そこにCSVファイルを配置しているだけです。

main.tf

terraform {
    required_providers {
        aws = {
            source  = "hashicorp/aws"
            version = "~> 5.35.0"
        }
    }
    backend local {
        path = "tmp.tfstate"
    }
}
provider aws {
    region = "ap-northeast-1"
}

resource aws_s3_bucket csv_bucket {
    bucket = "sora-test-bucket-202402"
}
resource aws_s3_object csv {
    bucket = aws_s3_bucket.csv_bucket.id
    key    = "test.csv"
    source = "test.csv"
}

原因

Terraformの公式ドキュメントを読んでみると、S3へオブジェクトを配置するときに、ファイルが更新されたことをトリガーするetagが抜けていることが原因でした。

resource aws_s3_object csv {
    bucket = aws_s3_bucket.csv_bucket.id
    key    = "test.csv"
    source = "test.csv"
    # sourceで指定している場所を指定
    etag = filemd5("test.csv")
}

上記修正をして、再度CSVファイルを更新して実行してみると、無事差分が検知されました。

  ~ update in-place

Terraform will perform the following actions:

  # aws_s3_object.csv will be updated in-place
  ~ resource "aws_s3_object" "csv" {
      ~ etag                   = "53b54c5f36e6cbf551753cc4885f31f1" -> "e0a4db53b7088d10680779c1a6480085"
        id                     = "test.csv"
        tags                   = {}
      + version_id             = (known after apply)
        # (10 unchanged attributes hidden)
    }

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

最後に

今回は、TerraformでS3に配置するファイルの更新は、etagでトリガーする必要があることを記事にしました。
どなたかの参考になると幸いです。