使用学生订阅通过GitHub Actions登录Azure时失败,显示“未找到订阅”

编程语言 2026-07-11

我正在使用GitHub Actions和 Azure运行一个机器学习重新训练流水线。

设置

  • 我在一台Azure虚拟机上手动托管MLflow服务器
  • 我使用一个 Azure学生订阅
  • 工作流是手动触发的(workflow_dispatch

工作流逻辑

  1. 使用服务主体进行Azure身份验证
  2. 启动虚拟机
  3. SSH登录到虚拟机并执行重新训练
  4. 比较指标并注册模型(MLflow)
  5. 停止(取消分配)虚拟机

问题描述

在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学生订阅的权限有限,但我并不完全信服。

提问

  1. Azure学生订阅是否会限制服务主体对订阅的访问?
  2. azure/login 期间导致 “No subscriptions found” 错误的原因是什么?
  3. 如何为该工作流正确配置身份验证?
  4. 是否有其他替代方案来解决这个问题?

额外背景信息

  • 服务主体凭据存储在 AZURE_CREDENTIALS
  • 虚拟机操作(az vm startaz 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章