Terraform中为EKS模块条件添加安全组Ingress规则属性的方法
解决Terraform EKS模块安全组Ingress规则Null值问题
要实现仅保留指定的cidr_block或source_security_group_id属性(忽略未指定字段,而非设为null),可以通过Terraform的for表达式过滤null值来构造本地变量,具体方案如下:
1. 规范输入变量定义
先确保输入变量将cidr_block和source_security_group_id设为可选字段,并添加校验强制二选一,避免无效输入:
variable "eks_security_group_ingress_rules" { type = list(object({ name = string description = string cidr_block = optional(string) source_security_group_id = optional(string) from_port = number to_port = number protocol = string })) default = [] validation { condition = alltrue([ for rule in var.eks_security_group_ingress_rules : (rule.cidr_block != null) != (rule.source_security_group_id != null) ]) error_message = "每个Ingress规则必须且只能指定cidr_block或source_security_group_id中的一个。" } }
2. 过滤Null字段构造本地变量
修改本地变量逻辑,遍历输入规则时只保留非null的属性,两种实现方式可选:
方式一:全局过滤所有Null字段
适用于确定必填字段不会为null的场景,直接遍历规则的键值对并过滤:
locals { eks_sg_ingress = [ for rule in var.eks_security_group_ingress_rules : { for k, v in rule : k => v if v != null } ] }
方式二:精准过滤目标字段
仅针对cidr_block和source_security_group_id做过滤,避免误处理其他字段:
locals { eks_sg_ingress = [ for rule in var.eks_security_group_ingress_rules : merge( # 保留必填核心字段 { name = rule.name description = rule.description from_port = rule.from_port to_port = rule.to_port protocol = rule.protocol }, # 仅添加有值的cidr_block或source_security_group_id { for k, v in { cidr_block = rule.cidr_block source_security_group_id = rule.source_security_group_id } : k => v if v != null } ) ] }
3. 传入EKS模块使用
将处理后的本地变量传入EKS模块的安全组Ingress参数(通常为security_group_ingress):
module "eks" { source = "terraform-aws-modules/eks/aws" # 其他模块配置项... security_group_ingress = local.eks_sg_ingress }
经过以上处理,每个Ingress规则对象只会包含用户实际指定的属性,不会出现null值,即可避开EKS模块的null值限制。
内容的提问来源于stack exchange,提问作者David Gard
相关产品推荐
相关产品推荐

