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

