Databricksを使用してサービスプリンシパルで へのアクセスを認証するOAuth (OAuth M2M)

この記事では、 Databricks サービスプリンシパルを作成し、それを使用して OAuthでターゲット エンティティに対して認証する方法について説明します。

ステップ 1: サービスプリンシパルを作成する

アカウント admins とワークスペース admins は、サービスプリンシパルを作成できます。 このステップでは、ワークスペースでのサービスプリンシパルの作成について説明します。 アカウントコンソールを使用するには、「 アカウントでのサービスプリンシパルの管理」を参照してください。

  1. ワークスペース管理者として、Databrickワークスペースにログインします。

  2. Databricksワークスペースの上部のバーにあるユーザー名をクリックし、[設定]を選択します。

  3. [IDとアクセス] タブをクリックします。

  4. サービスプリンシパルの横にある [管理] をクリックします。

  5. [サービスプリンシパルの追加] をクリックします。

  6. 検索ボックスのドロップダウン矢印をクリックし、[新規追加] をクリックします。

  7. サービスプリンシパルの名前を入力します。

  8. [追加] をクリックします。

サービスプリンシパルはワークスペースとDatabricksアカウントの両方に追加されます。

ステップ 2: サービスプリンシパルに権限を割り当てる

  1. サービスプリンシパルの名前をクリックして、その詳細ページを開きます。

  2. 「構成」タブで、このワークスペースに対してサービスプリンシパルに付与する各権限の横にあるボックスを選択し、「更新」をクリックします。

  3. [ アクセス許可 ] タブで、このサービスプリンシパルを管理および使用する任意の Databricks ユーザー、サービスプリンシパル、およびグループにアクセス権を付与します。 「サービスプリンシパルでの役割の管理」を参照してください。

ステップ3: サービスプリンシパルのOAuthシークレットを作成する

OAuthを使用してDatabricksを認証する前に、まずOAuthアクセストークンの生成に使用するOAuthシークレットを作成する必要があります。サービスプリンシパルには、最大5つのOAuthシークレットを設定できます。アカウント管理者とワークスペース管理者は、サービスプリンシパルのOAuthシークレットを作成できます。

  1. サービスプリンシパルの詳細ページで、[ シークレット ] タブをクリックします。

  2. [OAuthシークレット] で、[シークレットを生成] をクリックします。

    ワークスペースから OAuth シークレットを生成する
  3. 表示されたシークレットクライアントIDをコピーし、[完了] をクリックします。

シークレットは作成中に一度だけ明らかにされます。クライアントID は、サービスプリンシパルのアプリケーションIDと同じです。

アカウント 管理者は、アカウント コンソールのサービスプリンシパル 詳細ページから OAuth シークレットを生成することもできます。

  1. アカウント管理者として、アカウントコンソールにログインします。

  2. アカウントコンソールのユーザー管理アイコン [ユーザー管理]をクリックします。

  3. [サービスプリンシパル] タブで、サービスプリンシパルを選択します。

  4. [OAuthシークレット] で、[シークレットを生成] をクリックします。

    ワークスペースから OAuth シークレットを生成する
  5. 表示されたシークレットクライアントIDをコピーし、[完了] をクリックします。

注:

サービスプリンシパルでクラスターやSQLウェアハウスを使用できるようにするには、サービスプリンシパルにこれらへのアクセス権を付与する必要があります。詳しくは、「コンピュート権限」または「SQLウェアハウスを管理する」を参照してください。

ステップ 4: OAuth M2M 認証を使用する

OAuth M2M 認証を使用するには、次の関連する環境変数 ( .databrickscfg フィールド、Terraform フィールド、または Config フィールド) を設定する必要があります。

  • Databricksホスト。アカウント操作の場合はhttps://accounts.cloud.databricks.comを、ワークスペース操作の場合はターゲットワークスペースのURL(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com)を指定します。

  • Databricksアカウント操作用のDatabricksアカウントID。

  • サービスプリンシパルのクライアントID。

  • サービスプリンシパルのシークレット。

