基于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模块,封装规则集添加逻辑,每个项目通过调用模块传入专属规则参数,实现统一管理与分布式部署的平衡。
模块核心逻辑
- 读取RCGA的现有配置
- 校验传入的规则优先级、名称是否唯一
- 通过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
相关产品推荐
相关产品推荐

