terraform 资源 s3 上传文件未更新

Sha*_*yaS 7 terraform

我正在使用 terraform 将包含内容的文件上传到 s3。但是,当内容更改时,我也需要更新 s3 文件。但是由于状态文件存储了 s3 上传已完成,因此它不会上传新文件。

resource "local_file" "timestamp" {
  filename = "timestamp"
  content = "${timestamp()}"
}


resource "aws_s3_bucket_object" "upload" {
 bucket = "bucket"
 key = "date"
 source = "timestamp"
}



Run Code Online (Sandbox Code Playgroud)

预期的:

检测到 aws_s3_bucket_object 更改 aws_s3_bucket_object.timestamp 正在创建...

结果:

aws_s3_bucket_object 正在刷新状态...

Mar*_*ins 10

当您为 Terraform 提供文件路径而不是要上传的直接内容时,决定资源是否需要更新的是文件名,而不是文件的内容。

对于示例中所示的一小段数据,最简单的解决方案是直接在资源配置中指定数据:

resource "aws_s3_bucket_object" "upload" {
 bucket  = "bucket"
 key     = "date"
 content = "${timestamp()}"
}
Run Code Online (Sandbox Code Playgroud)

如果您的文件实际上太大而无法合理加载到字符串变量中,或者如果它包含无法加载到字符串中的原始二进制数据,您可以将etag对象的设置为内容的 MD5 哈希值,以便提供者可以看到当内容发生变化时:

resource "aws_s3_bucket_object" "upload" {
 bucket  = "bucket"
 key     = "date"
 source  = "${path.module}/timestamp"
 etag    = "${filemd5("${path.module}/timestamp")}"
}
Run Code Online (Sandbox Code Playgroud)

通过设置etag,对文件内容的任何更改都将导致此散列结果更改,从而允许提供程序检测到需要更新对象。

  • 不幸的是,这不适用于具有 kms 加密的存储桶 (2认同)
  • 我认为你可以使用 `source_hash = filemd5("path/to/source")` 来加密文件。 (2认同)