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

Terraform中跨资源块引用带for_each的资源值报错求助

解决Terraform中无for_each资源引用带for_each数据源的问题

问题场景

你需要在Terraform的资源块中引用带for_each的数据源的值:

  • 数据源data.azuread_application.example通过for_each遍历var.application_ids获取对应应用信息
  • 资源azuread_application.current未设置for_each,但需要引用数据源中的应用ID来配置所有者

使用的Terraform代码:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "<=2.39.0"
    }
  }
  required_version = ">= 0.13"
}

data "azuread_client_config" "current" {

}

data "azuread_application" "example" {
  for_each = toset(var.application_ids)
  application_id = each.value
}

resource "azuread_application" "current" {
  display_name = "terraform-sp-${var.display_name}"
  owners       = tolist([data.azuread_application.example[each.value].object_id, data.azuread_client_config.current.object_id])

}

遇到的错误:

Reference to "each" in context without for_each
│
│   on main.tf line 23, in resource "azuread_application" "current":
│   23:   owners       = tolist([data.azuread_application.example[each.key].object_id, data.azuread_client_config.current.object_id])
The "each" object can be used only in "module" or "resource" blocks, and only when the "for_each" argument is set.

错误原因

each对象仅能在设置了for_each的模块或资源块中使用。当前资源块azuread_application.current未配置for_each,因此无法调用each;同时数据源是for_each生成的集合类型,直接用each无法定位到具体元素。

解决方案

根据实际需求选择以下两种方案:

方案1:创建单个应用,添加所有数据源中的应用为所有者

如果只需要创建一个Azure AD应用,并把var.application_ids对应的所有应用都设为该应用的所有者,使用for表达式遍历数据源集合提取所有object_id:

resource "azuread_application" "current" {
  display_name = "terraform-sp-${var.display_name}"
  owners       = concat(
    # 遍历数据源,提取每个应用的object_id
    [for app in data.azuread_application.example : app.object_id],
    # 添加当前客户端的object_id
    [data.azuread_client_config.current.object_id]
  )
}

方案2:为每个应用ID创建对应的应用

如果需要为var.application_ids中的每个应用ID单独创建一个Azure AD应用,给资源块添加for_each,与数据源保持一致:

resource "azuread_application" "current" {
  # 与数据源使用相同的for_each集合
  for_each = toset(var.application_ids)
  
  # 给display_name添加each.value避免应用重名
  display_name = "terraform-sp-${var.display_name}-${each.value}"
  owners       = tolist([
    # 通过each.value定位到数据源中对应的应用object_id
    data.azuread_application.example[each.value].object_id,
    data.azuread_client_config.current.object_id
  ])
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:32:21