You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform跨仓库更新AWS网络防火墙现有策略的状态规则组?

解决Terraform跨仓库更新AWS网络防火墙策略的错误

问题场景

两个独立Terraform仓库分工管理AWS网络防火墙:

  • 仓库1:创建防火墙及包含多个AWS托管状态规则组的策略
  • 仓库2:尝试为已有策略附加自定义状态规则组,执行更新时触发变量和属性访问错误

错误原因

给出的错误对应两个核心问题:

  1. 列表属性未指定索引:数据源返回的firewall_policy是列表类型(每个策略仅含一个块),直接访问firewall_policy.stateful_rule_group_references未指定列表索引,导致Terraform无法定位属性。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:00:02