有条件地将 SSE-S3 (AES256) 或 KMS 与 Terraform 一起应用

Conditionally apply SSE-S3 (AES256) or KMS with Terraform

在我的 s3.tf 文件中,我有每个 S3 存储桶的资源定义,即

    "my-bucket-1" = {
      server_side_encryption_kms_keys = [aws_kms_key.kms_keys["default-key"].arn]
      tags                            = { Function = "A Function" }
    }

在资源定义之后,我有以下块将加密应用于上面定义的每个存储桶。

dynamic "server_side_encryption_configuration" {
    for_each = try(each.value.server_side_encryption_kms_keys, [])

    content {
      rule {
        apply_server_side_encryption_by_default {
          kms_master_key_id = server_side_encryption_configuration.value
          sse_algorithm     = "aws:kms"
        }
      }
    }
  }

我想保留此功能以将 KMS 加密应用于具有 server_side_encryption_kms_keys = [aws_kms_key.kms_keys["default-key"].arn]

的存储桶

不过,我还希望能够指定应该在资源定义中使用 SSE-S3 (AES256) 加密存储桶,方法如下:

    "my-bucket-2" = {
      server_side_encryption_sse_s3   = true
      tags                            = { Function = "A Function" }
    }

我查看了 https://registry.terraform.io/providers/hashicorp/aws/3.75.1/docs/resources/s3_bucket#sse_algorithm 上的文档,但我不知道如何实现这两种情况。

我是否需要修改现有的动态块?如果是这样,如何?添加一个新的?那应该是什么?

您实际要求的是使用 AES-256 密码的默认 SSE-S3。按照建议,您需要将其指定为默认值,而不是为密码算法指定无 KMS 密钥加密。然后,您可以根据更改后的默认值更新块的行为。由于这不再需要动态可选块设计模式,因为有默认参数值,因此可以在本地现在所在的位置更新配置:

"my-bucket-1" = {
  server_side_encryption_kms_key = aws_kms_key.kms_keys["default-key"].arn # notice de-pluraled and now string type
  tags                           = { Function = "A Function" }
}

和块:

server_side_encryption_configuration {
  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = try(each.value.server_side_encryption_kms_key, null)
      sse_algorithm     = can(each.value.server_side_encryption_kms_key) ? "aws:kms" : "AES256"
    }
  }
}

同时考虑更新配置以利用更新后的 API 表单和 new resource