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

Terraform for_each结合条件判断因元组长度不一致报错求助

Terraform azuread_users 元组长度不一致问题解决方案

问题根源

当通过条件表达式在生产(50个应用注册)、开发(30个应用注册)环境间切换时,Terraform会将固定长度的列表识别为元组类型,而条件表达式要求两个分支的元组长度完全一致,因此触发报错。

解决方案

方案1:类型标准化消除长度限制

将条件表达式返回的结果转换为list类型,Terraform对可变长度的list不会强制要求分支长度一致。修改后的代码如下:

data "azuread_users" "ownerids" {
  for_each = {
    for appregistration in tolist(var.TenantName == "prodTenant" ? local.appregistrations_prod : local.appregistrations_dev) :
    appregistration.name => appregistration
  }
  user_principal_names = each.value.owners
}

如果你的local.appregistrations_prod和local.appregistrations_dev本身是硬编码的元组(如[{}, {}]),也可以直接在local定义时用tolist()转换:

locals {
  appregistrations_prod = tolist([
    # 生产环境应用注册配置
  ])
  appregistrations_dev = tolist([
    # 开发环境应用注册配置
  ])
}

方案2:拆分环境独立处理

直接为不同环境定义单独的data块,通过count控制是否启用,彻底避免条件表达式的类型冲突:

# 生产环境用户查询
data "azuread_users" "ownerids_prod" {
  count = var.TenantName == "prodTenant" ? length(local.appregistrations_prod) : 0
  user_principal_names = local.appregistrations_prod[count.index].owners
}

# 开发环境用户查询
data "azuread_users" "ownerids_dev" {
  count = var.TenantName == "prodTenant" ? 0 : length(local.appregistrations_dev)
  user_principal_names = local.appregistrations_dev[count.index].owners
}

# 统一结果,方便后续引用
locals {
  ownerids = merge(
    { for idx, user in data.azuread_users.ownerids_prod : local.appregistrations_prod[idx].name => user },
    { for idx, user in data.azuread_users.ownerids_dev : local.appregistrations_dev[idx].name => user }
  )
}

后续代码中直接引用local.ownerids即可,无需区分环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:12:44