You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action中用托管身份通过Terraform认证Azure遇身份未找到错误

问题:GitHub Action中使用托管身份认证Terraform Azure Provider失败

我正尝试在GitHub Action中使用托管身份对Terraform Azure Provider进行认证,相关配置如下:

Terraform配置

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.105.0"
    }
  }
  backend "azurerm" {}
}

provider "azurerm" {
  features {}
}

GitHub Action脚本

export ARM_USE_MSI=true
export ARM_SUBSCRIPTION_ID=${{ inputs.azure_subscription_id }}
export ARM_TENANT_ID=${{ inputs.azure_tenant_id }}
terraform init -reconfigure -backend-config="backends/${{ inputs.env }}.conf"
terraform plan -var-file="${{ inputs.env }}.tfvars" -var='hosts=${sites}'

错误信息

Error: Failed to get existing workspaces: Error retrieving keys for Storage Account "<storage account name>": azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://management.azure.com/subscriptions/<subscriptionid>/resourceGroups/<resource group>/providers/Microsoft.Storage/storageAccounts/<storage account name>/listKeys?api-version=2021-01-01: StatusCode=400 -- Original Error: adal: Refresh request failed. Status Code = '400'. Response body: {"error":"invalid_request","error_description":"Identity not found"} Endpoint http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F

错误发生在访问后端存储账户时,请问缺少哪些配置?


缺失的配置与修复步骤

核心问题:GitHub托管Runner无法访问Azure MSI元数据端点

ARM_USE_MSI=true依赖Azure内部的元数据端点http://169.254.169.254获取凭证,但GitHub Action的托管运行环境不在Azure资源内部,无法访问该端点,因此直接使用MSI环境变量的方式不生效。

具体修复配置:

  1. 改用Azure Login Action完成身份认证
    替换手动设置环境变量的方式,使用官方的azure/login Action来获取合法的Azure身份凭证,该Action会自动配置Terraform所需的环境变量。示例配置:

    - name: Azure Login
      uses: azure/login@v1
      with:
        client-id: ${{ secrets.AZURE_CLIENT_ID }}
        tenant-id: ${{ inputs.azure_tenant_id }}
        subscription-id: ${{ inputs.azure_subscription_id }}
    

    这里需要通过工作负载身份联邦或服务主体密钥来配置Azure Login(推荐使用工作负载身份联邦,无需存储密钥)。

  2. 为身份配置存储账户权限
    用于认证的身份(服务主体或工作负载身份)必须拥有存储账户的Storage Account Key Operator Service Role权限,确保Terraform能够获取存储账户密钥以访问后端状态文件。

  3. 移除无效的MSI环境变量
    删除export ARM_USE_MSI=true这条命令,Azure Login Action会自动设置正确的认证环境变量供Terraform使用,后续的terraform init和terraform plan命令保持原有逻辑即可。


内容的提问来源于stack exchange,提问作者Mike Cole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:50:16