Terraformを通じた既存Databricksワークフローの再利用

[Reuse Existing Workflows Through Terraform \- The Databricks Blog](https://www.databricks.com/blog/2022/12/20/reuse-existing-workflows-through-terraform.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# Terrformシリーズのパート2

**Terraformを通じたワークフローのデプロイに関するブログシリーズのパート2です。ここでは、継承ワークフローをどのようにTerraform IaCに変換するのにフォーカスします。**

以前の記事[Terraformを通じたDatabricksワークフロー](https://qiita.com/taka_yayoi/items/c00a5ce81708cfa5082e)では、マルチタスクジョブ/ワークフローのインフラストラクチャアズコード(IaC)をスクラッチから作成するために、どのようにTerraform Databricksプロバイダーを使うのかを学びました。ワークフローUIは簡単かつモジュール化されており、依存関係のビジュアル表現を提供します。このため、多くのエンジニアやデータサイエンティストにとってワークフローを構築する際に好まれる手段かもしれません。しかし、特定の組織においてはコードを用いて自身のインフラストラクチャを管理することを好み、専用のインフラエンジニアのチームを有している場合があります。このケースにおいても、依然としてUIで作成シアワークフローを継承し、コードとしてメンテナンスすることが可能です。このプラクティスがどのように見えるのかを以下に示しています。
![](https://cms.databricks.com/sites/default/files/inline-images/db-453-blog-img-1.png)
*図1. Terraformを通じたワークフロー管理*

この記事では、既存ワークフローをTerraform IaCに変換することができるツールを議論します。また、このようなIaCをデプロイできる様々な方法を見ていきます。

# Terraformのリソースエクスポーター(実験段階)

Terraform Databricksプロバイダーパッケージの一部として、Databricksでは[Experimental Resource Exporter](https://registry.terraform.io/providers/databricks/databricks/latest/docs/guides/experimental-exporter)として知られるツールを提供しています。提供されるすべてのクラウドに対して、オールインワンのDatabricksリソースIaCジェネレーターに変換する作業は継続中ですが、現状においてもこのツールには、マルチタスクジョブにおけるTerraform HashiCorp Language (HCL)コードを生成する能力を備えています。以下に使用するステップを示します:

1. [Terraform Databricks Provider](https://registry.terraform.io/providers/databricks/databricks/latest/docs)をセットアップします。
1. ソースのDatabricksワークスペースで接続の認証をセットアップします。
1. Exporterユーティリティを実行し、Terraform IaCを生成します。
1. Terraform IaCをリファクタリングし、別のワークスペースに際デプロイします。

## Terraform Databricksプロバイダーのセットアップ

Exporterユーティリティは、[Terraform Databricks provider](https://registry.terraform.io/providers/databricks/databricks/latest/docs)のバイナリーで提供されています。プロバイダーをセットアップすると、ローカルディレクトリにこれらをバイナリーをダウンロードします。このため、フォルダを作成し、内部に`<my_provider>.tf`ファイルを作成します。ファイルに以下のコードを追加します([リリースリポジトリ](https://github.com/databricks/terraform-provider-databricks/releases)から最新プロバイダーバージョンを選択してください)。`terraform init`コマンドを実行します(このためにTerraformをインストールする必要があります)。

```terraform
terraform {
  required_providers {
    databricks = {
      source = "databricks/databricks"
      version = "1.6.1" # provider version
    }
  }
}
```

Terraformは、バイナリーをダウンロードし作業用ディレクトリ内の`.terraform`フォルダーに保存します。Apple M1 Pro Mac (macOS Monterey V 12.5.1)では、ダウンロードは以下のようになります。
![](https://cms.databricks.com/sites/default/files/inline-images/db-453-blog-img-2.png)

我々が興味があるアーティファクトは`<my_provider >.tf`ファイルで指定されるプロバイバーバージョン`1.6.1`を保持している**terraform-provider-databricks_v1.6.1**です。

## 認証のセットアップ

この記事を公開した際、ExporterユーティリティはDatabricksに対する2つの認証モードのみをサポートしています:

1. Databrikcs CLI向けに設定された資格情報ファイル`~/.databrickscfg`に格納される`DEFAULT`プロファイル。これは`databricks configure --token`コマンドで**作成されます**。詳細は[こちらのページ](https://docs.databricks.com/dev-tools/cli/index.html#set-up-authentication)を参照ください。
1. コマンド`export DATABRICKS_HOST=https://my-databricks-workspace.cloud.databricks.com`と`export DATABRICKS_TOKEN=my_databricks_api_token`で設定される環境変数`DATABRICKS_HOST`と`DATABRICKS_TOKEN`。Databricks APIトークンの生成方法については、こちらの[ドキュメント](https://docs.databricks.com/dev-tools/api/latest/authentication.html)をご覧ください。

## エクスポーターの実行

このようなコマンドは、過去120日間アクティブな*my-favorite-job*という名前にマッチするジョブのTerraform HCLコードを取得するために実行することができます。

```shell
.terraform/providers/registry.terraform.io/databricks/databricks/1.6.1/darwin_arm64/terraform-provider-databricks_v1.6.1 exporter -skip-interactive -match=my-favorite-job -listing=jobs -last-active-days=120 -debug -skip-interactive
```

すべてのジョブを取得するには、以下のコマンドを実行します。

```shell
.terraform/providers/registry.terraform.io/databricks/databricks/1.6.1/darwin_arm64/terraform-provider-databricks_v1.6.1 exporter -skip-interactive -services=jobs -debug
```

このユーティリティを実行するための[インタラクティブモード](https://asciinema.org/a/Rv8ZFJQpfrfp6ggWddjtyXaOy)もあります。引数としてTerraformファイルを生成するディレクトリを指定することができます。バージョン1.6.1時点では、このユーティリティに検知されるためには最低一回ジョブを実行しなくてはなりません。このエクスポーターの使い方に関する詳細なドキュメントには、[Terraform registry](https://registry.terraform.io/providers/databricks/databricks/latest/docs/guides/experimental-exporter)でアクセスすることができます。

## Terraform IaCのリファクタリングと再デプロイ

エクスポーターユーティリティによって生成されるIaCファイルは、以前の記事[Terraformを通じたDatabricksワークフロー](https://qiita.com/taka_yayoi/items/c00a5ce81708cfa5082e)で作成されたものと非常に似たものとなります。これらのファイルをgitプロバイダーを通じてバージョン管理することも可能です。インフラエンジニアは、このコードをベースとして用い、モジュール化することができます。ハードコードされたオブジェクトは[変数](https://developer.hashicorp.com/terraform/language/values/variables)(*.tfvars*, *vars.tf*, *var.*, *TF_VAR_環境変数*)に変換され、`terraform apply`で引数として指定される場合があります。例えば、同じジョブを2つのワークスペースにデプロイしたいが、背後のタスクのために異なるクラスター設定を指定したいとします。ジョブやタスクが失敗した際、別の人に通知をしたいと考えたとします。このシナリオを実装できるようにするために、ワークスペース、環境、ビジネスドメインごとに異なるリソース設定を持つ複数の変数ファイルを保持することができます。

注意すべき別のポイントは、上述のステップを通じてワークフロー向けに生成されたIaCは、バキュームで実行することができないということです。以前の記事で述べたように、すべてのワークフローはアイデンティティ、クラスターポリシー、インスタンスプール、git資格情報など多数の依存関係を持っています。これらのリソースに対するIaCも、すべてのジグソーパズルのピースが一貫性のある方法で適切に当てはまるように同じ方法で生成される必要があります。

練習として、変数によるメール通知シナリオをを実装してみましょう。ワークフローがスタート、成功、失敗した際、環境のタイプ(*dev*, *test*, *prod*)に応じて決定される別のメールアドレスに通知を送りたいと考えています。作業用IaCディレクトリに2つの変数*environment*と*email_notification_groups*を宣言するTerraformファイル(*my-variables.tf*)を追加することからスタートします。

```terraform
variable "environment" {
   default = "dev"
}

variable "email_notification_groups" {
   default = {
       "dev" = {
                               "on_start" = ["group1@xyz.com"]
                               "on_success" = ["group2@xyz.com"]
                               "on_failure" = ["group3@xyz.com"]
                           }
       "test" = {
                               "on_start" = ["group2@xyz.com"]
                               "on_success" = ["group2@xyz.com"]
                               "on_failure" = ["group2@xyz.com"]
                           }
       "prod" = {
                               "on_start" = ["group4@xyz.com"]
                               "on_success" = ["group4@xyz.com"]
                               "on_failure" = ["group4@xyz.com"]
                           }
   }

   description = "Environment decides who gets notified"  
}
```

マルチタスクジョブのTerraform IaCからは、メール通知ブロックからすべてのハードコード部分を削除し、動的(*var.email_notification_groups*と*var.environment*は宣言した変数の値にアクセスするために使用されます)なものにします。

```terraform
email_notifications {
   on_failure = var.email_notification_groups[var.environment]["on_failure"]
   on_start = var.email_notification_groups[var.environment]["on_start"]
   on_success = var.email_notification_groups[var.environment]["on_success"]
```

そして、最後にコマンドラインから動的に環境を注入します。

```shell
terraform apply -var="environment=test"
```

ワークフローのメール通知セクションは以下のようになります。
![](https://cms.databricks.com/sites/default/files/inline-images/db-453-blog-img-3.png)
*図2. 変数を通じて動的に設定されたメール通知*

以下の図では、デプロイメントにおいて異なる設定が実行時にどのように組み合わせ、様々なバリエーションのワークフローを作成するのかを要約しています。
![](https://cms.databricks.com/sites/default/files/inline-images/db-453-blog-img-4.png)
*図3. Terraform IaCのモジュール化*

Illimity BankがDatabricksリソースのTerraform IaCを生成するために、どのようにExporterユーティリティを活用し、彼らの二番目の環境に再デプロイしたのかを学ぶために、[Ilimity Bank Disaster Recovery](https://www.databricks.com/blog/2022/05/09/how-illimity-bank-built-a-disaster-recovery-strategy-on-the-lakehouse.html)を参照することができます。

# まとめ

データエンジニア、データサイエンティスト、インフラエンジニアのコラボレーションによって、企業はTerraformインフラストラクチャアズコードを通じて、同時に複数のワークスペースにデプロイできるモジュール化され、スケーラブルなワークフローを構築することができます。すべてのDatabrikcsワークフローのIaCをスクラッチから記述するのはうんざりとするタスクです。Exporterユーティリティは、ベースラインのTerraformコードを生成し、必要に応じて拡張する際に便利なものとなります。

# 使い始める

[Learn Terraform](https://developer.hashicorp.com/terraform/tutorials)
[Databricks Terraformプロバイダー](https://qiita.com/taka_yayoi/items/691ee4909b0961de5ad1)
[Terraformを通じたDatabricksワークフロー](https://qiita.com/taka_yayoi/items/c00a5ce81708cfa5082e)

### Databricks 無料トライアル

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