【Azure Databricks】複数ワークスペースを分離しつつ Unity Catalog で一括管理したい

# はじめに
先日、Azure Databricks で複数のワークスペースをチーム毎に分けて使用する、という環境の構築を行いました。その際に、 Unity Catalog を用いてワークスペースを一括で管理しつつ、ユーザーは自身の属するワークスペースのみにアクセスできるという条件が必要でした。

この記事では、実際に Unity Catalog で環境を管理できるようになるまで、どのような手順で進めたかを解説します。

# 想定する環境
![DBenv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/d7285c19-1936-0513-86c4-5a27dc1cdcbd.png)

それぞれ別のワークスペースを利用するグループが複数あり、それらを同一の Unity Catalog で管理したいとします。

別のグループのワークスペースやテーブルにはアクセスできないよう分離する必要があります。ここでは、ワークスペース毎にカタログを作成し、それ以下にのみグループ内ユーザーがアクセス可能という構成で進めようと思います。

Azure 上ではリソースグループにまとめてから IAM を利用して許可を与えれば良いのですが、Unity Catalogの方でも独立してユーザーを追加し、アクセス権限を与える必要があります。

# 必要なリソース
- Databricks ワークスペース * N (グループ数)
- Azure Databricks 用のアクセス コネクタ * N
  - 各ワークスペースと対応づけられるように命名+リソースグループに割り振るのが望ましい
  - 対応するストレージに対する「ストレージ BLOB データ共同作成者」のロールを与えておく
- Blob Storage アカウント * N + 1
  - ルートテーブル用に最低1つ必要で、ストレージを厳密に分割する場合さらにワークスペースと同数必要
  - ケースによっては同じストレージを使ったり、コンテナ毎に分割するのもアリかもしれない
  - Gen2 として使うので「ブロックBLOB」「階層型名前空間」を設定
- Azure Databricks SCIM Provisioning Connector * 1
  - 「 Azure Active Directory 」から「エンタープライズアプリケーション」内で検索すると出てくる
  - onmicrosoft のユーザーが利用する場合はほぼ必須となる

# Unity Catalog を構成する

## メタストアを作成する
メタストアの作成には、カタログの置き場所となるGen2コンテナとDatabricks用のアクセスコネクタが必要になります。最初に1セット作っておきましょう。

Gen2 の URL は、**Azure 上でコピーできるものではなく**以下の書式に従って入力する必要があります。
```
abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<path>
```

アクセスコネクタは、以下の画面でIDを確認することができます。
![01_connecter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/7c75c944-b76b-b000-99eb-1332b06909de.png)

最初に、Databricks のアカウントを管理する画面に入るためにワークスペースのうち一つにログインします。

右上にあるユーザー名をクリックしたら、「アカウントを管理」をクリックすると Databricks の管理画面(アカウントコンソール)に入ることができます。
![01_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/667c1190-6f0a-696e-bb84-458c7344fcf8.png)

「データ」の画面に入り、「メタストアを作成」を選択すると設定項目が開きます。コネクタ ID とストレージの URL を入力します。
![01_createmeta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/0bec3fc1-8efe-b75f-fca9-85889a58791b.png)
![01_metastore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/0657520f-70c1-275b-dc8f-2b85b7f01c2b.png)

その次の画面で、割り当てるワークスペースを選択します。

## カタログを作成する
ワークスペースにログインして、「データ」のメニューを開きます。 Unity Catalog の割り当てが完了していれば、「 main 」などのカタログが表示されています。
![01_catalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/66808147-0a7c-f2a6-f8b0-ef29345c4717.png)

カタログ毎に別々のストレージを使う場合は、同数のアクセスコネクタを作成し、接続するストレージをマネージドテーブルの場所として指定する必要があります。
データ画面にある「ストレージ資格情報」を開き、「資格情報の作成」から、名前（任意だがストレージ名と同じで良い）とコネクタの ID を入力します。
![01_external.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/45a20ebd-c75f-3fb8-11b0-90f1a1659023.png)
![01_credential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/5b775bb6-d0b8-d3af-9d2b-367c2714ea01.png)


その次に、 「外部のロケーション」を開き、ストレージ名とストレージのパスを入力して、先ほど作成した資格情報を選択します。
![01_location.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/73e98eb2-b724-4f53-78ba-7d0da7cbc476.png)
![01_entercredential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/99c51fac-982d-71f4-43e2-2792c9ff225e.png)

「カタログを作成」ボタンを押して名前とロケーション情報を入力すると新たにカタログが作成されます。
![01_createcatalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/3a12d253-3252-99bd-d023-21ad47044509.png)

