我正在使用 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,对文件内容的任何更改都将导致此散列结果更改,从而允许提供程序检测到需要更新对象。
| 归档时间: |
|
| 查看次数: |
2481 次 |
| 最近记录: |