はじめに
先日、Azure Databricks で複数のワークスペースをチーム毎に分けて使用する、という環境の構築を行いました。その際に、 Unity Catalog を用いてワークスペースを一括で管理しつつ、ユーザーは自身の属するワークスペースのみにアクセスできるという条件が必要でした。
この記事では、実際に Unity Catalog で環境を管理できるようになるまで、どのような手順で進めたかを解説します。
想定する環境
それぞれ別のワークスペースを利用するグループが複数あり、それらを同一の 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を確認することができます。
最初に、Databricks のアカウントを管理する画面に入るためにワークスペースのうち一つにログインします。
右上にあるユーザー名をクリックしたら、「アカウントを管理」をクリックすると Databricks の管理画面(アカウントコンソール)に入ることができます。
「データ」の画面に入り、「メタストアを作成」を選択すると設定項目が開きます。コネクタ ID とストレージの URL を入力します。
その次の画面で、割り当てるワークスペースを選択します。
カタログを作成する
ワークスペースにログインして、「データ」のメニューを開きます。 Unity Catalog の割り当てが完了していれば、「 main 」などのカタログが表示されています。
カタログ毎に別々のストレージを使う場合は、同数のアクセスコネクタを作成し、接続するストレージをマネージドテーブルの場所として指定する必要があります。
データ画面にある「ストレージ資格情報」を開き、「資格情報の作成」から、名前(任意だがストレージ名と同じで良い)とコネクタの ID を入力します。
その次に、 「外部のロケーション」を開き、ストレージ名とストレージのパスを入力して、先ほど作成した資格情報を選択します。
「カタログを作成」ボタンを押して名前とロケーション情報を入力すると新たにカタログが作成されます。
ここで、「ワークスペース」のタブに移動して「全てのワークスペースがアクセス可能」のチェックを外し、現在作業中のワークスペースのみを選択します。
これによって、該当のカタログが同じワークスペースからしか見えなくなります。
ワークスペースを追加する
後からワークスペースを追加する場合は、アカウントコンソールから該当のメタストアを選択し、「ワークスペース」タブを開きます。
すでに割り当てられているワークスペースが表示されていますが、ここで「ワークスペースに割り当て」をクリックすると、ワークスペースを追加することができます。
ユーザーを追加する
ワークスペースとカタログの準備ができても、ユーザーをワークスペースに招待しなければ利用することはできません。
メールで招待リンクを送る方法もありますが、テナント下に onmicrosoft ユーザーを作成して利用する場合はそうもいかないため、以下の方法によって Azure AD とユーザー情報を同期する方法が必要となります。
Azure AD とユーザーを同期する
アカウントコンソールから「設定」>「ユーザープロビジョニングを設定」を開きます。
そこでSCIMトークンを生成し、URLと一緒にコピーしておきます。
次に Azure Portal から Azure Active Directory の画面を開き、「エンタープライズアプリケーション」を選択します。
「Azure Databricks SCIM プロビジョニング コネクタ」を作成していない場合はここから検索して作成します。
コネクタの画面から「プロビジョニング」を選択し、モードを「自動」に切り替えた上で先ほどコピーしたURLとトークンを貼り付けます。その後「テスト接続」を行い、正常に接続が出来ることを確認します。
次に、「ユーザーとグループ」からワークスペースに招待するユーザーを追加します。なお、Active Directory のプランが無料だとグループ単位での追加ができません。
これで AAD のユーザーを Unity Catalog と同期できるようになりますが、反映されるまでしばらく待つ必要があります。
ユーザーをワークスペースに割り当てる
アカウントコンソールから「ユーザー」を選択し、「グループ」タブを開きます。
管理をしやすくするために、グループとワークスペースを対応させたいところですが、先述のようにグループを同期できない場合はこちらで作成する必要があります。
グループを作成後、「ワークスペース」タブに移動し、ワークスペース名を選択してから、「権限」でアクセス可能なグループを追加します。
これでユーザーがワークスペースにアクセスできるようになりましたが、カタログへのアクセスは許可されていない状況なので、ワークスペースから権限の編集を行ってください。
基本的に当該カタログへの「USE」は必要になりますが、それ以下の部分に対しては、例えば新規スキーマの作成を認めるかなどユースケースにより変化すると思いますので、以下を参考に適切な権限を割り振る必要があります。
まとめ
以上の通り、Unity Catalog を活用する場合、ワークスペース以外にも作成するリソースが増える他、権限についてもAzureのものとは別に設定する必要が出てきます。
しかし、今回のようにワークスペースを分離する必要があった場合でも権限を一貫して設定出来たり、複数のデータベースを一か所で管理することができたりとメリットも多いため、特に大規模な Databricks 環境を組む際は是非とも利用できるようにしておきたいですね。