如何通过Terraform跨仓库更新AWS网络防火墙现有策略的状态规则组?
解决Terraform跨仓库更新AWS网络防火墙策略的错误
问题场景
两个独立Terraform仓库分工管理AWS网络防火墙:
- 仓库1:创建防火墙及包含多个AWS托管状态规则组的策略
- 仓库2:尝试为已有策略附加自定义状态规则组,执行更新时触发变量和属性访问错误
错误原因
给出的错误对应两个核心问题:
- 列表属性未指定索引:数据源返回的
firewall_policy是列表类型(每个策略仅含一个块),直接访问firewall_policy.stateful_rule_group_references未指定列表索引,导致Terraform无法定位属性。 - for_each类型不兼容:
stateful_rule_group_references是列表,而for_each要求使用可哈希的集合类型(如set、map),直接使用列表会触发类型错误。
修正后的代码
data "aws_networkfirewall_firewall_policy" "existing_policy" { name = "NFPolicy" } # 合并原有托管规则组与自定义规则组,转为可哈希集合 locals { existing_stateful_rule_groups = toset([ for group in data.aws_networkfirewall_firewall_policy.existing_policy.firewall_policy[0].stateful_rule_group_references : group.resource_arn ]) custom_stateful_rule_groups = toset([ aws_networkfirewall_rule_group.allow_icmp.arn, aws_networkfirewall_rule_group.nwf_drop_tls_1_0_and_1_1.arn ]) all_stateful_rule_groups = union(local.existing_stateful_rule_groups, local.custom_stateful_rule_groups) } resource "aws_networkfirewall_firewall_policy" "update_policy" { name = "NFPolicy" firewall_policy { stateless_default_actions = data.aws_networkfirewall_firewall_policy.existing_policy.firewall_policy[0].stateless_default_actions stateless_fragment_default_actions = data.aws_networkfirewall_firewall_policy.existing_policy.firewall_policy[0].stateless_fragment_default_actions dynamic "stateful_rule_group_reference" { for_each = local.all_stateful_rule_groups content { resource_arn = stateful_rule_group_reference.value } } } # 可选:防止仓库2意外修改仓库1管理的配置 lifecycle { ignore_changes = [ # 若不需要管理无状态规则,可取消注释以下行 # firewall_policy.0.stateless_default_actions, # firewall_policy.0.stateless_fragment_default_actions, ] } }
修正说明
- 指定列表索引:用
firewall_policy[0]明确访问唯一的策略块,解决属性定位错误。 - 集合转换与合并:通过
toset()将列表转为集合,满足for_each的可哈希要求,同时用union()合并原有与自定义规则组,避免动态块与静态块混用的冲突。 - 生命周期规则:添加
ignore_changes可限定仓库2的管理范围,防止误改仓库1配置。
内容的提问来源于stack exchange,提问作者ahmed mokadem
相关产品推荐
相关产品推荐

