こんにちは、ゲームソリューション部の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でトリガーする必要があることを記事にしました。
どなたかの参考になると幸いです。