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
相关产品推荐
相关产品推荐

