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

