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

はじめに

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

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

想定する環境

DBenv.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 上でコピーできるものではなく以下の書式に従って入力する必要があります。

アクセスコネクタは、以下の画面でIDを確認することができます。
01_connecter.png

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

右上にあるユーザー名をクリックしたら、「アカウントを管理」をクリックすると Databricks の管理画面(アカウントコンソール)に入ることができます。
01_console.png

「データ」の画面に入り、「メタストアを作成」を選択すると設定項目が開きます。コネクタ ID とストレージの URL を入力します。
01_createmeta.png
01_metastore.png

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

カタログを作成する

ワークスペースにログインして、「データ」のメニューを開きます。 Unity Catalog の割り当てが完了していれば、「 main 」などのカタログが表示されています。
01_catalog.png

カタログ毎に別々のストレージを使う場合は、同数のアクセスコネクタを作成し、接続するストレージをマネージドテーブルの場所として指定する必要があります。
データ画面にある「ストレージ資格情報」を開き、「資格情報の作成」から、名前(任意だがストレージ名と同じで良い)とコネクタの ID を入力します。
01_external.png
01_credential.png

その次に、 「外部のロケーション」を開き、ストレージ名とストレージのパスを入力して、先ほど作成した資格情報を選択します。
01_location.png
01_entercredential.png

「カタログを作成」ボタンを押して名前とロケーション情報を入力すると新たにカタログが作成されます。
01_createcatalog.png

ここで、「ワークスペース」のタブに移動して「全てのワークスペースがアクセス可能」のチェックを外し、現在作業中のワークスペースのみを選択します。
01_checkworkspace.png

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

ワークスペースを追加する

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

すでに割り当てられているワークスペースが表示されていますが、ここで「ワークスペースに割り当て」をクリックすると、ワークスペースを追加することができます。
01_assignspace.png

ユーザーを追加する

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

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

Azure AD とユーザーを同期する

アカウントコンソールから「設定」>「ユーザープロビジョニングを設定」を開きます。
そこでSCIMトークンを生成し、URLと一緒にコピーしておきます。
01_setup.png
01_generatetoken.png

次に Azure Portal から Azure Active Directory の画面を開き、「エンタープライズアプリケーション」を選択します。
01_aad.png

「Azure Databricks SCIM プロビジョニング コネクタ」を作成していない場合はここから検索して作成します。
01_connecter.png
01_searchconnecter.png

コネクタの画面から「プロビジョニング」を選択し、モードを「自動」に切り替えた上で先ほどコピーしたURLとトークンを貼り付けます。その後「テスト接続」を行い、正常に接続が出来ることを確認します。
01_provisioning.png

次に、「ユーザーとグループ」からワークスペースに招待するユーザーを追加します。なお、Active Directory のプランが無料だとグループ単位での追加ができません。
01_adduser.png

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

ユーザーをワークスペースに割り当てる

アカウントコンソールから「ユーザー」を選択し、「グループ」タブを開きます。

管理をしやすくするために、グループとワークスペースを対応させたいところですが、先述のようにグループを同期できない場合はこちらで作成する必要があります。
01_group.png

グループを作成後、「ワークスペース」タブに移動し、ワークスペース名を選択してから、「権限」でアクセス可能なグループを追加します。
01_permissions.png
01_addpermissions.png

これでユーザーがワークスペースにアクセスできるようになりましたが、カタログへのアクセスは許可されていない状況なので、ワークスペースから権限の編集を行ってください。
01_data.png
01_grant.png

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

まとめ

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

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

この記事を書いた人

azure-recipe-user