问题描述
我尝试使用为服务主体授权初始化的 azurerm 提供程序运行 terraform,在 providers.tf 中具有以下内容(服务主体对订阅具有所有者访问权限并在其他代码中工作):
provider "azurerm" {
features {}
subscription_id = "SSSSSSSS-SSSS-SSSS-SSSS-SSSSSSSSSSSS"
client_id = "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
tenant_id = "<MY_TENANT_ID>"
client_secret = "<MY_CLIENT_SECRET>"
}
但是,当我运行 terraform plan
或 terraform apply
时,无法报告完全不同的客户端 ID:
错误:确保注册资源提供程序时出错。 [.... 一些无用的例子....] 原始错误:无法注册提供程序:Microsoft.ServiceFabricmesh、Microsoft.ManagedServices、Microsoft.DesktopVirtualization。错误是:无法向 Azure 资源管理器注册提供程序 Microsoft.ServiceFabricmesh:resources.ProvidersClient#Register:响应请求失败:StatusCode=403 -- 原始错误:autorest/azure:服务返回错误。 Status=403 Code="AuthorizationFailed" Message="对象 ID 为 'BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB' 的客户端 'BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB' 无权执行操作 ' Microsoft.ServiceFabricmesh/register/action' 超过范围 '/subscriptions/SSSSSSSS-SSSS-SSSS-SSSS-SSSSSSSSSSSS' 或范围无效。如果最近授予了访问权限,请刷新您的凭据。”。
换句话说,虽然我告诉 terraform 使用服务主体“AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA”,但它使用“BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB”代替。
很明显,我的代码中没有任何内容引用 ID 为“BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB”的服务主体。
设置 ARM_* 环境变量对此行为没有任何影响。
知道怎么会这样吗?
更新:我使用 terraform 0.14.3 和 azurerm 2.41。还尝试了 azurerm 2.32 - 它的行为相同。
解决方法
首先,您可以输出客户端 ID,以确保您使用的是正确的服务主体,该服务主体对您正在使用的订阅和租户具有适当的授权范围。
data "azurerm_client_config" "current" {
}
output "account_id" {
value = data.azurerm_client_config.current.client_id
}
此外,如果您使用服务主体凭据,请尝试重新生成您的密钥或服务主体。作为一种解决方法,您也可以跳过提供程序注册为
provider "azurerm" {
skip_provider_registration = true
}
最后,尝试升级您的 terraform 和 azurerm 提供程序以获得更好的体验。在某些版本中可能存在一些错误,请参阅 this1 和 this2。
,我解决了这个问题 - 但仍然不知道为什么 terraform 使用了不正确的服务主体 ID。
一旦我手动注册了组,当 terraform 尝试在不存在的组中创建资源时,'BBBBBBBB...' 主体 ID 的问题再次发生(RG 名称中存在拼写错误)。我仍然不明白为什么 terraform 报告的是奇怪的服务主体问题而不是错过了组,但现在问题已经消失了。
感谢所有帮助我缩小范围的人!