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

Terraform嵌套dynamic块中嵌套for_each的实现方法

解决Terraform嵌套Dynamic块的迭代问题

你的代码有两个关键问题导致嵌套dynamic块无法正常工作,修正方法如下:

1. 修正顶层迭代的变量引用

你定义的变量是var.rule-configuration,但资源里的顶层dynamic块误用了var.firewall_configuration,变量名不匹配会直接导致迭代失败,先把这个对应关系修正。

2. 嵌套Dynamic块的迭代变量引用

在嵌套的dynamic "rule"块中,Terraform默认以块名(也就是rule)作为迭代器,访问每个spoke_prefixes元素的属性时,应该用rule.value.name和rule.value.cidr,而不是你代码里的??.value占位符。

修正后的完整代码

resource "azurerm_firewall_policy_rule_collection_group" "this" {
  name               = "xxx"
  firewall_policy_id = "xxx"
  priority           = 500

  dynamic "network_rule_collection" {
    # 修正变量名,匹配定义的var.rule-configuration
    for_each = var.rule-configuration

    content {
      name     = network_rule_collection.key
      priority = network_rule_collection.value.priority
      action   = "Allow"

      dynamic "rule" {
        for_each = network_rule_collection.value.spoke_prefixes

        content {
          name                  = rule.value.name
          source_addresses      = [network_rule_collection.value.hub_prefix]
          destination_addresses = [rule.value.cidr]
          protocols             = ["Any"]
          destination_ports     = ["*"]
        }
      }
    }
  }
}

额外优化建议:如果spoke_prefixes可能存在空值元素(比如空name或空cidr),可以在for_each里过滤掉无效项,避免生成无用规则:

for_each = [for s in network_rule_collection.value.spoke_prefixes : s if s.cidr != "" && s.name != ""]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:04:55