使用 aws_s3_bucket 时 Terraform 重写标签和版本控制信息

Terraform rewriting tag and versioning info when using aws_s3_bucket

我 运行 遇到了 Terraform 正在删除 S3 存储桶的标签和版本信息的问题。这可能是什么原因?我该如何阻止这种情况发生?

main.tf :

resource "aws_s3_bucket" "bucket" {
  bucket = "bucket-${var.accountName}"
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle {
    prevent_destroy = true
  }
}

计划输出:

module.s3.aws_s3_bucket.bucket
tags.%: "1" => "0"
tags.Versioning: "Yes" =>

该计划告诉您它想从 S3 存储桶中删除 Versioning 标签,但请注意,它并没有告诉您它正在撤消 S3 存储桶的实际版本控制,它看起来会有些东西喜欢:

  versioning.0.enabled:        "true" => "false"

您尚未在 Terraform 代码中的 S3 存储桶上定义任何标签,因此 Terraform 在刷新阶段检测到偏差后试图强制 S3 存储桶恢复到您定义的配置。

您可以添加 tags to the aws_s3_bucket resource 您的 Terraform 代码,停止更改 Terraform 外部的 Terraform 托管资源,或者您可以使用 ignore_changes 告诉 Terraform 您希望标签上有偏差。

在我看来,第一个选项是最佳选项,您可以通过使用类似以下内容来实现:

resource "aws_s3_bucket" "bucket" {
  bucket = "bucket-${var.accountName}"
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle {
    prevent_destroy = true
  }

  tags = {
    Versioning = "Yes"
  }
}

如果您出于某种原因确实想在 Terraform 之外添加标签,但不希望 Terraform 撤消您的更改,那么您可以使用 ignore_changes lifecycle:[= 告诉它忽略对标签的更改19=]

resource "aws_s3_bucket" "bucket" {
  bucket = "bucket-${var.accountName}"
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle {
    prevent_destroy = true
    ignore_changes = ["tag"]
  }
}