如何在Terraform根模块中跳过for_each循环的非必需值声明
解决方案
要实现当enable_lifecycle = false时无需声明glacier_ir_days和glacier_days,你可以通过将这两个字段设为可选类型来修改变量定义,具体步骤如下:
1. 修改变量定义,标记字段为可选
更新bucket_details变量的类型约束,使用Terraform的optional()函数将glacier_ir_days和glacier_days设为可选字段,还可以为它们设置合理的默认值(避免后续使用时出现空值问题):
variable "bucket_details" { type = map(object({ bucket_name = string enable_lifecycle = bool glacier_ir_days = optional(number, 555) # 可选字段,默认值555 glacier_days = optional(number, 888) # 可选字段,默认值888 })) }
2. 保留原有生命周期规则的过滤逻辑
你的aws_s3_bucket_lifecycle_configuration资源已经通过for_each过滤出enable_lifecycle = true的桶,因此即使某些桶没有提供这两个字段,也不会影响生命周期规则的创建(默认值会生效,或者用户在需要时覆盖)。
3. 根模块引用示例
现在你可以按照期望的方式引用模块,无需为enable_lifecycle = false的桶填写glacier_ir_days和glacier_days:
module "s3_buckets" { source = "./modules/aws-s3-compliance" bucket_details = { "firstbucketname" = { bucket_name = "onlythefirstbuckettesting" enable_lifecycle = true glacier_ir_days = 555 glacier_days = 888 } "secondbucketname" = { bucket_name = "onlythesecondbuckettesting" enable_lifecycle = false } } }
额外说明
optional()函数是Terraform 1.3+版本引入的特性,如果你的Terraform版本低于1.3,建议升级到新版本以使用该特性。- 若希望强制要求
enable_lifecycle = true的桶必须填写这两个字段,可以在模块中添加验证规则,避免遗漏配置:
variable "bucket_details" { # ... 原有类型定义 ... validation { condition = alltrue([for k, v in var.bucket_details : v.enable_lifecycle ? contains(keys(v), "glacier_ir_days") && contains(keys(v), "glacier_days") : true]) error_message = "当enable_lifecycle为true时,必须提供glacier_ir_days和glacier_days字段。" } }
内容的提问来源于stack exchange,提问作者sandytoshev
相关产品推荐
相关产品推荐

