如何在Terraform中为AWS Network Firewall添加托管有状态规则组并解决ARN变量问题
问题原因与解决方案
错误原因
你遇到的报错是因为data.aws_arn.stateful-rulegroup返回的是ARN解析对象(包含partition、region、resource等多个属性),而join函数要求传入字符串列表,直接使用整个对象会触发类型不匹配错误。
修复ARN生成错误的两种方法
方法1:使用ARN数据源的字符串属性
修改第27行,引用数据源的arn字段(这才是原始的ARN字符串值):
resource_arn = join("/", [data.aws_arn.stateful-rulegroup.arn, "AbusedLegitBotNetCommandAndControlDomainsStrictOrder"])
方法2:直接字符串插值(更简洁)
如果不需要解析ARN的细分属性,完全可以跳过data "aws_arn",直接通过变量拼接生成ARN:
resource_arn = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup/AbusedLegitBotNetCommandAndControlDomainsStrictOrder"
完整替换自定义规则组的配置
移除原有的allow_domains规则组引用,添加所有指定的AWS托管有状态规则组,每个规则组设置唯一的优先级:
resource "aws_networkfirewall_firewall_policy" "anfw_policy" { name = "your-firewall-policy-name" description = "Firewall policy with AWS managed stateful rule groups" firewall_policy { # 保留原有无状态规则、默认动作等配置 # 移除原自定义规则组 allow_domains 的引用 # 添加AWS托管的四个有状态规则组 stateful_rule_group_reference { priority = 21 resource_arn = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup/AbusedLegitBotNetCommandAndControlDomainsStrictOrder" } stateful_rule_group_reference { priority = 22 resource_arn = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup/MalwareDomainsStrictOrder" } stateful_rule_group_reference { priority = 23 resource_arn = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup/BotNetCommandAndControlDomainsStrictOrder" } stateful_rule_group_reference { priority = 24 resource_arn = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup/AbusedLegitMalwareDomainsStrictOrder" } } }
可选:用本地变量简化重复代码
如果想减少ARN前缀的重复书写,可以定义本地变量复用:
locals { managed_stateful_rg_prefix = "arn:aws:network-firewall:${var.region}:aws-managed:stateful-rulegroup" } # 规则组引用示例 stateful_rule_group_reference { priority = 21 resource_arn = "${local.managed_stateful_rg_prefix}/AbusedLegitBotNetCommandAndControlDomainsStrictOrder" }
内容的提问来源于stack exchange,提问作者user20208419
相关产品推荐
相关产品推荐

