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环境变量的方式不生效。
具体修复配置:
改用Azure Login Action完成身份认证
替换手动设置环境变量的方式,使用官方的azure/loginAction来获取合法的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(推荐使用工作负载身份联邦,无需存储密钥)。
为身份配置存储账户权限
用于认证的身份(服务主体或工作负载身份)必须拥有存储账户的Storage Account Key Operator Service Role权限,确保Terraform能够获取存储账户密钥以访问后端状态文件。移除无效的MSI环境变量
删除export ARM_USE_MSI=true这条命令,Azure Login Action会自动设置正确的认证环境变量供Terraform使用,后续的terraform init和terraform plan命令保持原有逻辑即可。
内容的提问来源于stack exchange,提问作者Mike Cole
相关产品推荐
相关产品推荐

