Terraform Azure NSG动态规则创建:多端口范围配置问题求助
解决方案思路
核心是通过Terraform的merge函数结合条件表达式,动态构建安全规则的参数集合,确保每个规则只包含单个端口范围或多端口范围中的一组参数,避免同时设置Azure NSG规则中互斥的字段。
具体实现步骤
- 保留现有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
相关产品推荐
相关产品推荐

