添加CIDR_BLOCKS变量值后Terraform Plan无更新,如何优化代码?
问题解决与优化方案
核心原因
你当前将多个CIDR网段放在同一条安全组入站规则中,AWS会把这些CIDR合并存储为单条规则。当你更新var.xymon_clients_cidr添加新网段时,Terraform可能因状态与配置的规则对比逻辑问题,无法识别出CIDR列表的变化,导致terraform plan无变更提示。
最优代码写法
改用dynamic块为每个CIDR网段创建独立的安全组规则,让Terraform能精准跟踪每条规则的增删变化,无需手动执行terraform apply -refresh-only。
修改后的代码示例:
dynamic "ingress" { # 用toset去重,避免重复CIDR导致报错 for_each = toset(var.xymon_clients_cidr) content { description = "1984 from xymon client - ${ingress.value}" from_port = local.xymon_port to_port = local.xymon_port protocol = local.tcp_proto cidr_blocks = [ingress.value] } }
额外注意事项
- 确保变量定义正确,类型应为
list(string)或set(string):
variable "xymon_clients_cidr" { type = list(string) description = "CIDR网段列表,允许访问Xymon服务的客户端来源" }
- 每条规则的描述加入对应CIDR值,既方便在AWS控制台区分规则,也避免因描述完全一致导致Terraform误判规则状态。
内容的提问来源于stack exchange,提问作者dazedandconfused
相关产品推荐
相关产品推荐

