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

ADO YML流水线中用SPN式Azure AD令牌认证Databricks CLI遇授权失败

解决Azure Databricks AAD令牌认证授权失败问题(ADO流水线/CLI场景)

根因分析

你遇到的Authorization failed. Your token may be expired or lack the valid scope错误,核心原因有两个:

  1. 服务主体(SPN)未被纳入Databricks工作区的用户体系——Azure门户配置的ADB资源参与者权限仅作用于Azure资源层,和Databricks工作区内部权限是独立的两套体系
  2. 请求AAD令牌时使用的范围不正确,或SPN的API权限未完成管理员同意

分步解决

1. 将SPN加入Databricks工作区(必做前提)

你提到无法添加SPN到工作区,这里提供两种可行方式:

  • UI操作:
    登录Databricks工作区,进入「Admin Console」→「Users」,点击「Add User/Service Principal」,选择「Service Principal」,输入SPN的应用ID或名称,找到对应主体后添加,至少分配「Workspace User」角色(若需部署权限,可选择「Workspace Admin」或自定义权限组)
  • API操作(适合自动化场景):
    用拥有工作区管理员权限的账号生成PAT,调用SCIM API完成添加:
    curl -X POST -n https://<你的Databricks实例域名>/api/2.0/preview/scim/v2/ServicePrincipals \
    -H "Authorization: Bearer <你的PAT令牌>" \
    -H "Content-Type: application/json" \
    -d '{
      "applicationId": "<SPN的应用ID>",
      "displayName": "<SPN显示名称>",
      "roles": [{"value": "6a98d4b5-8519-45d8-bb36-71921d615935"}]
    }'
    
    注:上述角色ID为「Workspace User」的默认ID,也可通过GET /api/2.0/preview/scim/v2/Roles接口查询其他角色ID

2. 修正AAD令牌的请求范围

生成令牌时必须指定你的Databricks工作区实例完整URL + /.default作为资源范围,不能使用通用的https://databricks.azure.net/:

  • Azure CLI生成令牌的正确命令:
    az account get-access-token --resource https://<你的Databricks实例域名> --query "accessToken" -o tsv
    
    例如你的工作区地址是https://eastus.azuredatabricks.net,就以此作为--resource参数的值

3. 补全SPN的API权限配置

回到Azure门户的SPN页面,检查「API权限」:

  • 确认已添加「Azure Databricks」的user_impersonation权限
  • 关键操作:点击「授予管理员同意」,否则权限不会实际生效

4. ADO流水线的配置调整

在YML流水线中,通过Azure CLI任务获取正确令牌后,再传入Databricks部署任务:

- task: AzureCLI@2
  inputs:
    azureSubscription: '<你的SPN服务连接>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 获取适配当前Databricks工作区的AAD令牌
      DATABRICKS_TOKEN=$(az account get-access-token --resource https://<你的Databricks实例域名> --query "accessToken" -o tsv)
      echo "##vso[task.setvariable variable=DATABRICKS_TOKEN]$DATABRICKS_TOKEN"
- task: DatabricksDeployScripts@0
  inputs:
    azureSubscription: '<你的SPN服务连接>'
    databricksWorkspaceUrl: 'https://<你的Databricks实例域名>'
    databricksToken: '$(DATABRICKS_TOKEN)'
    sourceFolder: '<你的笔记本源码目录>'
    targetFolder: '/Workspace/Shared'

验证方法

先通过CLI验证认证是否正常:

# 获取令牌
export DATABRICKS_TOKEN=$(az account get-access-token --resource https://<你的Databricks实例域名> --query "accessToken" -o tsv)
# 调用Databricks API测试权限
curl -n https://<你的Databricks实例域名>/api/2.0/workspace/list -H "Authorization: Bearer $DATABRICKS_TOKEN" -d '{"path": "/Workspace"}'

如果返回工作区目录的JSON数据,说明认证成功,再运行ADO流水线即可正常部署

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:01:04