如何在Azure DevOps Pipeline中使用服务主体认证调用Databricks任务?
服务主体认证Databricks的正确方式(Azure DevOps Pipeline)
首先明确:完全支持用服务主体(SP)替代个人Token认证Databricks,核心是通过Azure AD获取Databricks的短期访问令牌,而非直接使用SP的客户端密钥。
前置确认(你已完成大部分,再核对)
- 服务主体已添加到Databricks工作区(可通过Azure门户的Databricks资源页→访问控制→添加,或Databricks工作区控制台→Admin→Service Principals添加)
- 服务主体在Databricks工作区拥有足够权限(比如Contributor,或对应任务所需的具体权限)
- Azure DevOps中已配置SP的三个关键参数(建议存在变量组/Key Vault,避免明文):
AZURE_CLIENT_ID:SP的应用IDAZURE_CLIENT_SECRET:SP的客户端密钥AZURE_TENANT_ID:你的Azure AD租户ID
修改后的Pipeline YAML代码
替换你原有bash任务的env部分,新增Azure CLI登录和令牌获取步骤:
- bash: | # 安装Databricks Azure CLI扩展(如果已安装可跳过) az extension add --name databricks --upgrade # 用服务主体登录Azure az login --service-principal -u $(AZURE_CLIENT_ID) -p $(AZURE_CLIENT_SECRET) --tenant $(AZURE_TENANT_ID) # 获取Databricks短期访问令牌 DATABRICKS_TOKEN=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv) # 后续保持原有脚本逻辑,使用获取到的令牌 find $(bashHome) -type f -exec chmod u+x {} \; cat > job-params.json << EOF { "param1": "$(PARAM1)", "param2": "$(PARAM2)" } EOF cat job-params.json echo "DATABRICKS JOB NAME: $(DATABRICKS_JOB_NAME)" RUN_ID=$($(run_databricks_sh) $(DATABRICKS_JOB_NAME) job-params.json) env: DATABRICKS_HOST: $(DATABRICKS_HOST) # 这里不再用个人Token,而是通过脚本动态设置DATABRICKS_TOKEN displayName: 'Run Databricks Job with Service Principal'
关键说明
az account get-access-token中的resource参数2ff814a6-3304-4ab8-85cb-cd0e6f879c1d是Databricks服务的固定Azure AD资源ID,无需修改- 获取到的令牌是短期有效(默认1小时),避免了个人Token长期有效带来的安全风险
- 如果你的Pipeline使用了Azure DevOps的Azure Resource Manager服务连接,也可以用
AzureCLI任务简化登录,无需手动输入SP参数:
- task: AzureCLI@2 inputs: azureSubscription: '<你的ARM服务连接名>' scriptType: bash scriptLocation: inlineScript inlineScript: | DATABRICKS_TOKEN=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv) # 后续原有脚本逻辑... env: DATABRICKS_HOST: $(DATABRICKS_HOST)
常见排查点
- 如果认证失败,检查SP是否在Databricks工作区被正确授予权限(可在Databricks工作区→Admin→Service Principals中查看权限)
- 确保Azure DevOps中的SP参数(客户端ID、密钥、租户ID)正确无误
- 检查Azure CLI版本是否足够新,旧版本可能不支持Databricks扩展的某些命令
内容的提问来源于stack exchange,提问作者jbtt
相关产品推荐
相关产品推荐

