使用服务主体从 DevOps 管道调用 Databricks API

Call Databricks API from DevOps Pipeline using Service principal

我希望能够从 DevOps 管道调用 Databricks API。我可以为我的帐户使用个人访问令牌来执行此操作,但是我想使 API 调用独立于用户,因此我想使用服务主体(应用程序注册)。我按照本教程 https://docs.microsoft.com/en-us/azure/databricks/dev-tools/api/latest/aad/service-prin-aad-token 为服务主体创建了访问令牌,但是我遇到了 2 个问题:

  1. 这样生成的令牌将在 1 小时后过期 - 有什么优雅的方法可以自动刷新它吗?
  2. 即使在使用此令牌调用 ADB API 时,我也会收到 403 unauthorized - 我还应该做些什么吗?应用程序注册具有 ADB 服务的贡献者角色。

编辑:添加 API AzureDatabricks 在应用程序注册中的权限并授予管理员同意,但仍然没有成功。

  1. such generated token expires in 1 hour - is there any elegant was to automatically refresh it?

没有,client credentials flow doesn't support refresh token. You can try to get a new token, please refer to this

  1. even when calling the ADB API using this token I get 403 unauthorized - is there anything else I should do? The app registration has User role for the ADB service.

确保为您的服务主体分配了贡献者角色。

在不同的情况下有两种资源。

  1. API 访问作为 Azure Databricks 工作区用户和管理员的服务主体

    resource=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d

  2. API 对非工作区用户的服务主体的访问权限

    resource=https://management.core.windows.net/

最后我找到了 3 种可能的解决方案。

  1. 为服务主体生成访问令牌,为服务主体生成管理服务令牌并使用这两者来访问 Databricks API - reference
  2. 使用访问令牌和管理令牌为使用 Databricks 令牌的服务主体生成 Databricks 个人访问令牌 API,然后您可以将其用于 Databricks CLI - reference
  3. 使用 AAD 令牌通过 CLI 向 Databricks 进行身份验证(reference 和 Databricks CLI 帮助):
    1. az login --service-principal -u <app-id> -p <app-password> --tenant <tenant-id>
    2. token_response=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d)
    3. export DATABRICKS_AAD_TOKEN=$(jq .accessToken -r <<< "$token_response")
    4. databricks configure --host https://<adb-url> --aad-token