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

