Terraform Cloudでスムーズに行うDatabricksのデプロイ


HashicorpさんのYouTube Channelで、コラボした動画を公開して頂きました。
その中で紹介したデモ環境の構築ガイドとしてこちらで紹介したいと思います。

まずは、こちらのデモ動画をご覧ください。（デモは 7:30くらいから）
<iframe width="560" height="315" src="https://www.youtube.com/embed/qKmvhrRdciI" title="[Japanese] Terraform Cloudと Databricks で実現するデータ分析基盤の自動化と標準化" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


## デモ環境 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a31fe320-6814-d127-6652-cd480eedca63.png)

## ソースコード

今回は、[こちら](https://github.com/databricks/terraform-databricks-examples/tree/main/examples/aws-workspace-basic)のDatabricks Exampleの**aws-workspace-basic** を利用しました。


以下のモジュールも利用するので一緒にダウンロードしておきます。
- [aws-workspace-basic](https://github.com/databricks/terraform-databricks-examples/tree/main/modules/aws-workspace-basic)
- [aws-databricks-workspace](https://github.com/databricks/terraform-databricks-examples/tree/main/modules/aws-databricks-workspace)

### 修正箇所
**aws-workspace-basic** Moduleの main.tf の prefix指定の箇所がうまく機能しなかったので、以下のように修正しました。

```tf
locals {
  #prefix = var.prefix != "" ? var.prefix : "demo${random_string.naming.result}"
  prefix = "tfdemo${random_string.naming.result}"
}
```

あとは、ローカルのModuleを参照するように修正

```tf
module "aws-workspace-basic" {
  #source                = "github.com/databricks/terraform-databricks-examples/modules/aws-workspace-basic"
  source = "./modules/aws-workspace-basic"
  databricks_account_id = var.databricks_account_id
}
```

## VSCode上での設定

今回は、こちらはメインではないので割愛させていただきますが、以下のように設定しております。

- git repositoryの作成　（自分のprivate repository) 
- branch(dev) の作成
- 上記ソースコードを修正後、Commit & Push

これでGitHub上にコードをデプロイできました。あとはPull Requestして、Mergeしていくだけです。一旦、Terraform Cloudのセットアップのため、ここで止めておきます。

## Terraform Cloudの設定

Terraform Cloudは、今回はFree Planを利用しました。有償版はコラボレーション機能やAudit機能などの利用ができるようになるようです。詳細は[こちらのPricing Page](https://www.hashicorp.com/products/terraform/pricing?product_intent=terraform)をご覧ください。

まずは[こちらからアカウントを作成](https://app.terraform.io/signup/account)してログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/93db32a4-8d1c-f4e3-7ffd-0ab7232ee70f.png)

次にOrganizationを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/51be2c99-4d69-1b00-1d5e-4cf63f74ce37.png)

Oraganization内に、Project&Workspaceを作成します。（今回はいきなりWorkspaceを作成しました。その場合**defaultプロジェクト**内に作成されます）

今回は、**Version Control Workspace**を選択しました。この場合登録したリポジトリのバージョンにアップデートがあると自動的にRunで実行されるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/d7fde3b6-a443-6830-def9-a23f6530210b.png)

ここで、先ほどのGitHubのRepositoryを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/eac77f40-3965-7692-4fce-3c2919ea4247.png)

これで、UI上からRunの実行や、Planの確認などができるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/0c44def9-1428-32e0-4b40-577be81eb09a.png" width="300"/>

### Variablesへの認証情報などの環境変数設定

今回AWSとDatabricks Account Consoleへの認証が必要になります。Variablesにこれらを事前に登録しておく必要があります。

:::note info 
Databricks Account Consoleへの認証にはOAuth M2M認証を利用しました。この場合Service Principalの作成が必要です。OAuth認証以外にもBasic認証やToken認証などをサポートしております。[詳細はこちら](https://docs.databricks.com/ja/dev-tools/auth/index.html#supported-authentication-types-by-databricks-tool-or-sdk)
:::

OAuth　M2M認証利用時のTerraform Variablesに登録するEnvironment変数は[こちら](https://docs.databricks.com/ja/dev-tools/auth/oauth-m2m.html#language-Environment)です。

1. DATABRICKS_HOST
1. DATABRICKS_ACCOUNT_ID
1. DATABRICKS_CLIENT_ID (Service Principal)
1. DATABRICKS_CLIENT_SECRET (Service Principal)

3,4に関しては、**Service Principal**を作成して、そちらのClient IDとClient Secretを登録する必要があります。Service Principalは、Account Consoleから作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/040e039a-8a6b-922b-1681-9c99c24297d3.png)

上記以外にも、AWSでインフラのデプロイ権限をもつロールを作成して、以下を登録します。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/864ba47e-278e-1c22-7dc0-2f07972e7deb.png)

- DATABRICKS_HOSTは、Defaultで、https://accounts.cloud.databricks.com に設定されるため今回割愛しました。
- DATABRICKS_ACCOUNT_IDは、module内でも呼ばれるため、envだけではなくterraform変数としても登録が必要です。

以上で、Terraform Cloudの設定は終了です。

## Pull Requestをして、Planの確認

git側で、pull requestを行うと、terraform cloud上で、Planが実行され、実行前の内容を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/bcd5e0b3-8c7e-7331-75b8-09d7d5260f4f.png)

この時は、applyまでは実行されません。planを確認して問題なければ、mergeをしましょう。

## Plan & apply 

main branchにmergeされると、自動的にterraform cloud側でplan&applyが実行されます。
(applyは、plan内容を確認して、OKすると適用されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/3926084f-0bf9-b137-d846-61b331e520c9.png)

## Delete処理はどうするの？

実行内容を削除したい場合は、"Settings" - "Destruction and Deletion" - "Manually destroy" で実行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5a329031-cc5a-6ca4-f2d1-43a671ec6d26.png)

## 最後に

今回、動画作成のため初めてTerraform Cloudを利用してみましたが、非常に簡単に設定できてもっと早く使っていたら良かったなと感じました。

特に今まで、VSCode上のterminalでplan&applyしてましたが、過去に実行した履歴の確認が面倒だったり、複数のterraformを作成した際に、管理が面倒だったりしましたが、これならそういう煩わしさなどから解放されそうです。またgitとの連携も簡単で、本番利用でのCI/CDを考えた場合は、このような仕組みが必要だなと感じました。

Databricksでは、[Terraform Provider](https://registry.terraform.io/providers/databricks/databricks/latest/docs)として様々なモジュールやリソースを提供しております。是非運用に利用してみてください。