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

使用Terraform修改Azure AD应用注册Application ID URI时如何获取实际App ID

解决方案

核心原因

你遇到的循环依赖是因为自定义应用模块把application_identifier_uris作为azuread_application资源的内联参数,而该资源的App ID要等资源创建完成才会生成,直接引用自身输出的属性就会触发循环。

可行解决方法

方法1:拆分配置,使用独立标识符URI资源(推荐)

Azure AD官方Terraform Provider提供了独立的azuread_application_identifier_uri资源,不需要将标识符URI作为应用注册资源的内联参数,可以实现创建应用后再配置符合要求的URI,完全规避循环依赖:

  1. 调整你的自定义应用模块,移除内联的application_identifier_uris参数配置,输出创建完成的应用ID
  2. 在模块外(或模块内部应用注册资源之后)追加独立的标识符URI配置:
# 引用你的内部自定义应用模块
module "contoso_api_app" {
  source = "./你的内部应用模块路径"
  # 其他应用注册所需基础配置参数
}

# 独立配置标识符URI
resource "azuread_application_identifier_uri" "api_uri" {
  application_id = module.contoso_api_app.app_id
  uri            = "api://${module.contoso_api_app.app_id}"
}

方法2:调整内部模块的资源逻辑

如果不希望修改外层配置,可以直接调整内部自定义模块的逻辑:

  • 模块内部先创建azuread_application基础资源,不配置identifier_uris参数
  • 模块内部追加azuread_application_identifier_uri资源,直接引用同模块下azuread_application资源的application_id属性生成URI
    配置示例(模块内部代码):
resource "azuread_application" "main" {
  display_name = "你的应用名称"
  # 其他所有应用配置,除了identifier_uris
}

resource "azuread_application_identifier_uri" "main" {
  application_id = azuread_application.main.application_id
  uri            = "api://${azuread_application.main.application_id}"
}

output "app_id" {
  value = azuread_application.main.application_id
}

临时 workaround 方案(不推荐,仅用于无法调整模块的场景)

如果暂时无法修改内部模块结构,可以分两次执行apply:

  1. 第一次配置application_identifier_uris为任意临时值,执行terraform apply完成应用注册,此时会生成真实的App ID
  2. 修改配置为application_identifier_uris = ["api://${module.你的应用模块输出.app_id}"],再次执行terraform apply更新标识符URI即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:03