Databricksを使用して リソースへの無人アクセスをサービスプリンシパルで承認するOAuth
このトピックでは、Databricks DatabricksCLIコマンドを自動化するとき、または無人プロセスから実行されるコードから を呼び出すときにリソースへのアクセスを承認する手順と詳細について説明します。DatabricksRESTAPIs
Databricks は、UI の外部で Databricks リソースと対話する際のユーザー認証と認証の優先プロトコルとして OAuth を使用します。 Databricks は、OAuth の認証方法の一部として生成されるアクセス トークンの更新を自動化するための統合クライアント認証ツールも提供しています。 これは、サービスプリンシパル とユーザー アカウントにも当てはまりますが、操作の一部としてアクセスする必要がある Databricks リソースに対して、適切なアクセス許可と特権を使用してサービスプリンシパルを構成する必要があります。
詳細については、「 Databricks リソースへのアクセスの承認」を参照してください。
Databricksサービスプリンシパルを使用する場合の認証と認証にはどのようなオプションがありますか?
このトピックでは、 承認 とは、委任を通じて特定の Databricks リソースへのアクセスをネゴシエートするために使用されるプロトコル (OAuth) を指します。 認証 とは、資格情報が表現、送信、および検証されるメカニズムを指し、この場合は アクセストークンです。
Databricks はOAuth 2.0 ベースの承認を使用してDatabricksコマンド ラインまたはコードからアカウントとワークスペース リソースへのアクセスを有効にします。これらのリソースにアクセスするアクセス許可を持つサービスプリンシパルの代わりに。Databricksサービスプリンシパルが構成され、CLI コマンドを実行したり、 を呼び出したりするときにその資格情報が検証されると、参加しているツールまたはRESTAPI OAuthにSDK トークンが付与され、その時点からサービスプリンシパルに代わってトークンベースの認証が実行されます。OAuthアクセストークンの有効期間は1時間で、その後、関係するツールまたはSDKは、1時間有効な新しいトークンを取得するための自動バックグラウンド試行を行います。
Databricks では、 OAuthを使用してサービスプリンシパルのアクセスを承認する 2 つの方法がサポートされています。
Databricks 統合クライアント認証サポートを使用して、ほとんどの場合自動的に行われます。 特定の Databricks SDK (Databricks Terraform SDK など) とツールを使用している場合は、この簡略化されたアプローチを使用します。 サポートされているツールと SDK については、「 Databricks 統合クライアント認証」を参照してください。 このアプローチは、自動化やその他の無人プロセス シナリオに適しています。
手動で、OAuth コード検証ツール/チャレンジのペアと認証コードを直接生成し、それらを使用して、構成で提供する初期 OAuth トークンを作成します。 Databricks 統合クライアント認証でサポートされている API を使用していない場合は、この方法を使用します。 この場合、使用しているサードパーティのツールやAPIに固有のアクセストークンの更新を処理するための独自のメカニズムを開発する必要があるかもしれません。 詳細については、「OAuth サービスプリンシパル認証用のアクセス トークンを手動で生成して使用する」を参照してください。
開始する前に、 Databricks サービスプリンシパルを構成し、オートメーション コードまたはコマンドが要求したときに使用する必要があるリソースにアクセスするための適切なアクセス許可を割り当てる必要があります。
前提条件: サービスプリンシパルを作成する
アカウント admins とワークスペース admins は、サービスプリンシパルを作成できます。 この手順では、 Databricks ワークスペースでサービスプリンシパルを作成する方法について説明します。 Databricksアカウントコンソールの詳細については、「アカウントでサービスプリンシパルを管理する」を参照してください。
ワークスペース管理者として、Databrickワークスペースにログインします。
Databricksワークスペースの上部のバーにあるユーザー名をクリックし、[設定]を選択します。
[IDとアクセス] タブをクリックします。
サービスプリンシパルの横にある [管理] をクリックします。
[サービスプリンシパルの追加] をクリックします。
検索ボックスのドロップダウン矢印をクリックし、[新規追加] をクリックします。
サービスプリンシパルの名前を入力します。
[追加] をクリックします。
サービスプリンシパルはワークスペースとDatabricksアカウントの両方に追加されます。
ステップ 1: サービスプリンシパルに権限を割り当てる
サービスプリンシパルの名前をクリックして、その詳細ページを開きます。
「構成」タブで、このワークスペースに対してサービスプリンシパルに付与する各権限の横にあるボックスを選択し、「更新」をクリックします。
[ アクセス許可 ] タブで、このサービスプリンシパルを管理および使用する任意の Databricks ユーザー、サービスプリンシパル、およびグループにアクセス権を付与します。 「サービスプリンシパルでの役割の管理」を参照してください。
ステップ 2: サービスプリンシパルの OAuth シークレットを作成する
OAuth を使用して Databricks リソースへのアクセスを承認する前に、まず OAuth シークレットを作成し、これを使用して認証用の OAuth アクセス トークンを生成する必要があります。 サービスプリンシパルは、最大 5 つの OAuth シークレットを持つことができます。 アカウント admins とワークスペース admins は、サービスプリンシパルの OAuth シークレットを作成できます。
サービスプリンシパルの詳細ページで、[ シークレット ] タブをクリックします。
[OAuthシークレット] で、[シークレットを生成] をクリックします。
表示されたシークレットとクライアントIDをコピーし、[完了] をクリックします。
シークレットは作成中に一度だけ明らかにされます。クライアントID は、サービスプリンシパルのアプリケーションIDと同じです。
アカウント 管理者は、アカウント コンソールのサービスプリンシパル 詳細ページから OAuth シークレットを生成することもできます。
アカウント管理者として、アカウントコンソールにログインします。
[ユーザー管理]をクリックします。
[サービスプリンシパル] タブで、サービスプリンシパルを選択します。
[OAuthシークレット] で、[シークレットを生成] をクリックします。
表示されたシークレットとクライアントIDをコピーし、[完了] をクリックします。
注:
サービスプリンシパルでクラスターやSQLウェアハウスを使用できるようにするには、サービスプリンシパルにこれらへのアクセス権を付与する必要があります。詳しくは、「コンピュート権限」または「SQLウェアハウスを管理する」を参照してください。
ステップ 3: OAuth 認証を使用する
統合クライアント認証ツールで OAuth 認証を使用するには、次の関連する環境変数 ( .databrickscfg
フィールド、Terraform フィールド、または Config
フィールド) を設定する必要があります。
Databricksホスト。アカウント操作の場合は
https://accounts.cloud.databricks.com
を、ワークスペース操作の場合はターゲットワークスペースのURL(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com
)を指定します。Databricksアカウント操作用のDatabricksアカウントID。
サービスプリンシパルのクライアントID。
サービスプリンシパルのシークレット。
OAuth サービスプリンシパル認証を実行するには、参加するツールまたは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 サービスプリンシパル Authentication は、次の Databricks Connect バージョンでサポートされています。
Pythonの場合、Databricks Connect for Databricks Runtime 13.1以降。
Scalaの場合、Databricks Connect for Databricks Runtime 13.3 LTS以降。
Databricks Connectでは、次のいずれかを実行できます。
この記事の「プロファイル」セクションで指定されているように、Databricksワークスペースレベルの操作のために
.databrickscfg
ファイルの値を設定します。また、プロファイルのcluster_id
環境変数をワークスペースインスタンスのURL(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com
)に設定します。この記事の「環境」セクションで指定されているように、Databricksワークスペースレベルの操作の環境変数を設定します。また、
DATABRICKS_CLUSTER_ID
環境変数をワークスペースインスタンスのURL(例:https://dbc-a1b2345c-d6e7.cloud.databricks.com
)に設定します。
.databrickscfg
ファイルの値は、常に環境変数よりも優先されます。
これらの環境変数または.databrickscfg
ファイル内の値を使用して Databricks Connect クライアントを初期化するには、Databricks Connectのコンピュート設定を参照してください。
DatabricksのVisual Studio Code拡張機能の場合は、次のようにします。
この記事の「プロファイル」セクションで指定されているように、Databricksワークスペースレベルの操作のために
.databrickscfg
ファイルの値を設定します。DatabricksのVisual Studio Code拡張機能の [構成] ウィンドウで、[Databricksを構成する] をクリックします。
[コマンド] パレットのDatabricks Hostに、ワークスペースURLを
https://dbc-a1b2345c-d6e7.cloud.databricks.com
などと入力し、Enter
を押します。[コマンド] パレットで、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での認証の詳細については、以下を参照してください。
Scala用Databricks Connectクライアントのセットアップ(Scala用Databricks Connectクライアントは付属のDatabricks SDK for Javaを使用して認証)
デフォルトの認証 を使用する アカウントレベルのオペレーション の場合:
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 サービスプリンシパル authentication 用のアクセス トークンを手動で生成して使用する
クライアント統合認証Databricks 標準を実装するDatabricks ツールと SDK は、DatabricksOAuth サービスプリンシパル認証に必要な アクセストークンを自動的に生成、更新、および使用します。OAuth
Databricks ではクライアント統合認証を使用することをお勧めしますが、アクセストークンを手動で生成、更新、または使用する必要がある場合は、このセクション Databricks OAuth 手順に従ってください。
サービスプリンシパルのクライアントIDとOAuth OAuthシークレットを使用して、アカウントレベルのRESTAPIs とワークスペースレベルの の両方に対する認証のための アクセストークンをリクエストします。RESTAPIsアクセストークンの有効期限は1時間です。 有効期限が切れた後は、新しい OAuth アクセストークンをリクエストする必要があります。 OAuth アクセストークンのスコープは、トークンを作成するレベルによって異なります。 トークンは、次のように、アカウントレベルまたはワークスペースレベルで作成できます。
サービスプリンシパルがアクセスできるアカウントおよびワークスペース内で、アカウントレベルやワークスペースレベルのREST APIを呼び出すには、アカウントレベルでアクセストークンを手動で生成します。
サービスプリンシパルがアクセスできるワークスペースのうちの1つだけからREST APIを呼び出すには、そのワークスペースだけのアクセストークンをワークスペースレベルで手動生成します。
アカウントレベルのアクセストークンを手動で生成する
アカウントレベルで作成されたOAuthアクセストークンは、アカウント内のDatabricks REST APIと、サービスプリンシパルがアクセスできるすべてのワークスペースに対して使用できます。
アカウント管理者として、アカウントコンソールにログインします。
右上のユーザー名の横にある下向きの矢印をクリックします。
アカウントIDをコピーしてください。
次のURLの
<my-account-id>
をコピーしたアカウントIDに置き換えて、トークンエンドポイントのURLを作成します。https://accounts.cloud.databricks.com/oidc/accounts/<my-account-id>/v1/token
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にのみアクセスできます。
https://<databricks-instance>
をDatabricksデプロイメントのワークスペースURLに置き換えて、トークンエンドポイントURLを構築します。https://<databricks-instance>/oidc/v1/token
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トークンを使用して、 アカウントDatabricksRESTAPIs レベルの および ワークスペース レベルのRESTAPIs に対して認証できます。サービスプリンシパルは、アカウントレベルの REST APIsを呼び出すためにアカウント管理者権限を持っている必要があります。
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'