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
相关产品推荐
相关产品推荐

