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

基于Terraform的Azure防火墙策略规则集分布式部署方案咨询

分布式管理Azure Firewall规则集组关联规则集的生产级方案

背景回顾

通过流水线PA部署Azure Firewall、关联的Firewall Policy及规则集组RCGA;流水线PB负责多项目部署,每个项目有独立Terraform状态文件,需为每个项目创建关联至RCGA的专属规则集。

现存问题梳理

  • Azure Firewall仅支持关联单个Firewall Policy
  • 经典规则资源azurerm_firewall_network_rule_collection无法关联规则集组
  • 直接使用azurerm_firewall_policy_rule_collection_group会引发多项目状态冲突,无法分布式管理
  • 单个项目对应独立规则集组受限于90个组的配额
  • 门户操作、Az CLI预览命令不满足生产级稳定性要求
  • azapi_update_resource全量替换规则集数组的方式不可行

可行生产级方案

方案1:AzAPI Provider PATCH增量添加规则集

利用AzAPI支持的HTTP PATCH方法,仅向RCGA追加新项目的规则集,避免全量替换原有配置。

实现代码示例

# 读取已存在的RCGA规则集组配置
data "azurerm_firewall_policy_rule_collection_group" "rcga" {
  name               = "RCGA"
  firewall_policy_id = var.firewall_policy_id
}

# 通过PATCH操作增量添加项目专属规则集
resource "azapi_update_resource" "project_rule_collection" {
  type        = "Microsoft.Network/firewallPolicies/ruleCollectionGroups@2023-09-01"
  resource_id = data.azurerm_firewall_policy_rule_collection_group.rcga.id
  method      = "PATCH"
  body = jsonencode({
    properties = {
      ruleCollections = concat(
        data.azurerm_firewall_policy_rule_collection_group.rcga.properties.rule_collections,
        [
          {
            name                = "project-${var.project_name}-network-rules"
            priority            = var.rule_priority
            ruleCollectionType  = "FirewallPolicyFilterRuleCollection"
            action              = { type = "Allow" }
            rules = [
              {
                ruleType            = "NetworkRule"
                name                = "allow-project-outbound"
                protocols           = ["TCP"]
                sourceAddresses     = [var.project_vnet_cidr]
                destinationAddresses = ["0.0.0.0/0"]
                destinationPorts    = ["443"]
              }
            ]
          }
        ]
      )
    }
  })
}

关键注意事项

  • 确保每个项目的规则集名称、优先级全局唯一,避免冲突
  • 部署时添加并发控制(如Azure资源锁、流水线串行执行),防止多项目同时更新导致的配置覆盖

方案2:独立规则集资源+状态隔离

使用AzureRM Provider v3.0+版本提供的azurerm_firewall_policy_rule_collection资源,直接创建关联至RCGA的规则集,每个项目独立管理自身规则集状态,无需修改RCGA的整体配置。

实现代码示例

resource "azurerm_firewall_policy_rule_collection" "project_rules" {
  name                          = "project-${var.project_name}-rules"
  firewall_policy_id            = var.firewall_policy_id
  rule_collection_group_name    = "RCGA"
  priority                      = var.rule_priority
  action_type                   = "Allow"
  rule_collection_type          = "FirewallPolicyFilterRuleCollection"

  network_rules {
    name                  = "allow-project-outbound"
    source_addresses      = [var.project_vnet_cidr]
    destination_addresses = ["0.0.0.0/0"]
    destination_ports     = ["443"]
    protocols             = ["TCP"]
  }
}

关键优势

  • 原生Terraform资源,状态完全隔离,多项目部署无冲突
  • 无需额外的增量合并逻辑,配置简洁易维护
  • 自动继承RCGA的规则集组属性,无需手动处理关联逻辑

方案3:Terraform模块封装+统一规则管理

构建可复用的Terraform模块,封装规则集添加逻辑,每个项目通过调用模块传入专属规则参数,实现统一管理与分布式部署的平衡。

模块核心逻辑

  1. 读取RCGA的现有配置
  2. 校验传入的规则优先级、名称是否唯一
  3. 通过AzAPI PATCH或原生资源完成规则集添加

项目调用示例

module "project_firewall_rules" {
  source = "./modules/firewall-rule-collection"

  firewall_policy_id      = var.firewall_policy_id
  rcga_name               = "RCGA"
  project_name            = var.project_name
  rule_priority           = var.rule_priority
  source_cidr             = var.project_vnet_cidr
  destination_ports       = ["443", "80"]
  allowed_protocols       = ["TCP"]
}

方案对比

方案核心优势潜在风险
AzAPI PATCH兼容旧版Provider,支持复杂规则配置需处理并发冲突,配置相对复杂
独立规则集资源状态隔离彻底,配置简洁需依赖AzureRM v3.0+版本
Terraform模块封装统一管理逻辑,减少重复代码模块需适配多种规则类型(网络、应用、NAT)

内容的提问来源于stack exchange,提问作者qvt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:35:10