【Databricks】Unity Catalogを作成してみた-2

# 背景・目的
前回、[【Databricks】Unity Catalogを作成してみた](https://qiita.com/zumax/items/c84ea4f13459f887b393)の記事で、Unity Catalogのセットアップを行いました。
前回に引き続き、Unity Catalogについて操作していきたいと思います。
今回、実施する内容は下記のとおりです。

- ユーザーとグループの追加
- クラスターまたはSQLウェアハウスの作成
- 最初のテーブルを作成し、アクセス許可を管理する
- ノートブックの例: 最初のテーブルを作成し、アクセス許可を管理する

# まとめ
- Databricksクラスタは下記の2つがある。
    - All-Purpose：対話型ノートブックを実行し、複数人で共有し使用する
    - Databricksジョブスケジューラ:高速で堅牢な自動化ジョブの実行に使用する。ジョブ単位にクラスタを起動し使用する。
- SQL Warehouseは、SQLを実行できるコンピュートリソース。
- クラスタポリシーは、クラスタ作成権限を制御するために使用するツール。

# 概要
本検証で登場する概念、用語について整理します。

## クラスター
[クラスター](https://docs.databricks.com/ja/clusters/index.html)を元に整理します。

>Databricks クラスターは、データエンジニアリング、データサイエンス、データ分析のワークロードを実行する一連の計算リソースと構成です。運用ETLパイプライン、ストリーミング分析、アドホック分析、機械学習などが含まれます。
>これらのワークロードは、ノートブック内の一連のコマンドとして、または自動化された ジョブとして実行します。Databricksでは、All-Purposeクラスターとジョブクラスターが区別されます。All-Purposeクラスターは、対話型ノートブックを使用して共同でデータを分析する場合に使用します。ジョブクラスターは、高速で堅牢な自動化ジョブの実行に使用します。
> - All-Purposeクラスターは、UI、CLI、またはREST APIを使用して作成できます。All-Purposeクラスターは手動で終了と再起動ができます。複数のユーザーでクラスターを共有し、共同でインタラクティブ分析を行えます。
> - Databricksジョブスケジューラは、新しいジョブクラスターでジョブを実行したときにジョブクラスターを作成し、ジョブが完了したときにそのクラスターを終了します。ジョブクラスターを再起動することはできません。

- Databricksクラスターは、下記のワークロードを実行するコンピュートリソースと構成を指します。
    - データエンジニアリング
    - データサイエンス
    - データ分析
- 下記のようなものが含まれます。
    - 運用ETLのパイプライン
    - ストリーミング分析
    - アドホック分析
    - 機械学習
- 下記のクラスタに大別されます。
    - All-Purposeクラスタ
        - 対話型ノートブック
        - 複数のユーザーでクラスタを共有し、共同でインタラクティブに分析が可能
    - Databricksジョブスケジューラ
        - 高速で堅牢な自動化ジョブの実行に使用する。
        - ジョブを実行したときにクラスタを作成し、ジョブが完了するとクラスタが終了する。
        - ジョブクラスタを再起動することは出来ない。

## SQL Warehouse
[SQLウェアハウスとは何ですか?](https://docs.databricks.com/ja/sql/admin/create-sql-warehouse.html)をもとに整理します。

>SQLウェアハウスは、Databricks SQL 内のデータ オブジェクトに対して SQL コマンドを実行 できるコンピュート リソースです。 コンピュート リソースは、処理機能を提供するインフラストラクチャ リソースです。 クラウド上で.
>SQLウェアハウス ダッシュボードに移動するには、サイドバーの [エンドポイント アイコン SQLウェアハウス] をクリックします。デフォルトでは、倉庫は州別 (最初に実行中の倉庫) でソートされ、次にアルファベット順にソートされます。
> すぐに開始できるように、Databricks では、 スターター ウェアハウスと呼ばれる小さな SQLウェアハウスが自動的に作成されます。 この SQLウェアハウス edit または削除することができます。

- SQL Warehouseは、SQLを実行できるコンピュートリソース
- 作成するには、ワークスペース管理者または、無制限のクラスタ作成アクセス許可を持つユーザである

### SQLウェアハウス アクセス制御
SQLウェアハウス アクセス制御では、個々の権限によってユーザーの能力が決まります。

SQLウェアハウスには、下記の4つのアクセス許可レベルがあります。
- 権限なし
- 使用可能
- 所有者
- 管理可能


|能力 |権限なし|使用可能|所有者| 管理可能|
|:--|:--:|:--:|:--:|:--:|
|クエリをすべて表示|||◯|◯|
|詳細を表示||◯|◯|◯|
|監視タブの表示|||◯|◯|
|ウェアハウスの開始||◯|◯|◯|
|ウェアハウスの停止|||◯|◯|
|ウェアハウスの削除|||◯|◯|
|ウェアハウスの編集|||◯|◯|
|ウェアハウスのアクセス許可の変更|||◯|◯|





## クラスタポリシー
[クラスターポリシーを管理する](https://docs.databricks.com/ja/administration-guide/clusters/policies.html)をもとに整理します。

> クラスターポリシーは、一連のポリシールールに基づいてユーザーまたはグループのクラスター作成権限を制限するために使用されるツールです。
> クラスターポリシーを使用すると、次のことが可能です。
> - ユーザーによるクラスターの作成を所定の設定に制限します。
> - ユーザーによるクラスターの作成を特定の数に制限します。
> - （一部の値を修正および非表示にすることによって）ユーザーインターフェースを簡素化し、より多くのユーザーが独自のクラスターを作成できるようにします。
> - クラスターごとの最大コストを制限してコストを制御します（時間単位の価格に寄与する値を持つ属性に制限を設定します）。

- ポリシールールを作成し、一定の制限をかけるもの。
- コントロール可能なものは下記の通り
    - 所定の設定
    - クラスタ数
    - 設定項目を非表示にする
    - クラスタごとの最大コスト

### パーソナルコンピューティングポリシー
> パーソナルコンピューティングは、すべてのDatabricksワークスペースでデフォルトで使用できるDatabricksマネージドクラスターポリシーです。このポリシーへのアクセス権をユーザーに付与すると、ユーザーは各自が使用するためにDatabricks内で単一マシンのコンピュートリソースを作成できます。

- すべてのワークスペースでデフォルトで使用できるDatabricksマネジドクラスタポリシー
- 付与されたユーザは単一マシンのコンピュートリソースを作成できる

### 属性
マネージドクラスター属性とアンマネージドクラスター属性の2つがある。
- マネージドクラスター属性は、下記の制御が可能
    - 最大DBU時間メトリクス
        - 個々のクラスタレベルでコストを制御できる
    - クラスタ作成元の制限
        - UI、REST API、ジョブ等の作成元を制御できる
- アンマネージドクラスター属性。下記の制御は不可。
    - ライブラリAPI
    - クラスタ権限（ACL）



# 実践
## ユーザーとグループの追加
[ユーザーとグループの追加](https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html#add-users-and-groups)を元に試します。

### ユーザの追加
1. Databricksのアカウントコンソールにサインインします。
1. ナビゲーションペインの「ユーザ管理」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e82962a-0cc3-bc7c-0ba3-b3b46bca21b2.png" width=200>

1. 「ユーザを追加」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/977854f4-0012-e605-352b-b5dc8ef208bf.png)

1. ユーザを追加画面で下記を入力し、「ユーザを追加」ボタンをクリックします。
    - メール
    - 氏名
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ad6d118b-9f00-5bf0-5739-a0c1746e0842.png" width=500>

1. 登録したメールアドレス宛にInvitaitonが届くので、リンクをクリックします。
1. パスワードを設定します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bbe6fa2e-2977-4601-6db8-12d145372f66.png" width=400>

1. この時点ではワークスペースにアクセスできません。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/823d4c29-3893-a6ce-d2a8-555d78c4e917.png" width=400>

### グループの追加
1. ユーザ管理画面で「グループ」タブをクリックし、「グループを追加」ボタンをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/11590cab-5765-98db-5345-234e55c75b8f.png" width=800>

1. グループ名を入力し、「保存」をクリックします。ここでは「admin」としました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2e9d5890-aa06-d6cb-e7ef-46207834f3fe.png" width=600>

1. グループ名をクリックし、「メンバーを追加」ボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1acf1d7b-8237-f785-e06d-2ca795915a67.png)

1. ポップアップが表示されるので、追加したメンバーを選択し、「追加」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cdbcf936-6442-e1f4-596b-b06dea79f6ec.png" width=600>

### ワークスペースにグループを追加

1. ナビゲーションペインで「ワークスペース」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a9bd7f38-0fc8-0bc6-6e9b-55b7d97859bd.png" width=200>

1. ワークスペース名をクリックします。
1. 権限タブをクリックし、「権限を追加」をクリックします。
1. ポップアップが表示されるので、グループと権限を選択し、最後に「保存」をクリックします。権限は、「Admin」と「User」の2つから選べます。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/35474f70-5810-ea24-638a-397e25ecb62d.png" width=600>

1. 追加されました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/94e56557-90fe-7d39-26f7-a9443a48db87.png" width=800>

## クラスターまたはSQLウェアハウスの作成
>テーブルの作成と権限の割り当てを開始する前に、テーブルの作成と権限の割り当てのワークロードを実行するためのコンピュートリソースを作成する必要があります。

>Unity Catalogで定義されたテーブルは、きめ細かなアクセス制御によって保護されます。アクセス制御を確実に実施するために、コンピュートリソースが安全な構成に準拠していることが求められます。コンピュートリソースが安全な構成に準拠していない場合、Unity Catalo内のテーブルにアクセスできません。

>Databricksには、次の2種類のコンピュートリソースが用意されています。

> - クラスターは、データサイエンスとエンジニアリングおよびDatabricks Machine Learningペルソナベースの環境でのワークロードに使用されます（DatabricksノートブックでSQLコマンドを実行する場合など）。
> - SQLウェアハウスは、Databricks SQLクエリを実行するために使用されます。

> 使用している環境に応じて、Databricks SQL用のSQLウェアハウス、またはデータサイエンスとエンジニアリングおよびDatabricks Machine Learning環境用のクラスターのいずれかのコンピュートリソースを使用してUnity Catalogを操作できます。

- 先ずはコンピュートリソースを作成する。コンピュートリソースは下記の2つある。
    - クラスタ
        - データサイエンス
        - データエンジニアリング
        - Databricks Machine Learning
    - SQLウェアハウス
- コンピュートリソースは安全な構成である必要がある。

### クラスタの作成〜停止
#### クラスタの作成
1. ワークスペースに上記で作成したユーザでログインします。
1. ナビゲーションペインで「クラスター」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1540ac08-ca04-d828-01e6-3422a4c58e97.png" width=200>

1. 右上の「コンピューティングを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ff82f9f3-d9a6-9276-2037-7a283e68b95f.png)

1. 下記の内容を入力し、最後に「コンピューティングを作成」をクリックします。
    - クラスタ名：Cluster1（任意）
    - ポリシー：制限なし
    - アクセスモード：共有
    - バージョン：Runtime 13.2
    - ワーカータイプ：m6i.large
        - 最小、最大を1
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4a6cdeef-0374-917a-c90e-6dd19f460655.png" width=600>

1. しばらくすると（5分程度かかりました。）、クラスタが作成されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8ed4eb2d-93d5-9d00-caa8-b15b59116442.png)

1. AWSでEC2ダッシュボードを確認すると、想定通りのインスタンスタイプと台数が起動されていることがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d87b538f-bc26-1721-7d4d-01e82c078cb4.png)

