こちらの続編です。
サービスプリンシパルはGUIアクセスできないアイデンティティですが、Databricksに対する操作の大部分をカバーできます。
これは、
- インフラ管理者がDatabricksの資産の設定を行う
- エンドユーザーがその資産を活用する
- ただし、インフラ管理者は資産の設定のみを許可し、資産のアクセスはさせたくない
と言う要件で有効です。GUIでのアクセスができないので、アクセスすべきではない資産にインフラ管理者がアクセスしてしまうリスクを軽減できます。
ここでは、Unity Catalogの外部ロケーションの作成と権限付与をサービスプリンシパルで行うケースを説明します。
メタストアの設定
外部ロケーションはメタストア管理下にあるので、サービスプリンシパル自体、メタストア管理者である必要があります。
- メタストアのデフォルトの管理者はアカウント管理者ですが、これを専用のグループに変更します。
- アカウントコンソールで
metastore admins
というグループを作成し、そこに以前作成したサービスプリンシパルを追加します。必要に応じて他のアイデンティティを追加します。
- アカウントコンソールのDataにアクセスし、メタストアのConfigurationでMetastore AdminのEditをクリックします。
- 作成したグループを選択してSaveをクリックします。
REST APIによる外部ロケーションの作成
APIリファレンスはこちら。ストレージ資格情報がない場合には別途作成ください。
- エンドポイント:
https://<Databricksワークスペースのホスト名>/api/2.1/unity-catalog/external-locations
- メソッド: POST
- Authorization:
- Type: Bearer
- Token: サービスプリンシパルのトークン
- Body: raw/json
{
"name": "<外部ロケーション名>",
"skip_validation": true,
"url": "<ADLSのパス>",
"read_only": true,
"credential_name": "<ストレージ資格情報の名前>",
"comment": "created by service principal"
}
これで、外部ロケーションが作成されます。作成者のサービスプリンシパルはGUIにアクセスできないので、外部ロケーション経由でファイルを参照するリスクが大きく軽減されます。
REST APIによる外部ロケーションの設定
これだけでは、アクセス権が設定されていないので、これもREST API経由で権限設定を行います。
こちらのAPIを使用します。
- エンドポイント:
https://<Databricksワークスペースのホスト名>/api/2.1/unity-catalog/permissions/{securable_type}/{full_name}
- securable_type:
EXTERNAL_LOCATION
- full_name: 上で作成した外部ロケーション名
- securable_type:
- メソッド: PATCH
- Authorization:
- Type: Bearer
- Token: サービスプリンシパルのトークン
- Body: raw/json
{
"changes": [
{
"principal": "<権限付与対象のアイデンティティ>",
"add": [
"<追加する権限>"
]
}
]
}
こちらの例では、ALL_PRIVILEGES
を付与しています。
これによって、権限付与された側はData Explorer上でも外部ロケーションにアクセスできるようになります。
繰り返しになりますが、サービスプリンシパルのクライアントシークレットやトークンには有効期限があることに注意してください。