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

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

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

サービスプリンシパルは、 Databricks アカウントで直接作成することも、 Databricks ワークスペースから作成することもできます。 ワークスペースで作成されたサービスプリンシパルは、自動的にアカウントに追加されます。 ワークスペースで ID フェデレーション が有効になっている場合は、アカウントにサービスプリンシパルを作成し、ワークスペースに割り当てることをお勧めします Databricks 。 ID フェデレーションが有効になっておらず、ワークスペース レベルでサービスプリンシパルを使用する場合は、ワークスペースからサービスプリンシパルを作成する必要があります。

アカウントコンソールを使用してサービスプリンシパルをアカウントに追加するには、次の手順を実行します。

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

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

  3. [サービスプリンシパル] タブで、[サービスプリンシパルの追加] をクリックします。

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

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

  6. 必要に応じて、[ロール] タブで [アカウント管理者] をオンにして、DatabricksアカウントレベルのAPIを呼び出します。

サービスプリンシパルをIDフェデレーションワークスペースに割り当てることができるようになりました。

  1. アカウントコンソールサイドバーで、[ワークスペース] をクリックします。

  2. ワークスペース名をクリックします。

  3. [権限] タブで、[権限を追加] をクリックします。

  4. サービスプリンシパルを検索して選択し、権限レベル(ワークスペースユーザーまたは管理者)を割り当て、[保存] をクリックします。

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

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

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

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

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

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

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

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

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

ステップ2: ワークスペースレベルのアクセス許可をDatabricksサービスプリンシパルに割り当てる

  1. ワークスペースの管理コンソールがまだ開いていない場合は、上部のバーにあるユーザー名をクリックし、[設定] をクリックします。

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

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

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

  5. [構成] タブで、Databricksサービスプリンシパルがこのワークスペースに対して持つ必要のある各権限の横にあるチェックボックスをオンにし、[更新] をクリックします。

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

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

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

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

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

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

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

  5. 表示されたシークレットクライアントIDをコピーし、[完了] をクリックします。

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

  1. ワークスペースの管理コンソールがまだ開いていない場合は、上部のバーにあるユーザー名をクリックし、[設定] をクリックします。

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

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

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

  5. [シークレット] タブをクリックします。

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

  7. 表示されたシークレットクライアントIDをコピーし、[完了] をクリックします。

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

注:

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

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認証に必要な ユーザーに代わってアクセストークンを自動的に生成、更新、および使用します。

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

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

まだDatabricksのサービスプリンシパルとそれに対応するOAuthシークレットがない場合は、この記事の冒頭のステップ1〜3に従って作成してください。

ステップ2: アクセストークンを手動で生成する

DatabricksサービスプリンシパルのクライアントIDとOAuthシークレットを使用して、アカウントレベルのREST APIとワークスペースレベルのREST APIの両方に対して認証を行うためのOAuthアクセストークンをリクエストします。このアクセストークンの有効時間は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をコピーします。

  6. ステップ3: Databricks REST APIを呼び出す に進みます。

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

ワークスペースレベルで作成された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をコピーします。

ステップ3: 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'