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

Terraform Azure NSG动态规则创建:多端口范围配置问题求助

解决方案思路

核心是通过Terraform的merge函数结合条件表达式,动态构建安全规则的参数集合,确保每个规则只包含单个端口范围或多端口范围中的一组参数,避免同时设置Azure NSG规则中互斥的字段。

具体实现步骤

  1. 保留现有Map配置结构(无需删除字段),在dynamic "security_rule"的content中,用merge组合基础参数和动态端口参数:
    • 先定义所有必选的固定参数(如name、priority、direction等)
    • 针对源端口:判断source_port_ranges是否为空数组,为空则使用source_port_range,否则使用source_port_ranges
    • 针对目标端口:同理判断destination_port_ranges,选择对应的参数字段

修改后的完整代码

resource "azurerm_network_security_group" "appnsg" {
  for_each = {
    for k, v in(var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small) : k => v
    if contains(var.nsg_enabled, k)
  }
  name                = "${var.client_name}-${each.key}-nsg"
  location            = var.location
  resource_group_name = var.resource_group_name

  dynamic "security_rule" {
    for_each = each.value["rules"]
    content = merge(
      # 固定基础参数
      {
        name                       = security_rule.value.name
        priority                   = security_rule.value.priority
        direction                  = security_rule.value.direction
        access                     = security_rule.value.access
        protocol                   = security_rule.value.protocol
        source_address_prefix      = security_rule.value.source_address_prefix
        destination_address_prefix = security_rule.value.destination_address_prefix
      },
      # 动态选择源端口参数
      length(security_rule.value.source_port_ranges) == 0 ? {
        source_port_range = security_rule.value.source_port_range
      } : {
        source_port_ranges = security_rule.value.source_port_ranges
      },
      # 动态选择目标端口参数
      length(security_rule.value.destination_port_ranges) == 0 ? {
        destination_port_range = security_rule.value.destination_port_range
      } : {
        destination_port_ranges = security_rule.value.destination_port_ranges
      }
    )
  }
}

关键说明

  • Azure RM Provider要求NSG规则中,source_port_range与source_port_ranges、destination_port_range与destination_port_ranges是互斥的,不能同时设置(即使其中一个为空值)。
  • 上述代码通过条件判断,确保每个规则只生成一组合法的端口参数,完美匹配你需要的"条件选择"逻辑。
  • 现有Map配置无需调整,空数组或空字符串的字段会被条件判断自动过滤,不会出现在最终的规则定义中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:50