Microsoft Entra ID サービス プリンシパルを使ってジョブを実行する
ジョブを使用すると、Azure Databricks クラスターでアプリケーションを非対話的な方法 (たとえば、スケジュールに従って実行する必要がある ETL ジョブやデータ分析タスク) で実行できます。 通常、これらのジョブは、それらを作成したユーザーとして実行されますが、いくつかの制限があります。
- ジョブの作成と実行は、ユーザーが適切なアクセス許可を持っていることに依存しています。
- ジョブを作成したユーザーのみがジョブにアクセスできます。
- ユーザーは、Azure Databricks ワークスペースから削除される可能性があります。
サービス アカウント (特定のユーザーではなくアプリケーションに関連付けられているアカウント) を使用することが、これらの制限に対処するための一般的な方法です。 Azure では、Microsoft Entra ID (旧称 Azure Active Directory) アプリケーションとサービス プリンシパルを使ってサービス アカウントを作成できます。
このことが重要になる例として、サービス プリンシパルが Azure Data Lake Storage Gen2 アカウントに格納されているデータへのアクセスを制御する場合が挙げられます。 これらのサービス プリンシパルを使用してジョブを実行することで、ジョブがストレージ アカウント内のデータにアクセスできるようにし、データ アクセス スコープを制御できます。
このチュートリアルでは、Microsoft Entra ID アプリケーションとサービス プリンシパルを作成し、そのサービス プリンシパルをジョブの所有者にする方法について説明します。 また、ジョブを所有していない他のグループにジョブ実行権限を付与する方法についても説明します。 このチュートリアルで説明するタスクの概要を次に示します。
- Microsoft Entra ID でサービス プリンシパルを作成します。
- Azure Databricks で個人用アクセス トークン (PAT) を作成します。 この PAT を使用して、Databricks REST API に対する認証を行います。
- Databricks SCIM API を使用して、サービス プリンシパルを非管理者ユーザーとして Azure Databricks に追加します。
- Azure Databricks に Azure Key Vault でサポートされるシークレット スコープを作成します。
- シークレット スコープに対する読み取りアクセス権をサービス プリンシパルに付与します。
- Azure Databricks でジョブを作成し、シークレット スコープからシークレットを読み取るようにジョブ クラスターを構成します。
- ジョブの所有権をサービス プリンシパルに譲渡します。
- サービス プリンシパルとしてジョブを実行してテストします。
Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Note
資格情報パススルーが有効になっているクラスターを使用して、サービス プリンシパルが所有するジョブを実行することはできません。 ジョブで Azure Storage にアクセスするためにサービス プリンシパルが必要な場合は、「Azure 資格情報を使用して Azure Data Lake Storage Gen2 または Blob Storage に接続する」を参照してください。
要件
このチュートリアルでは、次のものが必要です。
- Microsoft Entra ID テナントにアプリケーションを登録するために必要なアクセス許可を持つユーザー アカウント。
- ジョブを実行する Azure Databricks ワークスペースの管理特権。
- Azure Databricks に対して API 要求を実行するためのツール。 このチュートリアルでは cURL を使用しますが、REST API 要求を送信できる任意のツールを使用できます。
Microsoft Entra ID でサービス プリンシパルを作成する
サービス プリンシパルは、Microsoft Entra ID アプリケーションの ID です。 ジョブの実行に使用するサービス プリンシパルを作成するには、次のようにします。
- Azure portal で、[Microsoft Entra ID] > [アプリの登録] > [新規登録] を選びます。 アプリケーションの名前を入力して [登録] をクリックします。
- [証明書とシークレット] に移動して [新しいクライアント シークレット] をクリックし、新しいクライアント シークレットを生成します。 シークレットをコピーして安全な場所に保存します。
- [概要] に移動して、アプリケーション (クライアント) ID とディレクトリ (テナント) ID をメモします。
Azure Databricks 個人用アクセス トークンを作成する
Azure Databricks 個人用アクセストークン (PAT) を使用して、Databricks REST API に対して認証を行います。 API 要求の実行に使用できる PAT を作成するには、次のようにします。
- Azure Databricks ワークスペースに移動します。
- 画面の右上隅にあるユーザー名を選択し、[設定] を選択します。
- [開発者] をクリックします。
- [アクセス トークン] の横にある [管理] をクリックします。
- [新しいトークンの生成] をクリックします。
- トークン値をコピーして保存します。
ヒント
この例では個人用アクセス トークンを使いますが、ほとんどの API には Microsoft Entra ID トークンを使用できます。 PAT は管理用の構成タスクに適していますが、運用環境のワークロードには Microsoft Entra ID トークンを使うことをお勧めします。
セキュリティ上の理由から、PAT の生成を管理者のみに制限することができます。 詳細については、「個人用アクセス トークンを監視および管理する」をご覧ください。
サービス プリンシパルを Azure Databricks ワークスペースに追加する
Service Principals API を使って、ワークスペースに Microsoft Entra ID サービス プリンシパルを追加します。 また、自動ジョブ クラスターを起動するためのアクセス許可をサービス プリンシパルに付与する必要もあります。 これは、allow-cluster-create
アクセス許可によって付与できます。 ターミナルを開き、Databricks CLI を使って次のコマンドを実行して、サービス プリンシパルを追加し、必要なアクセス許可を付与します。
databricks service-principals create --json '{
"schemas":[
"urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"
],
"applicationId":"<application-id>",
"displayName": "test-sp",
"entitlements":[
{
"value":"allow-cluster-create"
}
]
}'
<application-id>
を Microsoft Entra ID アプリケーション登録のApplication (client) ID
に置き換えます。
Azure Databricks に Azure Key Vault でサポートされるシークレット スコープを作成する
シークレット スコープは、セキュリティで保護されたシークレットの保管と管理を提供します。 サービス プリンシパルに関連付けられているシークレットをシークレット スコープに格納します。 シークレットは Azure Databricks シークレット スコープまたは Azure Key Vault でサポートされるシークレット スコープに格納できます。 次の手順では、Azure Key Vault によってサポートされるオプションについて説明します。
- Azure portal で Azure Key Vault インスタンスを作成します。
- Azure Key Vault インスタンスによってサポートされる Azure Databricks シークレット スコープを作成します。
ステップ 1: Azure Key Vault インスタンスを作成する
Azure portal で、[キー コンテナー] > [+ 追加] を選択し、キー コンテナーに名前を付けます。
[Review + create](レビュー + 作成) をクリックします。
検証が完了したら、[作成] をクリックします。
キー コンテナーを作成したら、新しいキー コンテナーの [プロパティ] ページにアクセスします。
[Vault URI](コンテナーの URI) と [リソース ID] をコピーして保存します。
ステップ 2: Azure Key Vault でサポートされるシークレット スコープを作成する
Azure Databricks リソースは、Key Vault でサポートされるシークレット スコープを作成することによって、Azure Key Vault に格納されているシークレットを参照できます。 Azure Databricks シークレット スコープを作成するには、次のようにします。
Azure Databricks の [Create Secret Scope](シークレット スコープの作成) ページ (
https://<per-workspace-url>/#secrets/createScope
) にアクセスします。per-workspace-url
は、Azure Databricks ワークスペースのワークスペースごとの一意の URL に置き換えます。[スコープ名] を入力します。
「ステップ 1: Azure Key Vault インスタンスを作成する」で作成した Azure Key Vault のコンテナー URI とリソース ID の値を入力します。
Create をクリックしてください。
Azure Key Vault にクライアント シークレットを保存する
Azure portal で、[キー コンテナー] サービスにアクセスします。
「ステップ 1: Azure Key Vault インスタンスを作成する」で作成したキー コンテナーを選択します。
[設定] > [シークレット] で、[生成/インポート] をクリックします。
[手動] アップロード オプションを選択し、[値] フィールドにクライアント シークレットを入力します。
Create をクリックしてください。
シークレット スコープに対する読み取りアクセス権をサービス プリンシパルに許可する
シークレット スコープを作成し、そのスコープにサービス プリンシパルのクライアント シークレットを保存しました。 次に、シークレット スコープからシークレットを読み取るためのアクセス権をサービス プリンシパルに付与します。
ターミナルを開き、Databricks CLI を使って次のコマンドを実行します。
databricks secrets put-acl <scope-name> <application-id> READ
<scope-name>
は、クライアント シークレットが格納された Azure Databricks シークレット スコープの名前に置き換えます。<application-id>
を Microsoft Entra ID アプリケーション登録のApplication (client) ID
に置き換えます。
Azure Databricks でジョブを作成し、シークレット スコープからシークレットを読み取るようにクラスターを構成する
これで、新しいサービス リンシパルとして実行できるジョブを作成する準備ができました。 Azure Databricks UI で作成したノートブックを使用して構成を追加し、ジョブ ラスターがサービス リンシパルのシークレットを取得できるようにします。
Azure Databricks のランディング ページにアクセスし、[新規]>[ノートブック] を選択します。 ノートブックに名前を付け、既定の言語として [SQL] を選択します。
ノートブックの最初のセルに「
SELECT 1
」と入力します。 これは、成功した場合に 1 を表示するだけの単純なコマンドです。 Azure Data Lake Storage Gen 2 の特定のファイルまたはパスへのアクセスをサービス プリンシパルに許可している場合は、代わりにそれらのパスから読み取りを行うことができます。[ワークフロー] に移動し、[ジョブの作成] をクリックします。 ジョブとタスクに名前を付け、[ノートブックの選択] をクリックして、作成したノートブックを選択します。
クラスター情報の横にある [編集] をクリックします。
[クラスターの構成] ページで、[詳細オプション] をクリックします。
[Spark] タブで、次の Spark 構成を入力します。
fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net OAuth fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net <application-id> fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net {{secrets/<secret-scope-name>/<secret-name>}} fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net https://login.microsoftonline.com/<directory-id>/oauth2/token
<storage-account>
をデータを含むストレージ アカウントの名前に置き換えます。<secret-scope-name>
は、クライアント シークレットが格納された Azure Databricks シークレット スコープの名前に置き換えます。<application-id>
を Microsoft Entra ID アプリケーション登録のApplication (client) ID
に置き換えます。<secret-name>
は、シークレット スコープのクライアント シークレット値に関連付けられている名前に置き換えます。<directory-id>
を Microsoft Entra ID アプリケーション登録のDirectory (tenant) ID
に置き換えます。
ジョブの所有権をサービス プリンシパルに譲渡する
ジョブに設定できる所有者は 1 人のみです。そのため、ジョブの所有権を自分からサービス プリンシパルに譲渡する必要があります。 他のユーザーが確実にジョブを管理できるようにするために、グループに管理可能アクセス許可を付与することもできます。 この例では、Permissions API を使用してこれらのアクセス許可を設定します。
ターミナルを開き、Databricks CLI を使って次のコマンドを実行します。
databricks permissions set jobs <job-id> --json '{
"access_control_list": [
{
"service_principal_name": "<application-id>",
"permission_level": "IS_OWNER"
},
{
"group_name": "admins",
"permission_level": "CAN_MANAGE"
}
]
}'
<job-id>
をジョブの一意識別子に置き換えます。 ジョブ ID を見つけるには、サイドバーの [ワークフロー] をクリックし、ジョブ名をクリックします。 ジョブ ID は、[ジョブの詳細] サイド パネルにあります。<application-id>
を Microsoft Entra ID アプリケーション登録のApplication (client) ID
に置き換えます。
ジョブには、ノートブックに対する読み取りアクセス許可も必要です。 Databricks CLI を使って次のコマンドを実行して、必要なアクセス許可を付与します。
databricks permissions set notebooks <notebook-id> --json '{
"access_control_list": [
{
"service_principal_name": "<application-id>",
"permission_level": "CAN_READ"
}
]
}'
<notebook-id>
は、ジョブに関連付けられているノートブックの ID に置き換えます。 この ID を見つけるには、Azure Databricks ワークスペースでノートブックに移動し、ノートブックの URL でnotebook/
に続く数値 ID を確認します。<application-id>
を Microsoft Entra ID アプリケーション登録のApplication (client) ID
に置き換えます。
ジョブをテストする
UI、API、または CLI を使用して、ユーザーとしてジョブを実行するのと同じ方法で、サービス プリンシパルを使用してジョブを実行します。 Azure Databricks UI を使用してジョブをテストするには、次のようにします。
- Azure Databricks UI の [ワークフロー] に移動し、ジョブを選択します。
- [今すぐ実行] をクリックします。
すべてが正しく実行されると、ジョブの状態が [成功] と表示されます。 UI でジョブを選択して、出力を確認できます。
詳細情報
ジョブの作成方法と実行方法の詳細については、「Azure Databricks ジョブを作成および実行する」を参照してください。