#### クラスタの停止
1. クラスタの停止ボタン（四角）をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/631e8689-bc61-dc40-30fa-75746d3cc9c7.png" width=150>

1. ポップアップが表示されるので、「確認」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/499f0a35-5f51-b625-c229-e93aa649f80c.png" width=400>

1. すぐに停止されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2f8f649d-0ee3-5dc3-eb83-cf9fff612bc1.png)

1. 対象のEC2も停止されました。**※停止までしばらく(5分ほど)かかりました。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c273ab66-9961-8b33-5768-770fdc4b7676.png)


### SQLウェアハウスの作成〜停止
#### SQLウェアハウスの作成
1. ワークスペースに上記で作成したユーザでサインインします。
1. ナビゲーションペインで「クラスター」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1540ac08-ca04-d828-01e6-3422a4c58e97.png" width=200>

1. ①「SQLウェアハウス」タブをクリックし、②「SQLウェアハウスを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/170a774c-3e81-521c-5355-8da1e587a547.png)

1. 下記を入力し、最後に「作成」をクリックします。
    - エンドポイント名：任意
    - クラスターサイズ：XXS〜XXXL
    - 自動停止時間：今回は10分間としました。
    - スケーリング：最小1〜最大1
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/84f76bd5-3f4c-4bcf-62fe-a1da95a2e13e.png)

