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 planterraform 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:如何安装多个版本的提供程序插件? [复制]

具有 Terraform 的多个提供程序版本

如何使用 Terraform azurerm_app_service 指定 .net 核心版本

如何使 Azure 备份与 Terraform 一起使用?

Terraform - 部署到多个 Azure 订阅

将 azurerm_application_gateway 与 AKS 与 terraform 集成