如何在GitHub Actions工作流中用联合凭据运行Python Azure SDK
解决GitHub Actions中Azure联合凭据传递到Python脚本的问题
问题场景
我有一个需与Azure SDK交互(列出和上传Blob)的Python工具,核心代码如下:
from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient creds = DefaultAzureCredential() client = BlobServiceClient("https://<你的存储账户>.blob.core.windows.net/", credential=creds)
我需要在GitHub Actions工作流中运行该脚本,必须使用联合凭据进行认证。已配置好带有联合身份的服务主体,能通过azure/login Action完成登录,但运行Python脚本时出现权限错误:
azure.core.exceptions.HttpResponseError: This request is not authorized to perform this operation using this permission.
我的简化工作流配置如下:
jobs: execute: runs-on: ubuntu-latest steps: # checkout及其他前置步骤 # ... - name: AZ Login uses: Azure/login@v1 with: client-id: ${{ vars.AZURE_CLIENT_ID }} subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }} tenant-id: ${{ vars.AZURE_TENANT_ID }} # 配置Python环境步骤 # ... - name: Run script run: | .venv/bin/python script.py
问题
如何将azure/login步骤中的凭据传递到Python运行时环境中?
解决方案
1. 确保Azure Identity SDK版本达标
DefaultAzureCredential自动识别GitHub Actions环境变量的功能需要azure-identity版本≥1.12.0。在依赖安装步骤明确指定版本:
- name: Install dependencies run: | .venv/bin/pip install azure-identity>=1.12.0 azure-storage-blob
2. 无需修改Python代码,依赖默认认证链
azure/login Action会自动在工作流环境中设置以下关键变量:
AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_ACCESS_TOKENAZURE_SUBSCRIPTION_ID
DefaultAzureCredential的默认认证链会自动检测这些环境变量,使用EnvironmentCredential完成认证,因此你无需修改原有的Python代码,保持creds = DefaultAzureCredential()即可。
3. 验证服务主体的权限配置
权限错误大概率是服务主体权限不足导致的,而非凭据传递问题:
- 给服务主体分配Storage Blob Data Contributor角色(不要用普通的Contributor角色,Blob操作需要专属的数据权限)
- 确保角色分配的范围覆盖目标存储账户(或其所在的资源组/订阅)
4. 可选:显式使用EnvironmentCredential(默认链失效时)
如果默认认证链未自动拾取环境变量,可以显式指定EnvironmentCredential:
from azure.identity import EnvironmentCredential from azure.storage.blob import BlobServiceClient creds = EnvironmentCredential() client = BlobServiceClient("https://<你的存储账户>.blob.core.windows.net/", credential=creds)
5. 调试环境变量(可选)
可以在运行脚本前添加调试步骤,确认azure/login是否正确设置了环境变量:
- name: 检查Azure环境变量 run: | echo "AZURE_CLIENT_ID: $AZURE_CLIENT_ID" echo "AZURE_TENANT_ID: $AZURE_TENANT_ID" echo "AZURE_ACCESS_TOKEN 是否存在: $([ -n "$AZURE_ACCESS_TOKEN" ] && echo "是" || echo "否")"
内容的提问来源于stack exchange,提问作者everspader
相关产品推荐
相关产品推荐