1. 権限管理のポップアップが表示されるので、作成したadminグループを「管理可能」として付与します。
1. 起動されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/90cf8aae-bd2a-8b32-5405-597a41f1fca7.png)

1. AWSのEC2ダッシュボードで確認したところ、EC2が2台起動されていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/91bbba43-3cce-7025-4d18-d924f3e72318.png)

#### SQLウェアハウスの停止
1. SQLWarehouseを選択した画面で、右上の「停止」ボタンをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7dbd82c1-6479-0a5f-f7ed-c4cc782cc4e0.png" width=200>

1. すぐに停止されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c6f52060-84b4-45c7-d94d-6ce5558c0ed7.png)

1. 対象のEC2も停止されました。**※停止までしばらく(5分ほど)かかりました。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f674325a-a722-5054-3495-0e8833a60f4f.png)

## 最初のテーブルを作成し、アクセス許可を管理する
> Unity Catalog を使用すると、SQL または Databricks エクスプローラー UI を使用して、テーブルへのアクセスを宣言によって定義できます。 これは、ワークスペースが同じメタストアを共有している限り、アカウント内のすべての Databricks ワークスペース、クラスター、および SQLウェアハウスからアクセス規則が適用されることを意味する、"一度定義すればどこでもセキュリティで保護する" アプローチに従うように設計されています。

