我正在使用terraform将包含内容的文件上传到s3,但是,当内容更改时,我也需要更新s3文件。但是,由于状态文件存储了s3上传已完成,因此它不会上传新文件。
resource "local_file" "timestamp" {
filename = "timestamp"
content = "${timestamp()}"
}
resource "aws_s3_bucket_object" "upload" {
bucket = "bucket"
key = "date"
source = "timestamp"
}
预期:
检测到aws_s3_bucket_object更改 aws_s3_bucket_object.timestamp正在创建...
结果:
aws_s3_bucket_object刷新状态...
答案 0 :(得分:1)
当您为Terraform提供文件路径而不是直接上载内容时,文件名称决定了是否需要更新资源,而不是文件内容。
对于如示例中所示的一小段数据,最简单的解决方案是直接在资源配置中指定数据:
resource "aws_s3_bucket_object" "upload" {
bucket = "bucket"
key = "date"
content = "${timestamp()}"
}
如果文件实际上太大而无法合理地加载到字符串变量中,或者如果它包含无法加载到字符串中的原始二进制数据,则可以将对象的etag
设置为MD5哈希值内容,以便提供者可以看到内容何时更改:
resource "aws_s3_bucket_object" "upload" {
bucket = "bucket"
key = "date"
source = "${path.module}/timestamp"
etag = "${filemd5("${path.module}/timestamp")}"
}
通过设置etag
,对文件内容的任何更改都将导致此哈希结果发生更改,从而使提供程序能够检测到需要更新对象。