ADO YML流水线中用SPN式Azure AD令牌认证Databricks CLI遇授权失败
解决Azure Databricks AAD令牌认证授权失败问题(ADO流水线/CLI场景)
根因分析
你遇到的Authorization failed. Your token may be expired or lack the valid scope错误,核心原因有两个:
- 服务主体(SPN)未被纳入Databricks工作区的用户体系——Azure门户配置的ADB资源参与者权限仅作用于Azure资源层,和Databricks工作区内部权限是独立的两套体系
- 请求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完成添加:
注:上述角色ID为「Workspace User」的默认ID,也可通过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"}] }'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 tsvhttps://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
相关产品推荐
相关产品推荐

