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

Terraform嵌套for_each配合data块关联Azure订阅与管理组报错排查

Terraform Azure管理组关联订阅重复键报错解决

报错根因

  • 双层嵌套for循环生成了笛卡尔积结果:你定义的映射关系共2组,双层遍历会生成2*2=4条匹配记录,每个管理组ID会对应2条不同的订阅记录,构建map时自然触发重复键错误。
  • 逻辑冗余:两个数据源块都以var.subscription_mg_map作为for_each入参,三者的键完全一致(即你定义的1、2两个序号键),同键下的管理组、订阅本身就是一一对应的配对关系,不需要做跨键全组合。
  • 资源参数传值错误:原代码中subscription_id传入了整个结构化对象,而非订阅ID字段值,即使解决重复键问题也会触发参数类型不匹配报错。

正确实现代码

你定义的输入变量、数据源块写法本身没有问题,只需要删除冗余的local处理逻辑,直接通过对齐的for_each键关联两个数据源的返回值即可:

variable "subscription_mg_map" {
  type = map(object({
    subId  = string
    mgName = string
  }))
  default = {
    1 : { subId = "1234", mgName = "MG-1" },
    2 : { subId = "5678", mgName = "MG-2" }
  }
}

data "azurerm_management_group" "mg" {
  for_each = var.subscription_mg_map
  name     = each.value["mgName"]
}

data "azurerm_subscription" "sub" {
  for_each        = var.subscription_mg_map
  subscription_id = each.value["subId"]
}

resource "azurerm_management_group_subscription_association" "mg_association" {
  for_each = var.subscription_mg_map

  management_group_id = data.azurerm_management_group.mg[each.key].id
  subscription_id     = data.azurerm_subscription.sub[each.key].id
}

该写法直接复用输入变量的键做关联,完全匹配你定义的订阅-管理组映射关系,不会出现错配、重复键问题,也不需要额外的中间数据转换逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:09:31