如何在不破坏存储桶内容或重新创建存储桶的情况下将文件上传到现有 s3 存储桶(从 terraform 基础设施创建)。
terraform {
backend "s3" {
bucket = "terraformtests"
key = "terraformstate.tf"
region = "us-east-1"
}
}
resource "aws_s3_bucket_object" "terraformtests" {
bucket = "terraformtests"
key = "test/prod/1000/keys"
source = "deploy"
etag = "${md5(file("keys"))}"
}
这就是我所拥有的。它在第一次运行中运行良好,并将其上传到密钥空间"1000"。当我编辑它并使用 1001 重新运行时,脚本会尝试销毁以前在 test/prod/1000/keys 中创建的文件。我想要做的是
- 导入现有表状态而不重新创建它
- 将文件夹添加到键空间,而不接触表的先前内容。
你得到的结果是Terraform所期望的。
TF 在.tfstate文件中维护基础结构的"状态"。它们是上次同步时基础结构的镜像。
.tf文件中描述了基础结构的所需状态。
运行terraform plan
或terraform apply
命令会比较.tf和.tfstate文件。然后,销毁.tfstate中存在而不在.tf中的任何资源。
在您的情况下,它在上次运行的.tfstate中具有密钥空间 1000,但在.tf中没有,因为您将其编辑为1001。
解决方法
- 使用 AWS CLI,正如Winston 的评论中所建议的那样
- 为密钥空间 1001添加另一个资源,而不是编辑您拥有的资源
另外,我注意到你有
source = "deploy"
etag = "${md5(file("keys"))}"
通常,它们应引用同一文件:
source = "readme.md"
etag = "${filemd5("readme.md")}"