使用学生订阅通过GitHub Actions登录Azure时失败,显示“未找到订阅”
我正在使用GitHub Actions和 Azure运行一个机器学习重新训练流水线。
设置
- 我在一台Azure虚拟机上手动托管MLflow服务器
- 我使用一个 Azure学生订阅
- 工作流是手动触发的(
workflow_dispatch)
工作流逻辑
- 使用服务主体进行Azure身份验证
- 启动虚拟机
- SSH登录到虚拟机并执行重新训练
- 比较指标并注册模型(MLflow)
- 停止(取消分配)虚拟机
问题描述
在GitHub Actions工作流执行期间Azure登录失败,错误如下:
Run azure/login@v2
Running Azure CLI Login.
/usr/bin/az cloud set -n azurecloud
Done setting cloud: "azurecloud"
Attempting Azure CLI login by using service principal with secret...
Error: No subscriptions found for ***.
Error: Login failed with Error: The process '/usr/bin/az' failed with exit code 1.
GitHub Actions片段:
- name: Login to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
我怀疑的原因
ChatGPT建议这可能是因为Azure学生订阅的权限有限,但我并不完全信服。
提问
- Azure学生订阅是否会限制服务主体对订阅的访问?
- 在
azure/login期间导致 “No subscriptions found” 错误的原因是什么? - 如何为该工作流正确配置身份验证?
- 是否有其他替代方案来解决这个问题?
额外背景信息
- 服务主体凭据存储在
AZURE_CREDENTIALS - 虚拟机操作(
az vm start、az vm deallocate)依赖于成功登录 - 同一订阅通过Azure门户可以正常工作
解决方案
如果您不需要访问该订阅,可以将 allow-no-subscriptions: true 添加到输入列表中:
- name: Azure login (OIDC)
uses: azure/login@532459ea530d8321f2fb9bb10d1e0bcf23869a43 #v3.0.0
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
allow-no-subscriptions: true
如果您确实需要访问该订阅,请确保服务主体已被分配订阅。您可以通过为应用注册分配角色来实现:
# Get your app registration's client ID
APP_CLIENT_ID="<your-app-registration-client-id>"
# Get your subscription ID
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
# Assign Reader role at subscription scope
az role assignment create \
--assignee "$APP_CLIENT_ID" \
--role "Reader" \
--scope "/subscriptions/$SUBSCRIPTION_ID"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。