如何使用服务托管标识在 Azure 中使用 Terraform 预配资源

Posted

技术标签:

【中文标题】如何使用服务托管标识在 Azure 中使用 Terraform 预配资源【英文标题】:How to Use Service Managed identity to provision resource in Azure using Terraform 【发布时间】:2021-05-26 21:08:20 【问题描述】:

我遇到了与托管身份相关的错误。 我想在 Azure 中使用 Terraform 预配虚拟机。这是我的代码块:

terraform 
  # Use a recent version of Terraform
  required_version = ">= 0.13"

  # Map providers to thier sources, required in Terraform 13+
  required_providers 

    # Azure Resource Manager 2.x
    azurerm = 
      source  = "hashicorp/azurerm"
      version = "~> 2.0"
    
  


provider "azurerm" 
  
  features 
  use_msi = true
  //  subscription_id = "XXXXXXXXX-4663-4c2e-XXXX-XXXXXXXXX"
  // tenant_id       = "XXXXXXXXX-232r-3w2e-XXXX-XXXXXXXXX"

我尝试过启用use_msi = true 以及稍后启用tenant_id 和subscription_id

它提示我以下错误:

无法列出提供程序注册状态,这可能是由于凭据无效或服务主体没有使用资源管理器 API 的权限,Azure 错误:azure.BearerAuthorizer#WithAuthorization:无法刷新令牌对https://management.azure.com/subscriptions//providers?api-version=2016-02-01 的请求:StatusCode=0 -- 原始错误:MSI 端点不可用。对 MSI 端点的 HTTP 请求失败:获取“http://177.xxx.232.324/metadata/identity/oauth2/token?api-version=2018-02-01”:拨打 tcp 177.xxx.232.324:80:connectex:尝试对无法访问的网络进行套接字操作。

注意 我已经设置订阅了

az account set --subscription="XXXXXXXXXXXXXXXXXX"

但是没有成功。

我应该在我的代码库中保留什么或正确的方法是什么?

【问题讨论】:

【参考方案1】:

问题在于,您仅在设置 use_msi = true 时才告诉 Terraform 使用托管标识。我们需要在 Azure 环境中的managed identity support Azure services 上运行 terraform 工作区。 MSI 无法在本地环境中工作,因为我们无法为其启用身份。

正如that document 提到的:

我们建议在以下情况下使用服务主体或托管标识 以非交互方式运行 Terraform(例如在 CI/CD 管道),并在运行时使用 Azure CLI 进行身份验证 本地地形化。

例如,假设您有一个启用了系统分配身份的 Azure VM。

为此身份分配权限。

将 Terraform 配置为使用托管标识。请注意,将 use_msi 设置为 true 会告诉 Terraform 使用托管标识。然后,您可以使用此 MSI 向 Azure 进行身份验证,以创建其他 Azure 资源。

RDP 到 Azure VM 并运行 Terraform 命令。以下示例代码使用系统分配的标识在我当前的订阅中创建一个资源组。

provider "azurerm" 
  
  subscription_id = var.subscription_id
  # client_id       = var.client_id
  # client_secret   = var.client_secret
  tenant_id       = var.tenant_id

  # skip_provider_registration = true

 features 

 use_msi = true



terraform 
  required_providers 
    azurerm = 
    source = "hashicorp/azurerm"
    # version = "=2.46.0"
    

  


data "azurerm_subscription" "current" 

resource "azurerm_resource_group" "example" 
  name     = "example-resources"
  location = "West US"



output "current_subscription_display_name" 
  value = data.azurerm_subscription.current.display_name

【讨论】:

以上是关于如何使用服务托管标识在 Azure 中使用 Terraform 预配资源的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure 托管服务标识和应用服务身份验证的服务到服务身份验证?

为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?

C# - 具有托管服务标识的 Azure 存储 [关闭]

为我的应用服务使用托管标识时,Azure 服务总线的连接字符串的正确格式是啥?

Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?

如何使用用户分配的托管标识访问 Azure 中 Function App Config 的 Key Vault