- Unity Catalogにより、SQL、DatabricksのUIを使用して、テーブルへのアクセスを定義可能
- ワークスペースが同じメタストアを共有することで、ワークスペース、クラスタ、SQL Warehouseからアクセス規制が適用される。

1. ナビゲーションペインで「ワークスペース」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d29d7e1f-9c38-96c8-58c9-3ff6e563e9cb.png" width=200 />

1. 「追加」＞「ノートブック」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/06b5cf4c-97c4-9097-20ad-6ab40afb3b09.png" width=200>

1. ノートブック名を変更します。
1. セルの「SQL」を選択します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e811b70-756f-4532-d313-9cdc9cc58805.png" width=300 />

1. 「接続」をクリックすると、ポップアップされるので、SQL Warehouseで作成したクラスタを選択後、「起動してアタッチ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f933b6f0-7042-93cb-2286-9568ee42b642.png)

1. クラスタ起動後（アタッチ後）、下記のコマンドを実行します。
    ```
    %sql
    GRANT USE SCHEMA, CREATE TABLE ON SCHEMA main.default TO `<user>@<domain>.com`;
    ```

    ※ <user>@<domain>.com を Databricks ユーザー名に置き換えます。ユーザー名はバッククォート ( ` ` ) で囲む必要があります。


1. テーブルを作成します。
    ```
    CREATE TABLE IF NOT EXISTS main.default.department
    (
      deptcode   INT,
      deptname  STRING,
      location  STRING
    );
    ```
1. データを登録します。
    ```
    INSERT INTO main.default.department VALUES
      (10, 'FINANCE', 'EDINBURGH'),
      (20, 'SOFTWARE', 'PADDINGTON');
    ```

1. 上記で、Unity Catalogにテーブルができたので確認してみます。ナビゲーションペインで「データ」を選択します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6b268e1e-fed2-f9f0-a7cc-8741cf4229d7.png" width=200 />

1. 上記で作成した「main」カタログ下に、「default」スキーマ、「department」テーブルが作成されています。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/23314340-b9f1-de4d-3131-fa04f381ac71.png" width=400 >

1. テーブルに対する権限を付与するため、テーブルを選択し、「権限」タブ、「付与」ボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/35982ad8-689c-5ecc-a058-ed6598567ff8.png)

1. ポップアップで付与画面が表示されるので、下記を選択し「付与」をクリックします。
    - プリンシパル：admin
    - 権限：SELECT
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/328c4e33-2d70-4970-ed49-252da0e84c80.png)

1. 別のユーザ（「admin」グループに所属している）でテーブルを確認してみます。

# 考察
今回は、Principalを作成し、クラスタ、テーブル、権限管理を行いました。
次回は、下記を試してみます。
- (オプション)メタストアを追加のワークスペースにリンクする
- (推奨)IdP からアカウントレベルの ID を同期する
- (推奨)メタストアの所有権をグループ に移行する

# 参考
https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html