Terraform dynamic块for_each如何按条件设置S3加密sse_algorithm值
Terraform 动态配置S3服务端加密实现方案
你当前的写法是仅当加密模式为SSE-KMS时才渲染整个服务端加密配置块,条件不满足时直接不生成对应配置,无法覆盖AES256加密的场景。按需求动态设置sse_algorithm可以参考以下两种实现方式,根据实际场景选择即可。
方案1:始终显式配置加密规则(生产推荐)
S3桶的服务端加密配置块不需要做条件动态生成——无论使用KMS还是AES256加密,都需要该配置块存在。直接在块内部通过三元表达式控制参数取值即可,注意AES256模式下不需要传入kms_master_key_id,赋值为null时Terraform会自动忽略该参数,不会触发API校验报错。
server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { // 按条件动态赋值加密算法 sse_algorithm = local.encryption == "SSE-KMS" ? "aws:kms" : "AES256" // 仅KMS模式下传入自定义KMS密钥ID kms_master_key_id = local.encryption == "SSE-KMS" ? local.kmsKey : null } } }
方案2:通过dynamic块分支渲染配置
如果你需要沿用dynamic块的写法,通过两个互斥的dynamic块分别渲染两种加密场景的配置即可,两个块的for_each条件互斥,同一时间只会渲染其中一个:
// KMS加密分支 dynamic "server_side_encryption_configuration" { for_each = local.encryption == "SSE-KMS" ? [true] : [] content { rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = local.kmsKey } } } } // AES256加密分支 dynamic "server_side_encryption_configuration" { for_each = local.encryption != "SSE-KMS" ? [true] : [] content { rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } } }
内容的提问来源于stack exchange,提问作者thulasi39
相关产品推荐
相关产品推荐

