使用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,完全规避循环依赖:
- 调整你的自定义应用模块,移除内联的
application_identifier_uris参数配置,输出创建完成的应用ID - 在模块外(或模块内部应用注册资源之后)追加独立的标识符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:
- 第一次配置
application_identifier_uris为任意临时值,执行terraform apply完成应用注册,此时会生成真实的App ID - 修改配置为
application_identifier_uris = ["api://${module.你的应用模块输出.app_id}"],再次执行terraform apply更新标识符URI即可
内容的提问来源于stack exchange,提问作者Pallab
相关产品推荐
相关产品推荐

