强制Terraform每次应用新的状态文件- S3文件上传场景



如果这个问题违反了Terraform通常执行的协议,请原谅我。

我已经提出了一个实用程序,使用Terraform在S3桶中上传文件。它可以很好地上传文件。

问题来了,当我试图再次上传一个新的文件,前一个被删除。Terraform plan会比较现有的和正在应用的内容,并删除之前上传的文件。

是否有办法在Terraform中使用状态管理来克服这个问题?

这是我创建的一个简单的资源,用于将文件/对象上传到bucket

resource "aws_s3_bucket_object" "s3_automation_upload1" {
bucket = ""
key = ""
source = ""
kms_key_id = ""
}

步骤1

resource "aws_s3_bucket_object" "s3_automation_upload1" {
bucket = "bucket1"
key = "folder1/"
source = "File1.txt"
kms_key_id = ""
}

File1.txt上传到bucket1 "folder1">

步骤2 -再次应用

resource "aws_s3_bucket_object" "s3_automation_upload1" {
bucket = "bucket1"
key = "folder1/"
source = "File2.txt"
kms_key_id = ""
}

现在File2.txt上传了,但是File1.txt被Terraform删除了,因为有一个新的状态变化

如何保留File1.txt,只添加File2.txt

同意Terraform可能不是这项工作的理想工具(像aws s3 sync ...这样的工具会是一个更好的开始)的评论,但是从表面上看你的问题…

我认为你的问题是key规格。这应该是要存储的对象的键。您当前的解决方案是管理文件夹,而不是其中包含的文件,因此每次更改源代码时都会替换内容。试试这个:

resource "aws_s3_bucket_object" "s3_automation_upload1" {
bucket = "bucket1"
key = "folder1/File1.txt"
source = "File1.txt"
kms_key_id = ""
}
resource "aws_s3_bucket_object" "s3_automation_upload2" {
bucket = "bucket1"
key = "folder1/File2.txt"
source = "File2.txt"
kms_key_id = ""
}

请记住,Terraform被设计为管理独立的、离散的资源,所以使用这种方法,每个上传到S3的文件都需要它自己的Terraform资源。