このページでは、組織の ID プロバイダーによって発行されたトークンを使用して Azure Databricks に対して認証する方法について説明します。
Azure Databricks では OAuth 2.0 Token Exchange がサポートされており、フェデレーション ID トークンを Databricks OAuth トークンと交換できます。 トークンフェデレーションを使用すると、Databricks CLI、SDK、およびその他のツールで、この交換を自動的に処理し、アクセス トークンを管理できます。
各アクセス トークンの有効期間は、指定したフェデレーション トークンの有効期間から派生します。これは最も一般的に 1 時間ですが、異なる場合があります。 ツールは必要に応じてトークンを自動的に更新するため、資格情報を手動で要求したりローテーションしたりする必要はありません。
認証プロセス
フェデレーション ID プロバイダーからのトークンを使用して Azure Databricks API アクセスを認証するには、最初に必要な環境変数または構成フィールドを設定します。 任意のツールまたは SDK は、指定した場所からフェデレーション JSON Web トークン (JWT) を取得し、それを Azure Databricks OAuth トークンと交換し、OAuth トークンを使用して Azure Databricks REST API 呼び出しを認証します。
[前提条件]
開始する前に、次の手順を実行します。
- アカウントまたはサービス プリンシパルのフェデレーション ポリシーを作成します。
- ポリシーに一致する有効な JWT を ID プロバイダーから取得します。 トークンは RS256 または ES256 を使用して署名する必要があります。 手順はプロバイダーによって異なるため、プロバイダーのドキュメントを参照するか、管理者に問い合わせてください。
環境を構成する
フェデレーション トークンの取得元に基づいて環境を構成します。 次の環境変数、 .databrickscfg フィールド、Terraform フィールド、または Config フィールドを設定します。
-
Databricks host:
https://accounts.azuredatabricks.netアカウント操作または ワークスペースごとのターゲット URL (ワークスペース操作のhttps://adb-1234567890123456.7.azuredatabricks.netなど)。 - Databricks アカウント ID: ホストがアカウント コンソールの URL である場合にのみ必要です。
- サービス プリンシパル クライアント ID: ワークロード ID フェデレーションにのみ必要です。 アカウント全体のトークン フェデレーション ポリシーを使用して認証する場合は、設定しないでください。
-
Databricks 認証の種類:
env-oidcトークンが環境変数から取得される場合は >file-oidcトークンがファイルから取得される場合。 -
OIDC トークン環境変数: トークンを含む環境変数の名前。 認証方法が
env-oidc場合にのみ必要です。 既定値はDATABRICKS_OIDC_TOKENです。 -
OIDC トークン ファイルパス: フェデレーション トークンを含むファイルへのパス。 認証方法が
file-oidc場合にのみ必要です。
すべての統合認証環境変数と構成フィールドの完全なリファレンスについては、 統合認証の環境変数とフィールドを参照してください。
認証環境を設定する好みの構成方法を選択します。
環境
以下の環境変数を設定します。
export DATABRICKS_HOST=<workspace-url-or-account-console-url>
export DATABRICKS_ACCOUNT_ID=<account-id> # If DATABRICKS_HOST is the account console URL
export DATABRICKS_CLIENT_ID=<client-id> # Only for workload identity federation
export DATABRICKS_AUTH_TYPE=<auth-method> # env-oidc or file-oidc
export DATABRICKS_OIDC_TOKEN_ENV=<token-env-name> # If auth type is env-oidc
export DATABRICKS_OIDC_TOKEN_FILEPATH=<token-filepath-name> # If auth type is file-oidc
Profile
次のフィールドを使用して、 .databrickscfg構成プロファイル を作成または識別します。
[<profile-name>]
host = <workspace-url-or-account-console-url>
account_id = <account-id> # If host is the account console URL
client_id = <client-id> # Only for workload identity federation
auth_type = <auth-method> # env-oidc or file-oidc
oidc_token_env = <token-env-name> # If auth type is env-oidc
oidc_token_filepath = <token-filepath-name> # If auth type is file-oidc
CLI
Databricks CLI の場合は、次のいずれかを行います。
- [ 環境 ] タブで指定した環境変数を設定します。
-
.databrickscfgタブで指定したとおりに、 ファイル内の値を設定します。
環境変数は、.databrickscfg ファイル内の値よりも常に優先されます。
接続する
Databricks Connect の場合は、次のいずれかを実行できます。
-
構成プロファイルを使用します。[
.databrickscfg] タブの説明に従って、 ファイルでワークスペース レベルの値を設定します。また、cluster_idをワークスペース インスタンスの URL に設定します。 -
環境変数を使用します。 [ 環境 ] タブに表示されるのと同じ値を設定します。また、
DATABRICKS_CLUSTER_IDをワークスペース インスタンスの URL に設定します。
.databrickscfgの値は環境変数よりも優先されます。
これらの設定で Databricks Connect を初期化するには、「 Databricks Connect のコンピューティング構成」を参照してください。
VS Code
Databricks IDE拡張については、以下の手順を行ってください:
-
.databrickscfgタブで指定されているとおりに、Azure Databricks ワークスペース レベルの操作用の ファイル内の値を設定します。 - Databricks IDE拡張機能の 設定 ペインで 、「Databricksの設定」をクリックします。
-
コマンド パレットの Databricks Host に、ワークスペースごとの URL (例:
https://adb-1234567890123456.7.azuredatabricks.net) を入力し、Enterキーを押します。 - コマンド パレットで、URL の一覧でターゲット プロファイルの名前を選択します。
詳細については、「 Databricks IDE拡張の認可設定」をご覧ください。
Terraform
アカウント レベルの操作の場合
provider "databricks" {
alias = "accounts"
}
ワークスペース レベルの操作の場合:
provider "databricks" {
alias = "workspace"
}
Python
ワークスペース レベルの操作の場合:
from databricks.sdk import WorkspaceClient
# Uses environment configuration automatically
w = WorkspaceClient()
アカウント レベルの操作の場合:
from databricks.sdk import AccountClient
# Uses environment configuration automatically
a = AccountClient()
Java
ワークスペース レベルの操作の場合:
import com.databricks.sdk.WorkspaceClient;
// Uses environment configuration automatically
WorkspaceClient w = new WorkspaceClient();
アカウント レベルの操作の場合:
import com.databricks.sdk.AccountClient;
// Uses environment configuration automatically
AccountClient a = new AccountClient();
Go
ワークスペース レベルの操作の場合:
import "github.com/databricks/databricks-sdk-go"
// Uses environment configuration automatically
w := databricks.Must(databricks.NewWorkspaceClient())
アカウント レベルの操作の場合:
import "github.com/databricks/databricks-sdk-go"
// Uses environment configuration automatically
a := databricks.Must(databricks.NewAccountClient())
Go を使用し、Databricks クライアント統合認証を実装する Databricks ツールおよび SDK を使用した認証の詳細については、「Azure Databricks アカウントまたはワークスペースで Databricks SDK for Go を認証する」を参照してください。
Databricks API にアクセスする
環境を構成したら、Databricks CLI と SDK を通常どおりに使用できます。 トークン交換を自動的に処理し、結果として得られる OAuth トークンを API 認証に使用します。
CLI
databricks clusters list
Python
from databricks.sdk import WorkspaceClient
w = WorkspaceClient() # Uses environment configuration
clusters = w.clusters.list()
Java
import com.databricks.sdk.WorkspaceClient;
WorkspaceClient w = new WorkspaceClient();
List<ClusterDetails> clusters = w.clusters().list();
Go
import "github.com/databricks/databricks-sdk-go"
w := databricks.Must(databricks.NewWorkspaceClient())
clusters := w.Clusters.ListAll(context.Background(), compute.List{})
カスタム承認プロバイダーを実装する
フェデレーション トークンが環境変数またはファイル以外のソースから取得される場合は、Databricks SDK のいずれかを使用して、フェデレーション トークンを取得するカスタム実装を記述できます。
AWS IAM ワークロード (Python)
次の例では、AWS STS IdTokenSource を使用して AWS ワークロードを Azure Databricks に対して認証するための GetWebIdentityToken パターンを使用します。
import boto3
from databricks.sdk import WorkspaceClient
from databricks.sdk import oidc
from databricks.sdk.core import Config, credentials_strategy, oidc_credentials_provider
class AwsStsTokenSource(oidc.IdTokenSource):
def __init__(self, audience="databricks", region="us-east-1"):
self._audience = audience
self._region = region
def id_token(self) -> oidc.IdToken:
sts = boto3.client("sts", region_name=self._region)
resp = sts.get_web_identity_token(
Audience=[self._audience],
SigningAlgorithm="RS256",
DurationSeconds=300,
)
return oidc.IdToken(jwt=resp["WebIdentityToken"])
@credentials_strategy("aws-sts-wif", [])
def aws_sts_wif_strategy(cfg: Config):
return oidc_credentials_provider(cfg, AwsStsTokenSource())
w = WorkspaceClient(
host="https://my-workspace.cloud.databricks.com",
client_id="<service-principal-uuid>",
credentials_strategy=aws_sts_wif_strategy
)
# No secrets needed
clusters = w.clusters.list()
注
トークン期間は 300 秒をお勧めします。 ワークロードのニーズに基づいて最大 3,600 秒を調整できます。
次の例は、プロトコルを理解するための未加工のトークン交換を示しています。
import boto3
import requests
sts = boto3.client("sts", region_name="us-east-1")
resp = sts.get_web_identity_token(
Audience=["databricks"],
SigningAlgorithm="RS256",
DurationSeconds=300,
)
aws_jwt = resp["WebIdentityToken"]
token_resp = requests.post(
"https://<workspace>.cloud.databricks.com/oidc/v1/token",
data={
"client_id": "<service-principal-uuid>",
"grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
"subject_token": aws_jwt,
"subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
"scope": "all-apis",
},
)
access_token = token_resp.json()["access_token"]
AWS の前提条件とフェデレーション ポリシーの作成を含む完全なセットアップについては、「 AWS IAM ワークロードのワークロード ID フェデレーションを有効にする」を参照してください。
一般的なカスタム実装
Python
from databricks.sdk import oidc
from databricks.sdk.core import (Config, CredentialsProvider, credentials_strategy, oidc_credentials_provider)
class MyCustomIdTokenSource(oidc.IdTokenSource):
def id_token(self) -> oidc.IdToken:
token = ... # Implement logic to return the ID token here
return oidc.IdToken(jwt=token)
@credentials_strategy("my-custom-oidc", [])
def my_custom_oidc_strategy(cfg: Config) -> CredentialsProvider:
return oidc_credentials_provider(cfg, MyCustomIdTokenSource())
if __name__ == "__main__":
cfg = Config(
host="https://my-workspace.cloud.databricks.com",
credentials_strategy=my_custom_oidc_strategy
)
from databricks.sdk import WorkspaceClient
w = WorkspaceClient(config=cfg)
# Use the client...
Java
import com.databricks.sdk.WorkspaceClient;
import com.databricks.sdk.core.DatabricksConfig;
import com.databricks.sdk.core.CredentialsProvider;
import com.databricks.sdk.core.oauth.IDTokenSource;
import com.databricks.sdk.core.oauth.IDToken;
public class CustomOIDCExample {
// Custom IDTokenSource that returns an OIDC ID token
static class MyCustomIdTokenSource implements IDTokenSource {
@Override
public IDToken getIDToken(String audience) {
// TODO: Implement logic to fetch or generate the ID token
String jwt = "..."; // your OIDC token here
return new IDToken(jwt);
}
}
public static void main(String[] args) {
// TODO: Wrap MyCustomIdTokenSource in a CredentialsProvider
// See the SDK documentation for the appropriate method
CredentialsProvider provider = ...; // Configure with MyCustomIdTokenSource
// Configure with workspace host and custom OIDC provider
DatabricksConfig cfg = new DatabricksConfig()
.setHost("https://my-workspace.cloud.databricks.com")
.setCredentialsProvider(provider);
// Initialize the workspace client
WorkspaceClient w = new WorkspaceClient(cfg);
System.out.println("Databricks client initialized: " + w);
// Use the client...
}
}
注
この例では、カスタム IDTokenSourceを実装する方法を示します。 カスタム トークン ソースで CredentialsProvider を構成する最新の方法については、 Databricks SDK for Java のドキュメント を参照するか、 GitHub の SDK ソース コードを参照してください。
Go
package main
import (
"context"
"fmt"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/config"
"github.com/databricks/databricks-sdk-go/credentials"
)
// MyCustomIdTokenSource implements a custom OIDC token source
type MyCustomIdTokenSource struct{}
func (s *MyCustomIdTokenSource) IDToken(ctx context.Context) (*credentials.IDToken, error) {
// TODO: Implement logic to return the ID token
token := "..."
return &credentials.IDToken{JWT: token}, nil
}
// myCustomOIDCStrategy is a custom credentials strategy
func myCustomOIDCStrategy(cfg *config.Config) (credentials.CredentialsProvider, error) {
return credentials.NewOIDCCredentialsProvider(cfg, &MyCustomIdTokenSource{}), nil
}
func main() {
cfg := &config.Config{
Host: "https://my-workspace.cloud.databricks.com",
}
// Register the custom credentials strategy
credentials.Register("my-custom-oidc", myCustomOIDCStrategy)
// Initialize the Databricks workspace client with custom auth
w, err := databricks.NewWorkspaceClientWithConfig(cfg)
if err != nil {
panic(err)
}
fmt.Println("Databricks client initialized:", w)
// Use the client...
}
トークンを手動で交換する
統合認証をサポートする Databricks SDK、CLI、またはその他のツールを使用していない場合は、ID プロバイダーの JWT を Databricks OAuth トークンと手動で交換できます。 これを行うには、OAuth 2.0 Token Exchange (RFC 8693) を使用して Azure Databricks トークン エンドポイントに要求を送信します。
まず、ドキュメントに従って ID プロバイダーからフェデレーション JWT を取得します。 次に、JWT を Databricks OAuth トークンと交換し、そのトークンを使用して Databricks REST API にアクセスします。
フェデレーション JWT を Databricks OAuth トークンと交換する
アカウント全体のフェデレーション ポリシーの場合、このコマンドはフェデレーション JWT を Databricks OAuth トークンと交換します。
curl --request POST https://<databricks-workspace-host>/oidc/v1/token \
--data "subject_token=${FEDERATED_JWT_TOKEN}" \
--data 'subject_token_type=urn:ietf:params:oauth:token-type:jwt' \
--data 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data 'scope=all-apis'
ヒント
Databricks アカウント リソースにアクセスするには、URL https://<databricks-account-host>/oidc/accounts/<account-id>/v1/tokenを使用します。
サービス プリンシパル フェデレーション ポリシーの場合は、要求にクライアント ID を含めます。
curl --request POST https://<databricks-workspace-host>/oidc/v1/token \
--data "client_id=${CLIENT_ID}" \
--data "subject_token=${FEDERATED_JWT_TOKEN}" \
--data 'subject_token_type=urn:ietf:params:oauth:token-type:jwt' \
--data 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data 'scope=all-apis'
CLIENT_ID をサービス プリンシパル UUID (たとえば、7cb2f8a4-49a7-4147-83db-35cb69e5cede) に置き換えます。
ID プロバイダーからのトークンが有効で、フェデレーション ポリシーと一致する場合は、databricks OAuth トークンを含む標準の JSON 応答を access_token フィールドに受信します。 この OAuth トークンを使用して、Databricks API にアクセスできます。 結果として得られる Databricks OAuth トークンの有効期限 (exp) 要求は、subject_token パラメーターで指定された JWT と同じです。
応答の例:
{
"access_token": "eyJraWQ...odi0WFNqQw",
"scope": "all-apis",
"token_type": "Bearer",
"expires_in": 3600
}
OAuth トークンを使用して Databricks API を呼び出す
その後、結果の Databricks OAuth トークンをベアラー トークンとして使用して、Databricks API にアクセスできます。 たとえば、Databricks SCIM Me API を呼び出して Databricks ユーザーと表示名を取得するには、次のようにします。
TOKEN='<your-databricks-oauth-token>'
curl --header "Authorization: Bearer $TOKEN" \
--url https://${DATABRICKS_WORKSPACE_HOSTNAME}/api/2.0/preview/scim/v2/Me
応答は次のように表示されます。
{
"userName": "username@mycompany.com",
"displayName": "Firstname Lastname"
}