OAuth M2M認証を実行するには、参加しているツールまたはSDKに基づいて、コード内に以下を統合します。

ツールまたは SDK で特定の Databricks 認証の種類の環境変数を使用するには、「 Databricks リソースへのアクセスを認証 する」またはツールまたは SDK のドキュメントを参照してください。 クライアント統合認証の環境変数とフィールドおよびクライアント統合認証のデフォルト方式も参照してください。

アカウントレベルの操作では、以下の環境変数を設定します。

  • DATABRICKS_HOST:DatabricksアカウントのコンソールURL(https://accounts.cloud.databricks.com)に設定されます。

  • DATABRICKS_ACCOUNT_ID

  • DATABRICKS_CLIENT_ID

  • DATABRICKS_CLIENT_SECRET

ワークスペースレベルの操作では、以下の環境変数を設定します。

  • DATABRICKS_HOSTをDatabricksワークスペースのURLに設定します(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com)。

  • DATABRICKS_CLIENT_ID

  • DATABRICKS_CLIENT_SECRET

Databricks 構成プロファイル を作成または識別し、 .databrickscfg ファイルに次のフィールドを含めます。 プロファイルを作成する場合は、プレースホルダを適切な値に置き換えます。 ツールまたは SDK でプロファイルを使用するには、「 Databricks リソースへのアクセスを認証 する」またはツールまたは SDK のドキュメントを参照してください。 クライアント統合認証の環境変数とフィールドおよびクライアント統合認証のデフォルト方式も参照してください。

アカウントレベルの操作の場合は、.databrickscfgファイルに以下の値を設定します。この場合、DatabricksアカウントのコンソールURLはhttps://accounts.cloud.databricks.comとなります。

[<some-unique-configuration-profile-name>]
host          = <account-console-url>
account_id    = <account-id>
client_id     = <service-principal-client-id>
client_secret = <service-principal-secret>

ワークスペースレベルの操作の場合は、.databrickscfgファイルに以下の値を設定します。この場合、ホストはDatabricksワークスペースのURLとなります(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com)。

[<some-unique-configuration-profile-name>]
host          = <workspace-url>
client_id     = <service-principal-client-id>
client_secret = <service-principal-secret>

Databricks CLIの場合は、次のいずれかを実行します。

  • この記事の「環境」セクションで指定されているように環境変数を設定します。

  • この記事の「プロフィール」セクションで指定されているように、.databrickscfgファイルの値を設定します。

環境変数は常に.databrickscfgファイルの値よりも優先されます。

OAuthマシン間 (M2M) 認証も参照してください。

注:

OAuth M2M認証は、次のDatabricks Connectバージョンでサポートされています。

  • Pythonの場合、Databricks Connect for Databricks Runtime 13.1以降。

  • Scalaの場合、Databricks Connect for Databricks Runtime 13.3 LTS以降。

Databricks Connectでは、次のいずれかを実行できます。

.databrickscfgファイルの値は、常に環境変数よりも優先されます。

.databrickscfgファイル内のこれらの環境変数もしくは値を使用してDatabricks Connectクライアントを初期化するには、次のいずれかを参照してください。

DatabricksのVisual Studio Code拡張機能の場合は、次のようにします。

  1. この記事の「プロファイル」セクションで指定されているように、Databricksワークスペースレベルの操作のために.databrickscfgファイルの値を設定します。

  2. DatabricksのVisual Studio Code拡張機能の [構成] ウィンドウで、[Databricksを構成する] をクリックします。

  3. [コマンド] パレットDatabricks Hostに、ワークスペースURLhttps://dbc-a1b2345c-d6e7.cloud.databricks.com などと入力し、Enterを押します。

  4. [コマンド] パレットで、URLのリストからターゲット プロファイルの名前を選択します。

詳細については、「Visual Studio CodeのDatabricks拡張機能の認証設定」を参照してください。

アカウントレベルのオペレーションの場合、デフォルトの認証の場合:

provider "databricks" {
  alias = "accounts"
}

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(HashiCorp Vaultなど)から値を取得します。「Vaultのプロバイダー」も参照してください。この場合、DatabricksアカウントのコンソールURLはhttps://accounts.cloud.databricks.comとなります。

provider "databricks" {
  alias         = "accounts"
  host          = <retrieve-account-console-url>
  account_id    = <retrieve-account-id>
  client_id     = <retrieve-client-id>
  client_secret = <retrieve-client-secret>
}

ワークスペース レベルの操作の場合、デフォルト認証の場合:

provider "databricks" {
  alias = "workspace"
}

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(HashiCorp Vaultなど)から値を取得します。「Vaultのプロバイダー」も参照してください。この場合、ホストはDatabricksワークスペースのURLとなります(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com)。

provider "databricks" {
  alias         = "workspace"
  host          = <retrieve-workspace-url>
  client_id     = <retrieve-client-id>
  client_secret = <retrieve-client-secret>
}

Databricks Terraformプロバイダーによる認証の詳細については、「認証」を参照してください。

アカウントレベルのオペレーションでは、デフォルトの認証に以下を使用します。

from databricks.sdk import AccountClient

a = AccountClient()
# ...

直接構成の場合、以下を使用して、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、DatabricksアカウントのコンソールURLは https://accounts.cloud.databricks.com です。

from databricks.sdk import AccountClient

a = AccountClient(
  host          = retrieve_account_console_url(),
  account_id    = retrieve_account_id(),
  client_id     = retrieve_client_id(),
  client_secret = retrieve_client_secret()
)
# ...

ワークスペースレベルの操作、特にデフォルトの認証の場合:

from databricks.sdk import WorkspaceClient

w = WorkspaceClient()
# ...

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、ホストはDatabricksのワークスペースのURLです。例:https://dbc-a1b2345c-d6e7.cloud.databricks.com

from databricks.sdk import WorkspaceClient

w = WorkspaceClient(
  host          = retrieve_workspace_url(),
  client_id     = retrieve_client_id(),
  client_secret = retrieve_client_secret()
)
# ...

を使用し、Databricks PythonDatabricksクライアント統合認証 を実装する ツールと SDK を使用した認証の詳細については 以下を参照してください。

アカウントレベルのオペレーションの場合、デフォルトの認証の場合:

import com.databricks.sdk.AccountClient;
// ...
AccountClient a = new AccountClient();
// ...

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、DatabricksアカウントのコンソールURLは https://accounts.cloud.databricks.com です。

import com.databricks.sdk.AccountClient;
import com.databricks.sdk.core.DatabricksConfig;
// ...
DatabricksConfig cfg = new DatabricksConfig()
  .setHost(retrieveAccountConsoleUrl())
  .setAccountId(retrieveAccountId())
  .setClientId(retrieveClientId())
  .setClientSecret(retrieveClientSecret());
AccountClient a = new AccountClient(cfg);
// ...

ワークスペース レベルの操作の場合、デフォルト認証の場合:

import com.databricks.sdk.WorkspaceClient;
// ...
WorkspaceClient w = new WorkspaceClient();
// ...

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、ホストはDatabricksのワークスペースのURLです。例:https://dbc-a1b2345c-d6e7.cloud.databricks.com

import com.databricks.sdk.WorkspaceClient;
import com.databricks.sdk.core.DatabricksConfig;
// ...
DatabricksConfig cfg = new DatabricksConfig()
  .setHost(retrieveWorkspaceUrl())
  .setClientId(retrieveClientId())
  .setClientSecret(retrieveClientSecret());
WorkspaceClient w = new WorkspaceClient(cfg);
// ...

Javaを使用し、Databricksクライアントの統合認証を実装しているDatabricksツールおよびSDKでの認証の詳細については、以下を参照してください。

アカウントレベルのオペレーションの場合、デフォルトの認証の場合:

import (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient())
// ...

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、DatabricksアカウントのコンソールURLは https://accounts.cloud.databricks.com です。

import (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient(&databricks.Config{
  Host:         retrieveAccountConsoleUrl(),
  AccountId:    retrieveAccountId(),
  ClientId:     retrieveClientId(),
  ClientSecret: retrieveClientSecret(),
}))
// ...

ワークスペース レベルの操作の場合、デフォルト認証の場合:

import (
"github.com/databricks/databricks-sdk-go"
)
// ...
a := databricks.Must(databricks.NewAccountClient())
// ...

直接構成の場合、retrieveプレースホルダーを独自の実装に置き換え、コンソールやその他の構成ストア(AWS Systems Managerパラメーターストアなど)から値を取得します。この場合、ホストはDatabricksのワークスペースのURLです。例:https://dbc-a1b2345c-d6e7.cloud.databricks.com

import (
"github.com/databricks/databricks-sdk-go"
)
// ...
a := databricks.Must(databricks.NewAccountClient(&databricks.Config{
  Host:         retrieveWorkspaceUrl(),
  ClientId:     retrieveClientId(),
  ClientSecret: retrieveClientSecret(),
}))
// ...

Go を使用し、 クライアント統合認証 を実装するDatabricks ツールと SDKDatabricks を使用した認証の詳細については、「 アカウントまたはワークスペースで Go の を認証DatabricksSDKDatabricks する」を参照してください。

OAuth M2M認証用のアクセストークンを手動で生成して使用する

クライアント統合認証Databricks 標準を実装するDatabricks ツールとSDKは、DatabricksOAuthOAuth M2M認証に必要な ユーザーに代わってアクセストークンを自動的に生成、更新、および使用します。

Databricks ではクライアント統合認証を使用することをお勧めしますが、アクセストークンを手動で生成、更新、または使用する必要がある場合は、このセクション Databricks OAuth 手順に従ってください。

サービスプリンシパルのクライアントIDとOAuth OAuthシークレットを使用して、アカウントレベルのRESTAPIs とワークスペースレベルの の両方に対する認証のための アクセストークンをリクエストします。RESTAPIsアクセストークンの有効期限は1時間です。 有効期限が切れた後は、新しい OAuth アクセストークンをリクエストする必要があります。 OAuth アクセストークンのスコープは、トークンを作成するレベルによって異なります。 トークンは、次のように、アカウントレベルまたはワークスペースレベルで作成できます。

アカウントレベルのアクセストークンを手動で生成する

アカウントレベルで作成されたOAuthアクセストークンは、アカウント内のDatabricks REST APIと、サービスプリンシパルがアクセスできるすべてのワークスペースに対して使用できます。

  1. アカウント管理者として、アカウントコンソールにログインします。

  2. 右上のユーザー名の横にある下向きの矢印をクリックします。

  3. アカウントIDをコピーしてください。

  4. 次のURLの<my-account-id>をコピーしたアカウントIDに置き換えて、トークンエンドポイントのURLを作成します。

    https://accounts.cloud.databricks.com/oidc/accounts/<my-account-id>/v1/token
    
  5. curlなどのクライアントを使用して、トークンエンドポイントURL、サービスプリンシパルのクライアントID(アプリケーションIDとも呼ばれます)、および作成したサービスプリンシパルのOAuthシークレットを含むOAuthアクセストークンをリクエストします。all-apisスコープは、サービスプリンシパルにアクセス権が付与されているすべてのDatabricks REST APIにアクセスするために使用できるOAuthアクセストークンをリクエストします。

    • <token-endpoint-URL>を前述のトークンエンドポイントのURLに置き換えます。

    • <client-id>をサービスプリンシパルのクライアントID(アプリケーションIDとも呼ばれます)に置き換えます。

    • <client-secret>を、作成したサービスプリンシパルのOAuthシークレットに置き換えます。

    export CLIENT_ID=<client-id>
    export CLIENT_SECRET=<client-secret>
    
    curl --request POST \
    --url <token-endpoint-URL> \
    --user "$CLIENT_ID:$CLIENT_SECRET" \
    --data 'grant_type=client_credentials&scope=all-apis'
    

    これにより、次のようなレスポンスが生成されます。

    {
      "access_token": "eyJraWQiOiJkYTA4ZTVjZ…",
      "token_type": "Bearer",
      "expires_in": 3600
    }
    

    レスポンスからaccess_tokenをコピーします。

ワークスペースレベルのアクセストークンを手動で生成する

ワークスペースレベルで作成されたOAuthアクセストークンは、サービスプリンシパルがアカウント管理者であっても、他のワークスペースのメンバーであっても、そのワークスペース内のREST APIにのみアクセスできます。

  1. https://<databricks-instance>をDatabricksデプロイメントのワークスペースURLに置き換えて、トークンエンドポイントURLを構築します。

    https://<databricks-instance>/oidc/v1/token
    
  2. curlなどのクライアントを使用して、トークンエンドポイントURL、サービスプリンシパルのクライアントID(アプリケーションIDとも呼ばれます)、および作成したサービスプリンシパルのOAuthシークレットを含むOAuthアクセストークンをリクエストします。all-apisスコープは、トークンをリクエストしているワークスペース内で、サービスプリンシパルにアクセス権が付与されているすべてのDatabricks REST APIにアクセスするために使用できるOAuthアクセストークンをリクエストします。

    • <token-endpoint-URL>を前述のトークンエンドポイントのURLに置き換えます。

    • <client-id>をサービスプリンシパルのクライアントID(アプリケーションIDとも呼ばれます)に置き換えます。

    • <client-secret>を、作成したサービスプリンシパルのOAuthシークレットに置き換えます。

    export CLIENT_ID=<client-id>
    export CLIENT_SECRET=<client-secret>
    
    curl --request POST \
    --url <token-endpoint-URL> \
    --user "$CLIENT_ID:$CLIENT_SECRET" \
    --data 'grant_type=client_credentials&scope=all-apis'
    

    これにより、次のようなレスポンスが生成されます。

    {
      "access_token": "eyJraWQiOiJkYTA4ZTVjZ…",
      "token_type": "Bearer",
      "expires_in": 3600
    }
    

    レスポンスからaccess_tokenをコピーします。

Databricks REST API を呼び出す

OAuthアクセストークンを使用して、DatabricksのアカウントレベルのREST APIとワークスペースレベルのREST APIを認証できるようになりました。アカウントレベルのREST APIを呼び出すには、サービスプリンシパルがアカウント管理者である必要があります。

Bearer認証を使用して、ヘッダーにトークンを含めることができます。このアプローチは、 curlまたは構築する任意のクライアントで使用できます。

アカウントレベルの REST APIリクエストの例

この例では、Bearer認証を使用して、アカウントに関連付けられているすべてのワークスペースのリストを取得します。

  • <oauth-access-token> を、前のステップでコピーしたサービスプリンシパルのOAuthアクセストークンに置き換えます。

  • <account-id>をアカウントIDに置き換えます。

export OAUTH_TOKEN=<oauth-access-token>

curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<account-id>/workspaces'

ワークスペースレベルのREST APIリクエストの例

この例では、Bearer 認証を使用して、指定されたワークスペースで利用可能なすべてのクラスターを一覧表示します。

  • <oauth-access-token> を、前のステップでコピーしたサービスプリンシパルのOAuthアクセストークンに置き換えます。

  • <workspace-URL>を、 dbc-a1b2345c-d6e7.cloud.databricks.comのような形式のベースとなるワークスペースURLに置き換えます。

export OAUTH_TOKEN=<oauth-access-token>

curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \
'https://<workspace-URL>/api/2.0/clusters/list'