Databricks Terraformプロバイダー

[Databricks Terraform provider \| Databricks on AWS](https://docs.databricks.com/dev-tools/terraform/index.html) [2022/3/21時点]の翻訳です。

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

[HashiCorp Terraform](https://www.terraform.io/)は、複数のクラウドプロバイダーにまたがる安全かつ予測可能なクラウドインフラストラクチャの構築のための人気のあるオープンソースツールです。柔軟かつパワフルなツールを用いてDatabricksワークスペースと関連するクラウドインフラストラクチャを管理するために[Databricks Terraformプロバイダー](https://registry.terraform.io/providers/databrickslabs/databricks/latest)を活用することができます。Databricks Terraformプロバイダーのゴールは、皆様のデータプラットフォームの最も複雑なデプロイ、管理の自動化をサポートする全てのDatabricks REST APIをサポートすると言うことです。Databricksの利用者は、クラスター、ジョブをデプロイ、管理し、Databricksワークスペースを配備し、データアクセスを設定するためにDatabricks Terraformプロバイダーを活用しています。
![](https://docs.databricks.com/_images/resources-aws.png)

:::note info
**実験段階**
Databricks TerraformプロバイダーはDatabricksやAWSに正式にサポートはされていません。これは、Databricksのフィールドエンジニアリングチームによってメンテナンスされ、as-isで提供されています。サービスレベルアグリーメント(SLA)は存在せず、AWSはいかなる保証も行いません。プロバイダーに問題を見つけた場合には、[GitHub Issue](https://github.com/databrickslabs/terraform-provider-databricks/issues/new/choose)を起票することで、時間が許す限りプロジェクトのメンテナーによってレビューされます。
:::

# 使い始める

Terraformが操作する必要があるコマンドラインツールをインストール、設定するために以下のステップを完了してください。これらのツールには[Databricks CLI](https://docs.databricks.com/dev-tools/cli/index.html)、[Terraform CLI](https://www.terraform.io/docs/cli/index.html)、[AWS CLI](https://aws.amazon.com/cli/)が含まれます。これらのツールのセットアップ後に、後ほどお使いのDatabricksワークスペースと関連するAWSクラウドインフラストラクチャを管理するために使うベースのTerraform設定を作成するステップを完了します。

:::note info
**注意**
この手順においては、Databricks管理者としてDatabricksワークスペースにアクセスできること、対応するAWSアカウントにアクセスできること、そのAWSアカウント内でTerraformを実行する適切なアクセス権を持っていることを前提としています。詳細に関しては、以下を参照ください。
- [Manage users and groups](https://docs.databricks.com/administration-guide/users-groups/index.html)
- AWSウェブサイトの[Changing permissions for an IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)
:::

1. Databricksアカウント内でTerraformがDatabricks APIを呼び出せるようにするためにDatabricksのパーソナルアクセストークンを作成します。詳細については、[Authentication using Databricks personal access tokens](https://docs.databricks.com/dev-tools/api/latest/authentication.html)をご覧下さい。
1. Databricksコマンドラインインタフェース(CLI)をインストールし、このパーソナルアクセストークンに対する接続プロファイルを作成するために、`databricks configure --token --profile <profile name>`を実行することでDatabricksパーソナルアクセストークンを用いてDatabricks CLIを設定します。`<profile name>`を接続プロファイルに対する一意の名前で置き換えてください。詳細に関しては、[Databricks CLI](https://docs.databricks.com/dev-tools/cli/index.html)の"Set up authentication"と"Connection profiles"セクションをご覧ください。

    ```bash:Bash
    databricks configure --token --profile <profile name>
    ```

    > **ティップス**
    それぞれのパーソナルアクセストークンはDatabricksアカウント内の固有のユーザーに紐づけられます。Terraformが使用できるようにしたいそれぞれのDatabricksパーソナルアクセストークンに対して、`databricks configure --token --profile <profile name>`コマンド(`<profile name>`をユニークな名称で置き換えます)を実行します。

1. Terraform CLIをインストールします。詳細はTerraformウェブサイトの[Download Terraform](https://www.terraform.io/downloads.html)をご覧ください。
1. AWSシークレットキーとAWSシークレットアクセスキーから構成されるAWSアクセスキーを作成します。詳細はAWSウェブサイトの[Managing access keys \(console\)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey)をご覧下さい。
1. AWS CLIをインストールし、`aws configure --profile <profile name>`コマンドを実行することで、AWSアクセスキーでAWS CLIを設定します。`<profile name>`をこの接続プロファイルに対するユニークな名称で置き換えてください。詳細はAWSウェブサイトの[Installing, updating, and uninstalling the AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)と[Quick configuration with aws configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)をご覧ください。

    ```bash:Bash
    aws configure --profile <profile name>
    ```

    > **ティップス**
    それぞれのAWSアクセスキーはAWSアカウントの特定のIAMユーザーに紐づけられます。Terraformに使わせたいそれぞれのAWSアクセスキーに対して、`aws configure --profile <profile name>`コマンド(`<profile name>`をユニークな名称で置き換えます)を実行します。
    >
    > この手順では、AWS CLIと、認証を行うためにデフォルトの場所にある共有認証情報/設定を使用します。別の認証オプションに関しては、Terraformレジストリウェブサイトの[Authentication](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication)をご覧ください。

1. お使いのターミナルで、空のディレクトリを作成してそこに移動します。(それぞれの別のセットのTerraform設定ファイルには自身のディレクトリが必要となります)例えば、`mkdir terraform_demo && cd terraform_demo`となります。

    ```bash:Bash
    mkdir terraform_demo && cd terraform_demo
    ```

1. 空のディレクトリ内で、`main.tf`という名前のファイルを作成します。このファイルに以下の内容を追加し、ファイルを保存します。

    ```
    variable "aws_connection_profile" {
      description = "The name of the AWS connection profile to use."
      type = string
      default = "<AWS connection profile name>"
    }
    
    variable "aws_region" {
      description = "The code of the AWS Region to use."
      type = string
      default = "<AWS Region code>"
    }
    
    variable "databricks_connection_profile" {
      description = "The name of the Databricks connection profile to use."
      type = string
      default = "<Databricks connection profile name>"
    }
    
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 3.27"
        }
    
        databricks = {
          source = "databrickslabs/databricks"
        }
      }
    }
    
    provider "aws" {
      profile = var.aws_connection_profile
      region = var.aws_region
    }
    
    provider "databricks" {
      profile = var.databricks_connection_profile
    }
    ```

1. `main.tf`ファイルの以下の値を置き換えて保存します。

    - `<AWS connection profile name>`をステップ5で作成したAWS接続プロファイル名に置き換えます。
    - `<AWS Region code>`をTerraformで利用したいAWSリージョン(例えば、`us-west-2`)で置き換えます。
    - `<Databricks connection profile name>`をステップ2で作成したDatabricks接続プロファイル名で置き換えます。

1. `terraform init`コマンドを実行することで、`main.tf`ファイルがある作業ディレクトリを初期化します。詳細はTerraformウェブサイトの[Command: init](https://www.terraform.io/docs/cli/commands/init.html)をご覧ください。

    ```bash:Bash
    terraform init
    ```

    Terraformが`aws`と`databricks`のプロバイダーをダウンロードし、現在の作業ディレクトリの`.terraform`という名前の非表示のサブディレクトリ内にインストールします。`terraform init`コマンドは、どのバージョンのプロバイダーがインストールされたのかを表示します。また、Terraformは使用したプロバイダーバージョンを正確に示す`.terraform.lock.hcl`というロックファイルも作成するので、お使いのプロジェクトで使用されるプロバイダーをいつアップデートするのかをコントロールすることができます。

1. `terraform apply`コマンドを実行して、希望する状態の設定になるまで変更を適用します。詳細はTerraformウェブサイトの[Command: apply](https://www.terraform.io/docs/cli/commands/apply.html)をご覧ください。

    ```bash:Bash
    terraform apply
    ```

    `main.tf`ファイルではまだリソースが指定されていないので、出力は`Apply complete! Resources: 0 added, 0 changed, 0 destroyed`となります。また、Terraformは`terraform.tfstate`というファイルにデータを書き込みます。リソースを作成するには、[サンプル設定](#サンプル設定)、[次のステップ](#次のステップ)のステップに進んでください。あるいは作成したいリソースを指定するために両方を実行し、再度`terraform apply`を実行してください。Terraformは、管理するリソースのIDとプロパティをこの`terraform.tfstate`ファイルに格納するので、あとでこれらのリソースを更新、廃棄することができます。

# サンプル設定

既存のDatabricksワークスペース内にノートブックとこのノートブックを実行するジョブを作成するサンプルTerraform設定を作成するには、以下の手順を完了してください。

:::note info
**注意**
以下のサンプルTerraform設定は、既存のDatabricksワークスペースのみとやりとりを行います。このため、このサンプルを実行する際にはAWS CLIを設定する必要がなく、お使いの`main.tf`ファイルに変数`aws_connection_profile`、`aws_region`や`aws`プロバイダーを含める必要はありません。
:::

1. [使い始める](#使い始める)で作成した`main.tf`ファイルの最後に、以下のコードを追加します。

    ```
    variable "resource_prefix" {
      description = "The prefix to use when naming the notebook and job"
      type = string
      default = "terraform-demo"
    }
    
    variable "email_notifier" {
      description = "The email address to send job status to"
      type = list(string)
      default = ["<Your email address>"]
    }
    
    // Get information about the Databricks user that is calling
    // the Databricks API (the one associated with "databricks_connection_profile").
    data "databricks_current_user" "me" {}
    
    // Create a simple, sample notebook. Store it in a subfolder within
    // the Databricks current user's folder. The notebook contains the
    // following basic Spark code in Python.
    resource "databricks_notebook" "this" {
      path     = "${data.databricks_current_user.me.home}/Terraform/${var.resource_prefix}-notebook.ipynb"
      language = "PYTHON"
      content_base64 = base64encode(<<-EOT
        # created from ${abspath(path.module)}
        display(spark.range(10))
        EOT
      )
    }
    
    // Create a job to run the sample notebook. The job will create
    // a cluster to run on. The cluster will use the smallest available
    // node type and run the latest version of Spark.
    
    // Get the smallest available node type to use for the cluster. Choose
    // only from among available node types with local storage.
    data "databricks_node_type" "smallest" {
      local_disk = true
    }
    
    // Get the latest Spark version to use for the cluster.
    data "databricks_spark_version" "latest" {}
    
    // Create the job, emailing notifiers about job success or failure.
    resource "databricks_job" "this" {
      name = "${var.resource_prefix}-job-${data.databricks_current_user.me.alphanumeric}"
      new_cluster {
        num_workers   = 1
        spark_version = data.databricks_spark_version.latest.id
        node_type_id  = data.databricks_node_type.smallest.id
      }
      notebook_task {
        notebook_path = databricks_notebook.this.path
      }
      email_notifications {
        on_success = var.email_notifier
        on_failure = var.email_notifier
      }
    }
    
    // Print the URL to the notebook.
    output "notebook_url" {
      value = databricks_notebook.this.url
    }
    
    // Print the URL to the job.
    output "job_url" {
      value = databricks_job.this.url
    }
    ```

1. `<Your email address>`をあなたのメールアドレスで置換してファイルを保存します。
1. `terraform apply`を実行します。
1. ノートブックとジョブが作成されたことを確認します。`terraform apply`コマンドの出力で、`notebook_url`と`job_url`のURLが表示されるのでこれらにアクセスします。
1. ジョブを実行します。**Jobs**ページで**Run Now**をクリックします。ジョブが完了したらご自身のメールボックスを確認します。
1. このサンプルを完了したら、`terraform destroy`を実行してDatabricksワークスペースからノートブックとジョブを削除します。
1. ノートブックとジョブが削除されたことを確認します。ノートブックと**Jobs**ページリフレッシュし、リソースが見つからないメッセージが表示されることを確認します。

# 次のステップ

1. [ワークスペースと関連するインフラストラクチャを作成します。](https://qiita.com/taka_yayoi/items/11d4ef49871e9b1292bb)
1. Databricksワークスペースの[ワークスペースリソースを管理](https://qiita.com/taka_yayoi/items/012122880b728a33d781)します。

# トラブルシューティング

Terraform固有のサポートに関しては、HashiCorp Discussサイトの[最新の Terraformトピック](https://discuss.hashicorp.com/c/terraform-core)を参照してください。Databricks Terraformプロバイダー固有の問題に関しては、**databrickslabs/terraform-provider-databricks**のGitHubリポジトリの[Issues](https://github.com/databrickslabs/terraform-provider-databricks/issues)をご覧下さい。

# 追加リソース

- [Tutorial: Create a workspace with the Databricks Terraform provider](https://docs.databricks.com/dev-tools/terraform/tutorial-aws.html)
- Terraformレジストリウェブサイトの[Databricks Provider Documentation](https://registry.terraform.io/providers/databrickslabs/databricks/latest/docs)
- Terraformウェブサイトの[Terraform Documentation](https://www.terraform.io/docs/index.html)

### Databricks 無料トライアル

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