ここで、「ワークスペース」のタブに移動して「全てのワークスペースがアクセス可能」のチェックを外し、現在作業中のワークスペースのみを選択します。
![01_checkworkspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/e59663c3-6a09-76f8-c10b-86ba8dc56c74.png)

これによって、該当のカタログが同じワークスペースからしか見えなくなります。

## ワークスペースを追加する
後からワークスペースを追加する場合は、アカウントコンソールから該当のメタストアを選択し、「ワークスペース」タブを開きます。

すでに割り当てられているワークスペースが表示されていますが、ここで「ワークスペースに割り当て」をクリックすると、ワークスペースを追加することができます。
![01_assignspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/86976826-3d8b-1b4c-a58c-51628b013e44.png)

# ユーザーを追加する
ワークスペースとカタログの準備ができても、ユーザーをワークスペースに招待しなければ利用することはできません。

メールで招待リンクを送る方法もありますが、テナント下に onmicrosoft ユーザーを作成して利用する場合はそうもいかないため、以下の方法によって Azure AD とユーザー情報を同期する方法が必要となります。

## Azure AD とユーザーを同期する
アカウントコンソールから「設定」>「ユーザープロビジョニングを設定」を開きます。
そこでSCIMトークンを生成し、URLと一緒にコピーしておきます。
![01_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/e3c1cee5-0e8f-871c-27b6-c456e35559f5.png)
![01_generatetoken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/1a82585d-1899-9eab-7c57-0a4461b2926f.png)


次に Azure Portal から Azure Active Directory の画面を開き、「エンタープライズアプリケーション」を選択します。
![01_aad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/6820b982-74e4-23cf-ba65-403c1b8a98d3.png)

「Azure Databricks SCIM プロビジョニング コネクタ」を作成していない場合はここから検索して作成します。
![01_connecter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/2200cb52-da08-aee1-84d1-891e4e4804de.png)
![01_searchconnecter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/467ff6ab-88c2-e0fc-8b7a-15ecba892860.png)

コネクタの画面から「プロビジョニング」を選択し、モードを「自動」に切り替えた上で先ほどコピーしたURLとトークンを貼り付けます。その後「テスト接続」を行い、正常に接続が出来ることを確認します。
![01_provisioning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/c260f845-61a6-e491-2b8a-402caad2864f.png)


次に、「ユーザーとグループ」からワークスペースに招待するユーザーを追加します。なお、Active Directory のプランが無料だとグループ単位での追加ができません。
![01_adduser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/cc11613a-b201-b1d1-ff12-b906c40cd0e1.png)

これで AAD のユーザーを Unity Catalog と同期できるようになりますが、反映されるまでしばらく待つ必要があります。

## ユーザーをワークスペースに割り当てる
アカウントコンソールから「ユーザー」を選択し、「グループ」タブを開きます。

管理をしやすくするために、グループとワークスペースを対応させたいところですが、先述のようにグループを同期できない場合はこちらで作成する必要があります。
![01_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/c7d77f42-2bd9-eecf-578f-145032ecd33c.png)

グループを作成後、「ワークスペース」タブに移動し、ワークスペース名を選択してから、「権限」でアクセス可能なグループを追加します。
![01_permissions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/ee87c3b2-c43d-0f31-57db-01074edf9794.png)
![01_addpermissions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/72bfe5a1-1109-9b91-ffc6-fe164890c5a7.png)

これでユーザーがワークスペースにアクセスできるようになりましたが、カタログへのアクセスは許可されていない状況なので、ワークスペースから権限の編集を行ってください。
![01_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/ca5a4f7d-7a27-04fb-7348-83c22efcab5e.png)
![01_grant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/f23645e2-af72-0157-b9e1-01dcaa868693.png)

基本的に当該カタログへの「USE」は必要になりますが、それ以下の部分に対しては、例えば新規スキーマの作成を認めるかなどユースケースにより変化すると思いますので、以下を参考に適切な権限を割り振る必要があります。

https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/manage-privileges/privileges

# まとめ
以上の通り、Unity Catalog を活用する場合、ワークスペース以外にも作成するリソースが増える他、権限についてもAzureのものとは別に設定する必要が出てきます。

しかし、今回のようにワークスペースを分離する必要があった場合でも権限を一貫して設定出来たり、複数のデータベースを一か所で管理することができたりとメリットも多いため、特に大規模な Databricks 環境を組む際は是非とも利用できるようにしておきたいですね。