AWSでDatabricks Unity Catalogをセットアップする

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

お恥ずかしながら、これまで自分で[Unity Catalog](https://qiita.com/taka_yayoi/items/15aede468bdca58ec6a3)をセットアップしたことがなかったのでした。

こちらを見ながら実際にセットアップします。

https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786

自動化ツールを使うこともできますが、ここではマニュアルでセットアップしてみます。Terraformの手順も後でまとめたいところです。

https://qiita.com/maroon-db/items/70d8eb95aa9c3b978fca

# 前提条件

- Databricksワークスペースがセットアップされていることを前提としています。セットアップされていない場合には、[Databricksアカウントのセットアップとワークスペースの作成\(実践編\)](https://qiita.com/taka_yayoi/items/98edd2e9d06f5c1029a1)を参考にセットアップしてください。
- DatabricksアカウントのアカウントIDが必要となります。[アカウントコンソール](https://accounts.cloud.databricks.com/)にログイン後、サイドメニュー下部にあるユーザーアイコンをクリックするとアカウントIDが表示されるので、これをコピーしておきます。
![Screen Shot 2022-12-16 at 13.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cb5fd3e8-7bc0-f329-0f21-9ad9c37ef64d.png)

:::note warn
**警告**
DatabricksアカウントIDやアカウントオーナーのメールアドレスは厳重に管理してください。第三者に公開しないでください。
:::

# AWSの設定

Unity Catalogを使い始めるには、AWSで以下の設定を行う必要があります。

- **IAMロール**: Databricksコントロールプレーンからのアクセスを許可するために必要となるIAMロールです。
- **S3バケット**: Unity Catalogのルートストレージロケーションとなります。Unity Catalogのマネージドテーブルが格納されます。
- **IAMポリシー**: 上記IAMロールがS3バケットにアクセスできるようにポリシーを定義します。

## IAMロールの作成

1. Databricksのデプロイに使用したアカウントを用いて、AWSマネジメントコンソールにログインします。
1. **IAM**に移動して**ロール**にアクセスし、**ロールを作成**をクリックします。
1. **信頼されたエンティティタイプ**は**AWSのサービス**、**ユースケース**は**EC2**を選択します。
![Screen Shot 2022-12-19 at 13.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cea36c83-c0c0-72a4-31ec-2e6c30712cb6.png)
1. 許可の追加では**次へ**をクリックします。
1. ロール名を入力して**ロールを作成**をクリックします。
1. ロール一覧に戻るので、作成したロールを検索してアクセスします。
1. **信頼関係**タブをクリックして **信頼ポリシーを編集**をクリックします。
1. 以下の内容を信頼ポリシーに貼り付けます。

    ```json:JSON
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
             "AWS": [
               "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
               "arn:aws:iam::<AWSアカウントID>:role/<作成したIAMロール>"
             ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<DatabricksアカウントID>"
            }
          }
        }
      ]
    }
    ```

    以下はご自身の環境の値で置き換えてください。

    - `<DatabricksアカウントID>`: [アカウントコンソールでコピー](#前提条件)したDatabricksアカウントID
    - `<AWSアカウントID>`: ご自身のAWSアカウントID
    - `<作成したIAMロール>`: [上のステップ](#iamロールの作成)で作成したIAMロール

1. **ポリシーを更新**をクリックします。
1. `ARN`をコピーしておきます。

## S3バケットの作成

1. **S3**に移動して、**バケットの作成**をクリックします。
1. バケット名を指定して**バケットの作成**をクリックします。バケット名にピリオドは含めないでください。
1. `バケット名`をコピーしておきます。

## IAMポリシーの作成

1. 再び**IAM**に移動し、**ポリシー**にアクセスします。
1. **ポリシーを作成**をクリックします。
1. **JSON**タブを開き、以下の内容を貼り付けます。

    ```json:JSON
    {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Action": [
                 "s3:GetObject",
                 "s3:PutObject",
                 "s3:DeleteObject",
                 "s3:ListBucket",
                 "s3:GetBucketLocation",
                 "s3:GetLifecycleConfiguration",
                 "s3:PutLifecycleConfiguration"
             ],
             "Resource": [
                 "arn:aws:s3:::<作成したS3バケット>/*",
                 "arn:aws:s3:::<作成したS3バケット>"
             ],
             "Effect": "Allow"
         },
         {
             "Action": [
                 "sts:AssumeRole"
             ],
             "Resource": [
                 "arn:aws:iam::<AWSアカウントID>:role/<作成したIAMロール>"
             ],
             "Effect": "Allow"
         }
       ]
    }
    ```

    以下はご自身の環境の値で置き換えてください。

    - `<作成したS3バケット>`: [上のステップ](#s3バケットの作成)で作成したS3バケット
    - `<AWSアカウントID>`: ご自身のAWSアカウントID
    - `<作成したIAMロール>`: [上のステップ](#iamロールの作成)で作成したIAMロール

1. **次のステップ: タグ**をクリックします。
1. **次のステップ: 確認**をクリックします。
1. **名前**にポリシー名を入力し**ポリシーの作成**をクリックします。
1. ポリシー一覧に移動するので、作成したポリシーにアクセスします。
1. **ポリシーの使用状況**タブを開き、**アタッチ**をクリックします。
1. [上のステップ](#iamロールの作成)で作成したIAMロールを検索し、チェックボックスを付けて**ポリシーのアタッチ**をクリックします。これでIAMロールにポリシーがアタッチされます。
![Screen Shot 2022-12-19 at 14.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bd0b727c-e7f8-fd22-72f6-310c7206982d.png)

# Databricksの設定

これで、AWSの準備が整ったので以下の情報を用いて、Unity Catalogをセットアップします。

- IAMロールの`ARN`
- S3バケット名

## メタストアの作成

1. [アカウントコンソール](https://accounts.cloud.databricks.com/)にログインし、サイドメニューのデータをクリックします。なお、アカウントコンソールも[日本語対応](https://qiita.com/taka_yayoi/items/7999027b1af36e422ad5)しています。
![Screen Shot 2022-12-19 at 13.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/737fa570-a158-4383-0612-e75f43019522.png)
1. メタストア一覧が表示されますので、**メタストアを作成する**をクリックします。
![Screen Shot 2022-12-19 at 14.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a3cfdef5-d5b0-26fb-2976-5129218c53f0.png)
1. メタストアの名前を**名前**、**リージョン**(ワークスペースが存在するリージョンを選択してください。メタストアはリージョンごとに1つ作成できます)、**S3バケットパス**に[上のステップ](#s3バケットの作成)で作成したS3バケット、**IAMロールARN**に[上のステップ](#iamロールの作成)で作成したIAMロールのARNを入力します。
![Screen Shot 2022-12-19 at 15.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3c5b76d0-673d-98bd-6795-1f2a3168039c.png)
1. **作成**をクリックします。

## ワークスペースへのアタッチ

DatabricksワークスペースでUnity Catalogを利用するには、ワークスペースにメタストアをアタッチする必要があります。

1. 対象のワークスペースにチェックをつけて**割り当てる**をクリックします。
![Screen Shot 2022-12-19 at 15.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ee61cc45-c86c-587c-5033-292809e92545.png)
1. 確認メッセージが表示されるので**有効化**をクリックします。
![Screen Shot 2022-12-19 at 13.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5d3114cd-a4ab-b5dc-34c7-c4126f15b758.png)
1. 完了メッセージが表示されるので**閉じる**をクリックします。
![Screen Shot 2022-12-19 at 13.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/508c3973-c4b1-305f-6332-7f97dc600a5f.png)

これでUnity Catalogがセットアップされました。

# 動作確認

1. メタストアにアタッチしたワークスペースにログインします。
1. サイドメニューから**データ**にアクセスするとデータエクスプローラが表示されます。
1. これまでHiveメタストアで管理されていたデータベースは`hive_metastore`配下に格納されています。
1. その他、デフォルトのカタログ`main`が作成されています。
![Screen Shot 2022-12-19 at 15.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4103305-0770-a88d-aeae-ec39f0e5d71c.png)

# メタストア管理権限をグループに移譲

初期状態ではメタストアを作成したユーザーがメタストア管理者となります。運営上、個人のユーザーを管理者にするよりは、管理者用グループを作成してグループにメタストア管理権限を割り当てる方が望ましいです。

https://docs.databricks.com/data-governance/unity-catalog/manage-privileges/index.html#metastore-admin

上のマニュアルに沿ってグループにメタストア管理権限を割り当てます。

1. アカウントコンソールで**ユーザー管理**にアクセスし、**グループを追加**をクリックします。
![Screen Shot 2022-12-19 at 15.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27ea1153-d0d3-e6c6-9863-f4c8be2ec21d.png)
1. `metastore admins`といったグループ名をつけます。
![Screen Shot 2022-12-19 at 15.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/36a6e86a-4295-ab48-0661-ba85d736e9d3.png)
1. グループのメンバーを追加します。
![Screen Shot 2022-12-19 at 15.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2d8fba55-c225-3623-50c0-7c2bf21f1e82.png)
![Screen Shot 2022-12-19 at 15.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6552b055-f039-e885-94af-85f1513fe20f.png)
1. アカウントコンソールの**データ**に移動して、メタストア管理者の右に表示されている**編集**をクリックします。
![Screen Shot 2022-12-19 at 15.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/32038a4d-374e-32fa-9aca-d85c89067805.png)
1. 上で作成したグループを選択します。
![Screen Shot 2022-12-19 at 15.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/44aebd60-8bb7-693b-0592-e94985078bc5.png)
1. これでメタストア管理権限がグループに割り当てられました。このグループにユーザーを追加することで、メタストア管理権限を付与することができるようになりました。
![Screen Shot 2022-12-19 at 15.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e8d0bcb-c743-3f9d-0a49-a015c9e1827f.png)

# 次のステップ

チュートリアルを試してみてください。

https://qiita.com/taka_yayoi/items/cf55144e83f4f81dc547

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)