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 } } } } }
关键修改说明
修正规则过滤逻辑:
直接遍历规则列表,通过双重条件筛选有效规则:- 当
expiration为0时,规则永久生效,直接保留 - 当
expiration为时间字符串时,使用timecmp函数对比当前时间(timestamp()),仅保留未过期的规则(timecmp返回1表示目标时间晚于当前时间)
- 当
修复字段访问问题:
原代码中for_each仅提取expiration属性,导致无法访问规则的其他字段。修改后直接保留整个规则对象,确保rule.value能正常获取name、protocols等属性。兼容配置拼写错误:
针对net_rules.yaml中存在的estination_ports拼写错误,使用lookup函数兼容两种字段名,避免配置解析报错。
内容的提问来源于stack exchange,提问作者Yassine Boumajane
相关产品推荐
相关产品推荐

