使用Terraform Azapi更新应用注册ID URI时遇Provider错误求助
问题分析与解决方案
核心问题
你遇到的无法获取provider hashicorp/azapi的可用版本错误,本质是**azapi_update_resource的配置完全错误**,导致Terraform解析资源时出现异常,进而误触发了provider源的错误提示。你要更新的是Azure AD应用注册,但当前配置指向了Azure Web App的资源类型,完全不符合需求。
错误点拆解
- 资源类型错误:
type = "Microsoft.Web/sites@2022-03-01"是Azure Web App的资源类型,而应用注册属于Azure AD,对应的类型应为Microsoft.AAD/applicationRegistrations@2023-01-01(或其他兼容的API版本)。 - 父资源ID错误:
parent_id使用了服务主体(Service Principal)的object_id,但应用注册的更新应该直接指向应用注册自身的资源上下文,而非服务主体ID。 - provider版本未锁定:
required_providers中未指定azapi的版本,可能引发版本兼容问题。
修正后的配置
1. 更新provider.tf(添加版本约束)
terraform { required_providers { azapi = { source = "Azure/azapi" version = ">= 1.13.0" # 锁定版本范围,避免兼容问题 } azuread = { source = "hashicorp/azuread" version = ">= 2.41.0" } azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" } } backend "azurerm" { # 必要信息 } } provider "azuread" { tenant_id = "tenant_id" } provider "azapi" { subscription_id = "subscription_id" tenant_id = "tenant_id" }
2. 修正main.tf中的azapi_update_resource
resource "azapi_update_resource" "update_app_reg" { # 应用注册对应的Azure AD资源类型及API版本 type = "Microsoft.AAD/applicationRegistrations@2023-01-01" # 直接使用应用注册的object_id作为资源名称 name = azuread_application.app_reg.object_id # 父资源为租户ID,对应Azure AD的租户上下文 parent_id = "/tenants/${azuread_application.app_reg.tenant_id}" # 更新Application ID URI body = jsonencode({ "properties" = { "identifierUris" = [ "api://${azuread_application.app_reg.application_id}" ] } }) depends_on = [azuread_application.app_reg] }
更优替代方案
若你使用的azuread provider版本支持,更推荐直接在azuread_application资源中配置identifier_uris,无需额外使用azapi_update_resource,更符合Terraform声明式风格:
resource "azuread_application" "app_reg" { display_name = "your-app-reg-name" # 直接定义Application ID URI identifier_uris = ["api://${azuread_application.app_reg.application_id}"] # 其他配置项... }
内容的提问来源于stack exchange,提问作者Serhat
相关产品推荐
相关产品推荐

