【问题标题】:How to Use Service Managed identity to provision resource in Azure using Terraform如何使用服务托管标识在 Azure 中使用 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"

但是没有成功。

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

【问题讨论】:

    标签: azure terraform terraform-provider-azure


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多