UnityCatalog環境をTerraformを使って10分で構築してみる


# はじめに

Unity Catalogは素晴らしい機能ですが新たにIAM Roleを作成したり、S3 Bucketを作成したりWorkspaceへのMetastore追加や、Metastoreへの管理グループ設定など初期設定が正直少し面倒です。

Databricksでは[Terraform provider](https://registry.terraform.io/providers/databricks/databricks/latest/docs)を提供しており構築の自動化がサポートされております。もちろん[Unity Catalogもサポート](https://docs.databricks.com/data-governance/unity-catalog/automate.html)されているということで今回利用してみました。

> 今回使用したオリジナルのテンプレートはこちらです。ユーザー作成箇所など少しカスタマイズして利用しております。
> - https://github.com/databricks/unity-catalog-setup


# テンプレートで自動化される内容
今回のterraform templateを使って以下の環境を構築できます。
- [AWS] **S3 Bucket for metastore**
- [AWS] **IAM role and policy for metastore**
- [Databricks **Account Console] Metastore管理グループ作成**
- [Databricks **Account Console] Metastore の登録**
- [Databricks **Account Console] WorkspaceへのMetastore Assign**
- [Workspace] **Storage Credentialの登録**
- [Workspace] **Catalog作成**
- [Workspace] **Schema作成**



# 0.事前準備

以下の環境をあらかじめセットアップしておきます。
- terraform CLI ---download from [terraform](https://www.terraform.io/downloads.html)
- AWS CLI --- [download](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [setup](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)

また今回はすでにDatabricks Workspace環境がある前提を想定しております。
- Databricks Account User (Admin権限あり)
- Workspace (Unity Catalogを利用するWorkspaceを予め準備しておく）

今回は上記環境が揃った状態からスタートということで。。

# 1. テンプレートのダウンロード
今回利用するterraformテンプレートは[こちら](https://github.com/maroon-spec/unity_setup_aws.git)です。

```
git clone https://github.com/maroon-spec/unity_setup_aws.git
```

# 2. 変数パラメーターの設定
今回の環境を構築するにあたり、以下の情報が必要になります。
`unity_catalog.auto.tfvars`を開いて、以下のパラメータを指定して上書きします。

|パラメータ|例|説明|
|:--|--|-----:|
aws_region                  |"ap-northeast-1"|  AWS Region
aws_profile                 |"default"|  AWS CLI profile
create_aws_resources        | true | trueのみ
unity_metastore_bucket      | "databricks-uc-tf-metastore" | metastore用S3bucket名
unity_metastore_iam         | "uc-tf-role"　|  metastore用IAM Role名
databricks_workspace_ids    | ["19710001324","17899832448"]　| WorkspaceIDリスト
unity_admin_group           | "tf_admin_group"　 | metastore Ownerグループ名
databricks_account_id       | "xxx-xxxxx-xxxx-xxx" | 
databricks_workspace_host   | "https://dbc-xxdfdes.cloud.databricks.com" | Workspace name
databricks_account_username | "hoge.hoge@databricks.com" | Admin権限をもつユーザ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/898fdf75-9ef0-3e79-afe3-6790033c9b31.png)

# 3. terraformの実行

あとは、以下の３ステップでterraformを実行するだけです。

### a) terraform init
初回のみですが、対象のディレクトリー上で上記コマンドを実行します。
```
terraform init
```

### b) terraform plan
initが成功したら続いてplanを実行して、デプロイ計画に問題がないかチェックします。
```
terraform plan
```

Databricks Accountのユーザーパスワードがプロンプトで聞かれるので、パスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/04e26131-7dde-478e-d285-216cd24880ff.png)

記述に問題がなければ以下のようにデプロイ計画が表示されますので、中身をチェックしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/945ebc59-965a-e7df-f9ad-23a27f578537.png)


### c) terraform apply
最後にデプロイ計画に問題が無ければapplyします。
```
terraform apply
```

以下のようなメッセージが出た場合は、AWS側のIAM作成タイミングとDatabricks側での設定タイミングが合わずエラーになっているだけなので、再度applyを実行してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5303d41e-02a5-4ab7-91e1-b1f6bdfc8898.png)

最後にApply Complete とメッセージが出れば成功です。

ちなみに環境を元に戻すには`terraform destroy` を実行すると、作成されたオブジェクトをクリーンナップしてくれます。非常に便利ですね。



# 確認してみよう

S3 Bucket名は指定した名前の後ろに６文字のランダム値が付きます。（嫌な人はテンプレートを修正してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f1bbd995-58be-750f-8ffb-ea6ac2ff281f.png)

IAM Roleには、２つのポリシーが付与されます。（上記S3 Bucket用とサンプルデータなどがあるDatabricks-dataset用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b8186ce7-e3d1-6f67-f762-d9f7136f2862.png)



Databrick Account Consoleにてmetastoreを確認（今回はus-west-2に作成しました）
Metastore Adminには作成したグループ(tf_admin_gropu)がオーナーとして登録されます。
こちらのグループメンバーにならないと新規カタログなどは作成できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/ba6b07db-0b14-3645-faea-a71e9415f677.png)

Workspaceにログインすると、新規のカタログやスキーマが作成されているのを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/ffd3604d-de19-eca4-57e4-925930cfedea.png)

ストレージクレデンシャルを確認するとちゃんと登録されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/319ad9c7-d90f-d994-2cae-41a00eadfd92.png)


ということで、事前準備部分は除いてですが。。10分以内で構築することができました。AWS Console行ったり、Databricks Console行ったり、Workspaceにログインしたりせずに済むので楽ですね。


# 参考情報

公式マニュアルや参考にしたファイルはこちらです。
- https://docs.databricks.com/data-governance/unity-catalog/automate.html
- [terraform documents](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/catalog#:~:text=Unity-,Catalog,-Resources)


UnityCatalogセットアップについてはこちらもご覧ください。
https://qiita.com/maroon-db/items/57cee03cef202c839b94