Terraform azurerm 提供程序尝试使用错误的凭据进行注册
Posted
技术标签:
【中文标题】Terraform azurerm 提供程序尝试使用错误的凭据进行注册【英文标题】:Terraform azurerm provider tries to register with wrong credentials 【发布时间】:2021-04-12 17:15:15 【问题描述】:我尝试使用为服务主体授权初始化的 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 使用服务主体“AAAAAAAAA-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 - 它的行为相同。
【问题讨论】:
Terraform 版本?提供者版本? 你能展示你的 terraform 模板的全部内容吗?从错误来看,它看起来像Cannot register provider Microsoft.ServiceFabricMesh with Azure Resource Manager: resources.ProvidersClient
。您可以参考Resolve errors for resource provider registration。另外,我建议重新创建一个新的sp,那么这个问题可以重现吗?
身份验证优先级,也许?
Nancy,感谢您将我指向资源提供者注册文档。在这里我们可以看到 terraform 尝试使用错误的 SPN 注册提供程序,但失败了。一旦我在 Azure 门户中手动注册它们,错误的 SPN 就会在稍后报告。所以错过供应商不是问题,错误的 SPN 才是问题。
也许一些环境变量也定义了服务主体?
【参考方案1】:
首先,您可以输出客户端 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 提供程序以获得更好的体验。部分版本可能存在bug,参考this1和this2。
【讨论】:
感谢您的想法,但在我的情况下,terraform 在运行任何其他资源或输出之前会显示此错误。这是不可能以这种方式调试的。这不依赖于skip_provider_registration 或skip_credentials_validation。我正在使用 terraform 0.14.3 和 azurerm 2.41(也尝试了 2.32,结果相同)。 您设置的环境变量是否会影响这一点?您如何运行 terraform 代码并使用 azure provider(SP 除外)进行身份验证?【参考方案2】:我解决了这个问题 - 但仍然不知道为什么 terraform 使用了不正确的服务主体 ID。
一旦我手动注册了组,当 terraform 尝试在不存在的组中创建资源时,“BBBBBBBB...”主体 ID 的问题再次发生(RG 名称中有错字)。我仍然不明白为什么 terraform 报告了奇怪的服务主体问题而不是错过了组,但问题现在已经消失了。
感谢所有帮助我缩小范围的人!
【讨论】:
以上是关于Terraform azurerm 提供程序尝试使用错误的凭据进行注册的主要内容,如果未能解决你的问题,请参考以下文章
Terraform:如何安装多个版本的提供程序插件? [复制]