Terraform遍历嵌套资源创建AWS网络防火墙规则组报错求助
问题根源
你当前的错误是因为使用for_each循环创建了多个aws_networkfirewall_rule_group资源,但所有资源的name都设置为limit-Domain-Access——AWS要求规则组名称在同一区域内唯一,因此触发了重复创建的报错。而你的实际需求是单个规则组内包含多个IP变量和多条规则,并非创建多个规则组。
解决方案
调整Terraform配置,将所有规则和变量合并到同一个规则组资源中,具体修改如下:
1. 简化本地变量定义
locals { rule_groups = yamldecode(file("${path.module}/settings.yaml"))["rule_groups"] }
2. 修改规则组资源配置
resource "aws_networkfirewall_rule_group" "limit-Domain-Access" { capacity = 1000 name = "limit-Domain-Access" type = "STATEFUL" rule_group { rule_variables { # 动态生成多个IP集变量,对应YAML中的每个条目 dynamic "ip_sets" { for_each = local.rule_groups content { key = ip_sets.value.name ip_set { definition = [ip_sets.value.source] } } } } rules_source { # 拼接所有Suricata规则,确保每条规则的sid和priority唯一 rules_string = join("\n", [ for idx, rule in local.rule_groups : <<EOF pass http $${rule.name} any -> $EXTERNAL_NET any (http.host; dotprefix; content:"${join(", ", rule.allowed-domains)}"; endswith; msg:"matching HTTP allowlisted FQDNs"; priority:${idx + 1}; flow:to_server, established; sid:${idx + 1}; rev:1;) EOF ]) } } tags = { Name = "limit-Domain-Access" } }
关键修改说明
- 移除
for_each:不再创建多个规则组,仅生成一个目标规则组 - 使用
dynamic "ip_sets":在单个rule_variables块内动态生成所有IP集变量,对应YAML中的每个环境条目 - 规则字符串拼接:将所有Suricata规则合并为一个字符串,通过索引设置唯一的
priority和sid,避免规则冲突 - 变量转义:用
$${}转义Terraform变量引用,确保Suricata能正确识别$TEST这类变量
内容的提问来源于stack exchange,提问作者Dani-Bholenath
相关产品推荐
相关产品推荐

