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

Azure DevOps + Terraform 远程状态403授权失败问题排查求助

Azure DevOps公共代理执行Terraform init时访问Azure Storage远程状态报403权限错误

问题描述

本地使用Service Principal(SP)认证可正常访问存储在Azure Storage中的Terraform远程状态,但将部署流程迁移至Azure DevOps公共代理时,执行terraform init报错:

Error: Failed to get existing workspaces: listing blobs: 
executing request: unexpected status 403 (403 This request is not authorized to perform this operation.) with AuthorizationFailure: This request is not authorized to perform this operation.

已确认信息:

  • SP对存储账户及目标容器拥有正确权限
  • Azure DevOps服务连接配置无误

拒绝采用的方案:

  • 白名单Azure DevOps公共代理的250+IP地址
  • 允许存储账户接受任意网络流量

附Pipeline配置:

stages:
  - stage: validation
    jobs:
      - job: validate
        continueOnError: false
        steps:
          - task: TerraformInstaller@1
            displayName: tfinstall
            inputs:
              terraformVersion: 'v1.11.2'
          - task: TerraformTaskV4@4
            displayName: init
            inputs:
              provider: 'azurerm'
              command: 'init'
              workingDirectory: '$(workingFolder)'
              backendAzureRmUseEnvironmentVariablesForAuthentication: true
              backendServiceArm: 'landingzone-poc-sc'
              backendAzureRmResourceGroupName: '$(state_rg)'
              backendAzureRmStorageAccountName: '$(state_storage)'
              backendAzureRmContainerName: '$(state_container)'
              backendAzureRmKey: '$(state_key)'
          - task: TerraformTaskV4@4
            displayName: validate
            inputs:
              provider: 'azurerm'
              command: 'validate'

排查解决方案

1. 开启存储账户的「信任Azure服务访问」权限

如果存储账户配置了VNet/IP限制,可在存储账户的网络配置中开启「允许受信任的Azure服务访问此存储账户」选项。Azure DevOps公共代理属于Azure托管的受信任服务,开启后无需添加IP白名单即可访问存储账户。

2. 修正Terraform任务的认证配置冲突

当前init任务同时设置了backendAzureRmUseEnvironmentVariablesForAuthentication: true和backendServiceArm,两者存在配置冲突:

  • 若使用服务连接认证,需将backendAzureRmUseEnvironmentVariablesForAuthentication设为false,让任务直接调用服务连接的SP凭据
  • 若坚持使用环境变量认证,需确保Pipeline已注入ARM_CLIENT_ID、ARM_CLIENT_SECRET、ARM_TENANT_ID、ARM_SUBSCRIPTION_ID这四个SP核心环境变量

建议先改为服务连接直接认证测试,修改后的init任务配置:

- task: TerraformTaskV4@4
  displayName: init
  inputs:
    provider: 'azurerm'
    command: 'init'
    workingDirectory: '$(workingFolder)'
    backendAzureRmUseEnvironmentVariablesForAuthentication: false
    backendServiceArm: 'landingzone-poc-sc'
    backendAzureRmResourceGroupName: '$(state_rg)'
    backendAzureRmStorageAccountName: '$(state_storage)'
    backendAzureRmContainerName: '$(state_container)'
    backendAzureRmKey: '$(state_key)'

3. 确认SP拥有Blob容器的列表权限

错误核心是listing blobs操作失败,需确保SP拥有以下权限之一:

  • 存储账户/容器级别分配Storage Blob Data Contributor角色
  • 自定义角色包含Microsoft.Storage/storageAccounts/blobServices/containers/blobs/list/action权限

仅授予单个blob的读写权限,无法支持Terraform枚举工作空间的操作。

4. 验证服务连接的SP权限有效性

在Pipeline中添加Azure CLI任务,直接用服务连接的SP测试存储账户访问权限,确认权限是否真实生效:

- task: AzureCLI@2
  displayName: Test Storage Container Access
  inputs:
    azureSubscription: 'landingzone-poc-sc'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 测试列出存储账户下的容器
      az storage container list --account-name $(state_storage) --auth-mode login
      # 测试列出目标容器内的blob
      az storage blob list --container-name $(state_container) --account-name $(state_storage) --auth-mode login

如果此任务报错403,说明服务连接的SP确实无权限,需重新检查角色分配;如果能正常执行,再回到Terraform任务排查配置细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:50:01