Terraformを用いたカタログのWorkspace Bindings設定をWeb Terminalを使ってDatabricks上で完結させる

## 概要
本記事では、Terraformを使ってカタログを作成し、そのカタログとワークスペースをバインディングする手順を紹介します。
Terraformを利用することで、以下のことが可能となります。
- `databricks_catalog`リソースを利用してカタログを作成し、デフォルトで作成されるスキーマを無効化した状態でデプロイできます
- `isolation_mode = 'ISOLATED'`を指定することで、作成したカタログを、作成を行ったワークスペースにのみ関連付け、他のワークスペースに対して権限を付与しないようにできます

また、DatabricksのWeb Terminal機能を利用することで、Databricks環境内でデプロイ作業を完結させる方法も紹介します。

## 背景
Databricks UIからカタログを作成した場合、デフォルトでは、作成されたカタログが属するメタストアに紐づくすべてのワークスペースがそのカタログの情報にアクセス可能となります。これにより、意図しないデータ公開が発生する可能性があります。そのため、カタログを特定のワークスペースにのみ関連付け、アクセス権限を制限する方法を検討しました。

## 前提
- 作業はDatabricksのWeb Terminalを使用して行う
- メタストア管理者権限を持っていること

:::note
Web Terminalを使用することで、Databricks内で直接Terraformを実行できるため、デプロイ作業をDatabricks環境内で完結させることができます。
:::

## 手順
### 1. DatabricksのWeb Terminalを起動する
#### Web Terminalの起動方法：
1. DatabricksのUI上で、メタストア管理者権限を持つユーザーが所有する「All purpose」クラスタを起動します
2. 「Apps」タブからWeb Terminalを起動します

### 2. Terraformのインストール
Terraformの[公式サイト](https://developer.hashicorp.com/terraform/install)を参考に、以下のコマンドでインストールします。

```bash
wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
```
:::note info
Web Terminalはセッションがリフレッシュされると、インストールされたライブラリがリセットされるため、毎回インストールコマンドを実行する必要があります。毎回の実行を避けるためには、起動時に自動でTerraformをインストールする処理の導入を検討することをお勧めします。
:::

### 3. 作業フォルダに移動する
以下のコマンドで、作業用のDatabricksフォルダに移動します。
```bash
cd /Workspace/<your_work_folder_path>
```
:::note
ここで記載している「Workspace」はnotebookを保存している場所のことです。（Databricks UIの左パネルに表示されている`Workspace`のこと。）
:::

### 4. `providers.tf`ファイルを作成
作業フォルダ内に`providers.tf`という名前でTerraformのプロバイダー設定ファイルを作成し、以下を記述します。

```terraform
terraform {
  required_providers {
    databricks = {
      source = "databricks/databricks"
      version = "1.59.0"
    }
  }
}
provider "databricks" {
  host = "<Databricks_hostname>"
  # tokenは直接記載しません
}
```
:::note
最新のTerraformプロバイダーのバージョンは[こちら](https://registry.terraform.io/providers/databricks/databricks/latest)から確認できます。
:::

### 5. `main.tf`ファイルを作成
作業フォルダ内に`main.tf`というファイルを作成し、以下の内容を記述します。
`databricks_catalog`リソースを使ってカタログを作成します。

```terraform
resource "databricks_catalog" "<catalog_name>" {
  name    = "<catalog_name>"
  comment = "<comment>"
  properties = {
    owner = "<owner_name>"
  }
  storage_root = "<managed_location_path>"
  isolation_mode = "ISOLATED"
}

output "catalog_name" {
  value = databricks_catalog.<catalog_name>.name
}
```
- storage_root：`managed_location_path`には、カタログデータを保存するロケーションのパスを指定します
- isolation_mode：`ISOLATED`を指定することで、カタログを実行したワークスペースにのみ関連付け、他のワークスペースに権限を付与しないようにできます

### 6. DatabricksでPAT (Personal Access Token）を発行
DatabricksのUI上で、[PAT発行手順](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/auth/pat#azure-databricks-personal-access-tokens-for-workspace-users)に従って、Personal Access Token（PAT）を発行します。

### 7. 環境変数にPATを設定
Web Terminal上で、以下のコマンドを実行し、環境変数`DATABRICKS_TOKEN`に先ほど取得したPATを設定します。

```bash
export DATABRICKS_TOKEN=<PAT>
```
:::note
Databricksには環境変数が用意されており、直接値を設定することができます。
[参考リンク](https://registry.terraform.io/providers/databricks/databricks/latest/docs#authenticating-with-hostname-and-token)
:::

### 8.Terraformの初期化
次に、Terraformの初期化を実行します。
```
terraform init
```
### 9.Terraformプランの作成
作成したカタログのリソースを確認するために、以下のコマンドでTerraformプランを作成します。
```
terraform plan
```
### 10. Terraformの適用
プランが問題なければ、以下のコマンドでTerraformを適用し、カタログを作成します。

```
terraform apply
```
適用後、`isolation_mode = "ISOLATED"`を指定したため、カタログは実行したワークスペースにのみ関連付けられます。

### 11. 他のワークスペースへのカタログ紐付け
作成したカタログを他のワークスペースに紐付ける場合は、`databricks_workspace_binding`リソースを利用します。詳細は、[公式ドキュメント](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/workspace_binding
)を参照してください。

## まとめ
本記事では、Terraformを使用してDatabricksでカタログを作成し、そのカタログを特定のワークスペースにのみ関連付ける方法について紹介しました。
ポイントは以下の通りです。
- `databricks_catalog`リソースを使用することで、Databricks上でカタログを作成できます
- `isolation_mode = 'ISOLATED'`を指定することで、カタログを作成したワークスペースにのみ関連付け、他のワークスペースからアクセスできないように制限できます
- DatabricksのWeb Terminalを使用すれば、Terraformのインストールからデプロイ作業までDatabricks環境内で完結することができます
- カタログのデプロイ後、必要に応じて`databricks_workspace_binding`リソースを使用して他のワークスペースとの紐付けを行うことが可能です

こちらの手法を利用することで、意図しないデータ公開を防ぎつつ、カタログ作成を行うことができます。