Service principals for Databricks automation | Databricks on AWS [2022/7/8時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
サービスプリンシパルはスクリプト、アプリケーション、CI/CDプラットフォームのような自動化ツール、自動化システムで使用するために作成されるアイデンティティです。
セキュリティのベストプラクティスとして、自動化ツールやサービスにDatabricksリソースへのアクセスを許可する際、DatabricksユーザーやあなたのワークスペースのDatabricksアクセストークンではなく、DatabricksのサービスプリンシパルとDatabricksアクセストークンを使用することをお勧めします。このアプローチには以下のメリットがあります。
- ユーザーと独立したDatabricksサービスプリンシパルにDatabricksリソースへのアクセスを許可、制限することができます。例えば、Databricksサービスプリンシパルがお使いのDatabricksワークスペースの管理者として振る舞うことを禁止しつつも、特定の他のユーザーは管理者としてあり続けられるようにできます。
- 自動化ツールやシステムによる自分のアクセストークンへのアクセスを防御することができます。
- 他のユーザーに影響を与えることなしに、Databricksサービスプリンシパルを一時的に無効化、あるいは恒久的に削除することができます。例えば、これによって、不正な方法で使用していると疑わしいDatabricksサービスプリンシパルからのアクセスを停止、削除することができます。
- ユーザーが皆様の組織を去った際、いかなるDatabricksサービスプリンシパルに影響を与えることなしにそのユーザーを削除することができます。
Databricksサービスプリンシパルを作成するには、以下のツールやAPIを使用します。
- SCIM API 2.0 (ServicePrincipals)を用いて、ワークスペース上にDatabricksサービスプリンシパルを作成します。
- Token Management API 2.0を用いてDatabricksサービスプリンシパルのDatabricksアクセストークンを作成します。
これらのAPIを呼び出すために、curl
やPostmanのようなツールを利用できます。Databricksユーザーインタフェースを使うことはできません。
本書では以下を説明します。
- DatabricksワークスペースでDatabricksサービスプリンシパルを作成する方法
- Databricksサービスプリンシパル向けのDatabricksアクセストークンを作成する方法
要件
- あなたのDatabricksワークスペースユーザーのDatabricksパーソナルアクセストークン。これによってDatabricks APIを呼び出せるようになります。
- curlやPostmanのようなDatabricks APIを呼び出すためのツール。
PostmanでDatabricks APIを呼び出す際には、本文の例のようにワークスペースのインスタンス名、例えばdbc-a1b2345c-d6e7.cloud.databricks.com
やワークスペースユーザーのDatabriksパーソナルアクセストークンを入力するのではなく、Postmanで変数を定義し、利用することもできることに注意してください。
curl
を用いてDatabricks APIを呼び出す場合、本書のcurl
のサンプルでは、お使いのDatabricksワークスペースのインスタンスURL、例えばhttps://dbc-a1b2345c-d6e7.cloud.databricks.com
とワークスペースユーザーのDatabricksパーソナルアクセストークンを表す環境変数DATABRICKS_HOST
とDATABRICKS_TOKEN
を使用しています。これらの環境変数を設定するには、以下の操作を行なってください。
Unix、Linux、macOS
現在のターミナルセッションのみの環境変数を設定するには、以下のコマンドを実行します。すべてのターミナルセッションの環境変数を設定するには、シェルのスタートアップファイルに以下のコマンドを入力し、ターミナルを再起動します。サンプルの値をご自身の環境の値で置き換えてください。
export DATABRICKS_HOST="https://dbc-a1b2345c-d6e78.cloud.databricks.com"
export DATABRICKS_TOKEN="dapi1234567890b2cd34ef5a67bc8de90fa12b"
Windows
現在のコマンドプロンプトセッションのみの環境変数を設定するには、以下のコマンドを実行してください。サンプルの値をご自身の環境の値で置き換えてください。
set DATABRICKS_HOST="https://dbc-a1b2345c-d6e78.cloud.databricks.com"
set DATABRICKS_TOKEN="dapi1234567890b2cd34ef5a67bc8de90fa12b"
すべてのコマンドプロンプトのセッションの環境変数を設定するには、以下のコマンドを実行しコマンドプロンプトを再起動してください。サンプルの値をご自身の環境の値で置き換えてください。
setx DATABRICKS_HOST "https://dbc-a1b2345c-d6e78.cloud.databricks.com"
setx DATABRICKS_TOKEN "dapi1234567890b2cd34ef5a67bc8de90fa12b"
curl
でDatabricks APIを呼び出す際には、以下のことにも注意してください。
-
本書の
curl
のサンプルではUnix、Linux、macOSフォーマットを使用しています。Windowsのコマンドシェルでは、\
を^
、${...}
を%...%
で置き換えてください。 -
curl
の結果を読みやすくするために、JSONフォーマットの出力を整形するjqのようなツールを使用することができます。本書のcurl
サンプルでは、JSON出力をフォーマッティングするためにjq
を使用しています。 -
複数のワークスペースを操作する際、
DATABRICKS_HOST
やDATABRICKS_TOKEN
を変更し続けるのではなく、.netrcファイルを使用することができます。.netrc
ファイルを使っている場合には、以下のように本書のcurl
サンプルを変更してください。-
curl -X
をcurl --netrc -X
に変更します。 -
${DATABRICKS_HOST}
をお使いのDatabricksワークスペースインスタンスURL、例えばhttps://dbc-a1b2345c-d6e7.cloud.databricks.com
に置き換えます。 -
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
を削除します。
-
Databricksサービスプリンシパルの作成
すでにDatabricksサービスプリンシパルがある場合には、DatabricksサービスプリンシパルのためのDatabricksアクセストークンを作成するために次のセクションにスキップしてください。
DatabricksワークスペースにDatabricksサービスプリンシパルを追加するために、curl
やPostmanのようなツールを使うことができます。以下の指示では、下の置き換えを行なってください。
-
<display-name>
をDatabricksサービスプリンシパルの表示名で置き換えてください。 -
entitlements
の配列を、Databricksサービスプリンシパルに追加する任意のエンタイトルメントで置き換えてください。このサンプルでは、Databricksサービスプリンシパルにクラスターを作成する権限を許可します。DatabricksサービスプリンシパルにはデフォルトでワークスペースへのアクセスとDatabricks SQLへのアクセスが許可されています。 -
<group-id>
をDatabricksサービスプリンシパルを属させたいDatabricksワークスペースのグループIDで置き換えてください。(それぞれのDatabricksサービスプリンシパルではなく、グループにアクセス権を設定する方が容易です)- グループを追加するには、
groups
配列にグループIDを追加します。 - グループIDを取得するにはGet groupsを呼び出します。
- グループを作成するには、ユーザーインタフェースでグループを追加するか、Create group APIをコールします。
- グループにアクセス権を追加するには、ユーザーインタフェースのオプションのManage workspace-level groupsをご覧いただくか、Permissions API 2.0を呼び出してください。
- Databricksサービスプリンシパルがグループに属さないようにするには、
groups
配列を削除します。
- グループを追加するには、
Curl
以下のコマンドを実行します。create-service-principal.json
がコマンドを実行する場所と同じディレクトリに存在するようにしてください。
DatabricksサービスプリンシパルのDatabricksアクセストークンを作成する際に必要になるので、コマンドのアウトプットのapplicationId
の値をコピーしておきます。
curl -X POST \
${DATABRICKS_HOST}/api/2.0/preview/scim/v2/ServicePrincipals \
--header "Content-type: application/scim+json" \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--data @create-service-principal.json \
| jq .
{
"displayName": "<display-name>",
"entitlements": [
{
"value": "allow-cluster-create"
}
],
"groups": [
{
"value": "<group-id>"
}
],
"schemas": [ "urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal" ],
"active": true
}
Postman
-
新規HTTPリクエストを作成します(File > New > HTTP Request)。
-
HTTP verbドロップダウンリストでPOSTを選択します。
-
Enter request URLに
https://<databricks-instance-name>/api/2.0/preview/scim/v2/ServicePrincipals
を入力します。ここでは、<databricks-instance-name>
は、dbc-a1b2345c-d6e7.cloud.databricks.com
のようなお使いのDatabricksワークスペースインスタンス名です。 -
AuthorizationタブのTypeリストでBearer Tokenを選択します。
-
Tokenには、あなたのDatabricksユーザーのDatabricksパーソナルアクセストークンを入力します。
-
Headersタブで
Content-Type
とapplication/scim+json
のKeyとValueのペアを追加します。 -
BodyタブでrawとJSONを選択します。
-
以下のbodyペイロードを入力します。
JSON{ "displayName": "<display-name>", "entitlements": [ { "value": "allow-cluster-create" } ], "groups": [ { "value": "<group-id>" } ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal" ], "active": true }
-
Sendをクリックします。
-
DatabricksサービスプリンシパルのDatabricksアクセストークンを作成する際に必要になるので、responseペイロードの
applicationId
の値をコピーしておきます。
Databricksサービスプリンシパル向けのDatabricksアクセストークンの作成
ステップ1: DatabricksサービスプリンシパルのIDの取得
すでにDatabricksサービスプリンシパルのIDを取得しているのであればステップ2にスキップしてください。
DatabricksサービスプリンシパルのIDを取得するために、curl
やPostmanのようなツールを使うことができます。IDを取得するには以下を実行します。
Curl
以下のコマンドを実行します。コマンドのアウトプットでDatabricksサービスプリンシパルのapplicationId
をコピーします。
curl -X GET \
${DATABRICKS_HOST}/api/2.0/preview/scim/v2/ServicePrincipals \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
| jq .
Postman
- 新規HTTPリクエストを作成します(File > New > HTTP Request)。
- HTTP verbドロップダウンリストでGETを選択します。
-
Enter request URLに
https://<databricks-instance-name>/api/2.0/preview/scim/v2/ServicePrincipals
を入力します。ここでは、<databricks-instance-name>
は、dbc-a1b2345c-d6e7.cloud.databricks.com
のようなお使いのDatabricksワークスペースインスタンス名です。 - AuthorizationタブのTypeリストでBearer Tokenを選択します。
- Tokenには、あなたのDatabricksユーザーのDatabricksパーソナルアクセストークンを入力します。
- Sendをクリックします。
- responseペイロードでDatabricksサービスプリンシパルの
applicationId
をコピーします。
ステップ2: Databricksサービスプリンシパル向けのDatabricksアクセストークンの作成
DatabricksサービスプリンシパルのDatabricksアクセストークンを作成するためにcurl
かPostmanを使うことができます。以下の手順では下の置き換えを行なってください。
-
<application-id>
をDatabricksサービスプリンシパルのapplicationId
で置き換えてください。 -
<comment>
を任意のDatabricksアクセストークンのコメントで置き換えてください。コメントを追加しない場合には、comment
オブジェクトを削除してください。 -
1209600
をDatabricksアクセストークンの有効期限の秒数で置き換えてください。この例では14日を指定しています。
重要!
上の時間を経過すると、このDatabricksアクセストークンは無効化され、このDatabricksアクセストークンに依存しているいかなるCI/CDプラットフォームは動作しなくなります。このような状況を回避するためには、有効期限が切れる前に新たなDatabricksアクセストークンを作成し、CI/CDプラットフォームに割り当てる必要があります。
Curl
以下のコマンドを実行します。create-service-principal-token.json
がコマンドを実行する場所と同じディレクトリに存在するようにしてください。
CI/CDプラットフォームのセットアップに必要になるので、コマンドの出力からtoken_value
の値をコピーしておきます。
注意
アクセスが拒否されたメッセージを受け取る場合には、DatabricksサービスプリンシパルにDatabricksアクセストークンの使用を許可するCan Use権限を許可するために、Manage token permissions using the admin consoleをご覧ください。
curl -X POST \
${DATABRICKS_HOST}/api/2.0/token-management/on-behalf-of/tokens \
--header "Content-type: application/json" \
--header "Authorization: Bearer ${DATABRICKS_TOKEN}" \
--data @create-service-principal-token.json \
| jq .
{
"application_id": "<application-id>",
"comment": "<comment>",
"lifetime_seconds": 1209600
}
Postman
-
新規HTTPリクエストを作成します(File > New > HTTP Request)。
-
HTTP verbドロップダウンリストでPOSTを選択します。
-
Enter request URLに
https://<databricks-instance-name>/api/2.0/token-management/on-behalf-of/tokens
を入力します。ここでは、<databricks-instance-name>
は、dbc-a1b2345c-d6e7.cloud.databricks.com
のようなお使いのDatabricksワークスペースインスタンス名です。 -
AuthorizationタブのTypeリストでBearer Tokenを選択します。
-
Tokenには、あなたのDatabricksユーザーのDatabricksパーソナルアクセストークンを入力します。
-
Headersタブで
Content-Type
とapplication/scim+json
のKeyとValueのペアを追加します。 -
BodyタブでrawとJSONを選択します。
-
以下のbodyペイロードを入力します。
JSON{ "application_id": "<application-id>", "comment": "<comment>", "lifetime_seconds": 1209600 }
-
Sendをクリックします。
-
CI/CDプラットフォームのセットアップに必要になるので、responsペイロードから
token_value
の値をコピーしておきます。
注意
アクセスが拒否されたメッセージを受け取る場合には、DatabricksサービスプリンシパルにDatabricksアクセストークンの使用を許可するCan Use権限を許可するために、Manage token permissions using the admin consoleをご覧ください。その後に再度Sendをクリックしてください。