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

Terraform资源间for_each链式调用报错问题排查

Terraform AzureAD 资源链式调用错误排查与修复

错误根源分析

第一个错误:Missing resource instance key

当资源通过for_each创建多实例时,不能直接通过资源名访问全局属性(如azuread_application.my-test-app.application_id),必须指定具体的实例键(如azuread_application.my-test-app[each.key]),否则Terraform无法确定要引用哪个实例的属性。

第二个错误:Unsupported attribute

你调整后出现这个错误,是因为错误地将azuread_service_principal的for_each设置为var.custom_ids(字符串集合),此时each.value是字符串类型,自然没有application_id属性。正确的做法是让service_principal的for_each关联到azuread_application的实例集合,这样each.value才是AzureAD应用实例对象,包含application_id等属性。

另外还有一个隐藏问题:azuread_service_principal的owners字段中,你写的each.value是应用实例对象,而该字段需要的是用户/组的Object ID字符串,这里应该对应到var.custom_ids中的原始值。

修正后的完整代码

variables.tf

variable "custom_ids" {
  type    = set(string)
  default = ["b4d2d", "c928f140e8"]
}

main.tf

data "azuread_client_config" "current" {}

resource "azuread_application" "my-test-app" {
  for_each     = var.custom_ids
  display_name = "testing-application"
  owners       = [data.azuread_client_config.current.object_id, each.value]
}

resource "azuread_service_principal" "testing-sp" {
  # 关联到azuread_application的实例集合,每个应用对应一个服务主体
  for_each                     = azuread_application.my-test-app
  # 直接引用当前实例的application_id
  application_id               = each.value.application_id
  app_role_assignment_required = false
  # owners使用var.custom_ids中的原始值(each.key对应集合中的元素)
  owners                       = [data.azuread_client_config.current.object_id, each.key]
}

关键修正点说明

  • azuread_service_principal的for_each设置为azuread_application.my-test-app,实现应用与服务主体的一一对应链式创建。
  • application_id使用each.value.application_id,each.value此时是azuread_application的实例对象,可直接访问其属性。
  • owners字段替换为each.key,因为each.key对应var.custom_ids中的字符串(即你要设置的Owner ID),而each.value是应用实例,不能直接作为Owner ID使用。

内容的提问来源于stack exchange,提问作者Container-Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:36:26