防止 Terraform 删除 S3 中的现有路径

Prevent Terraform from deleting existing paths in S3

我有一个简单的 Terraform 代码,我在 S3 中管理应用程序的版本代码

我想在 S3 中管理此代码的多个版本。

我的代码如下:

main.tf

resource "aws_s3_bucket" "caam_test_bucket" {
  bucket = "caam-test-bucket"

  versioning {
    enabled = true
  }
}

resource "aws_s3_bucket_object" "caam_test_bucket_obj" {
  bucket = aws_s3_bucket.caam_test_bucket.id
  key    = "${var.env}/v-${var.current_version}/app.zip"
  source = "app.zip"
}

每次更新代码时,我都会将其导出到 app.zip,增加变量 current_version 并推送 terraform 代码。

这里的问题是,它没有在 S3 存储桶中保留多个版本文件夹,而是删除了现有的并创建了另一个。

我希望 Terraform 保留所有创建的路径和文件,而不是将其删除。

例如,如果路径 dev/v-1.0/app.zip 已经存在并且我将当前版本增加到 2.0 并推送代码,我希望 Terraform 保留 dev/v-1.0/app.zip 并将 dev/v-2.0/app.zip 添加到水桶。

有办法吗?

TF 删除您的对象,因为它就是这样 works:

Destroy resources that exist in the state but no longer exist in the configuration.

克服这个问题的一种方法是通过for_each在配置中保留所有对象。通过这种方式,您可以不断将新版本添加到现有对象的映射中,而不是不断替换它们。如果您要创建很多版本,这可能会有问题,因为您必须保留所有版本。

可能更简单的方法是使用 local-exec,它将使用 AWS CLI 上传对象。这发生在 TF 的“外部”,因此 TF 将不会删除 预先存在的对象,因为 TF 不会意识到它们。