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

Terraform配置Azure防火墙规则:expiration属性嵌套循环问题

问题描述

已通过Terraform成功创建Azure防火墙网络规则,现需添加expiration属性实现临时网络规则:

  • 若expiration为0,规则永久生效
  • 若expiration为时间字符串,需与当前系统日期对比,仅当时间未过期时生效

尝试多种for_each、for和if组合均未成功,核心问题是expiration属性无法在循环外正常访问,需修改module.tf中network_rule_collection块下的dynamic rule代码段。


修改后的核心代码(module.tf)

resource "azurerm_firewall_policy_rule_collection_group" "fw-prcg" {
  for_each           = var.fw_c
  name               = each.key
  firewall_policy_id = var.fw_policy_id
  priority           = each.value[0]


  dynamic "network_rule_collection" {
    for_each = { for nr, rules in var.fw_nr : nr => rules if nr == each.key }
    content {
      name     = each.key
      priority = each.value[0]
      action   = each.value[1]
      dynamic "rule" {
        # 过滤逻辑:保留永久规则或未过期的临时规则
        for_each = [
          for rule in var.fw_nr[each.key] : rule
          if rule.expiration == 0 || (
            rule.expiration != 0 && timecmp(rule.expiration, timestamp()) == 1
          )
        ]
        content {
          name                  = rule.value.name
          protocols             = rule.value.protocols
          source_ip_groups      = [for s in rule.value.source_ip_groups : join("/", ["/subscriptions", var.sub, "resourceGroups", var.rgname, "providers/Microsoft.Network/ipGroups", s])]
          destination_ip_groups = [for d in rule.value.destination_ip_groups : join("/", ["/subscriptions", var.sub, "resourceGroups", var.rgname, "providers/Microsoft.Network/ipGroups", d])]
          # 兼容yaml中的拼写错误(estination_ports)
          destination_ports     = lookup(rule.value, "destination_ports", lookup(rule.value, "estination_ports", []))
        }
      }
    }
  }

  # 应用规则集合部分保持原有逻辑不变
  dynamic "application_rule_collection" {
    for_each = { for ar, name in var.fw_ar : ar => name if ar == each.key }
    content {
      name     = each.key
      priority = each.value[0]
      action   = each.value[1]
      dynamic "rule" {
        for_each = var.fw_ar[each.key]
        content {
          name = rule.value.name
          dynamic "protocols" {
            for_each = rule.value.protocols
            content {
              type = protocols.value.type
              port = protocols.value.port
            }
          }
          source_ip_groups      = [for s in rule.value.source_ip_groups : join("/", ["/subscriptions", var.sub, "resourceGroups", var.rgname, "providers/Microsoft.Network/ipGroups", s])]
          destination_fqdns     = rule.value.destination_fqdns
          destination_urls      = rule.value.destination_urls
          terminate_tls         = rule.value.terminate_tls
          web_categories        = rule.value.web_categories
          destination_fqdn_tags = rule.value.destination_fqdn_tags
        }
      }
    }
  }
}

关键修改说明

  1. 修正规则过滤逻辑:
    直接遍历规则列表,通过双重条件筛选有效规则:

    • 当expiration为0时,规则永久生效,直接保留
    • 当expiration为时间字符串时,使用timecmp函数对比当前时间(timestamp()),仅保留未过期的规则(timecmp返回1表示目标时间晚于当前时间)
  2. 修复字段访问问题:
    原代码中for_each仅提取expiration属性,导致无法访问规则的其他字段。修改后直接保留整个规则对象,确保rule.value能正常获取name、protocols等属性。

  3. 兼容配置拼写错误:
    针对net_rules.yaml中存在的estination_ports拼写错误,使用lookup函数兼容两种字段名,避免配置解析报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:35:20