メインコンテンツまでスキップ

Databricks Terraform プロバイダー

HashiCorp Terraformは、複数のクラウドプロバイダー間において、安全で予測可能なクラウドインフラストラクチャを作成するための、人気のオープンソースツールです。Databricks Terraformプロバイダーを使用すると、柔軟で強力なツールを使用して、Databricksワークスペースと関連するクラウドインフラストラクチャを管理できます。Databricks Terraformプロバイダーの目標は、すべてのデータREST APIsをサポートし、データプラットフォームのデプロイと管理の最も複雑な側面の自動化をサポートすることです。Databricksのお客様は、Databricks Terraformプロバイダーを使用して、クラスターとジョブをデプロイおよび管理し、データアクセスを構成しています。Databricks Terraformプロバイダーを使用してDatabricksワークスペースをプロビジョニングし、AWSプロバイダーを使用してこれらのワークスペースに必要なAWSリソースをプロビジョニングします。

はじめ

このセクションでは、ローカル開発マシンで Terraform と Databricks Terraform プロバイダーを使用するための要件をインストールして構成します。 次に、Terraform認証を構成します。 このセクションに続いて、この記事では、エクスペリメントを使用してDatabricks ノートブック、クラスター、および既存の ワークスペースのクラスターでノートブックを実行するためのジョブをプロビジョニングできるDatabricks サンプル構成 について説明します。

必要条件

  1. Terraform CLIが必要です。 Terraform Web サイトの Terraform のダウンロード を参照してください。

  2. Terraform プロジェクトが必要です。 ターミナルで空のディレクトリを作成し、そのディレクトリに切り替えます。 (Terraform構成ファイルの各個別のセットは、Terraform プロジェクト と呼ばれる独自のディレクトリに配置する必要があります。 たとえば、 mkdir terraform_demo && cd terraform_demoのようになります。

    Bash
    mkdir terraform_demo && cd terraform_demo

    プロジェクトのTerraform構成をTerraformプロジェクトの1つ以上の構成ファイルに含めます。 設定ファイルの構文に関する情報については、 Web サイトのTerraform Language Documentation を参照してください。Terraform

  3. Terraform プロジェクトに、Databricks Terraform プロバイダーの依存関係を追加する必要があります。 Terraform プロジェクトの構成ファイルの 1 つに、次のものを追加します。

    terraform {
    required_providers {
    databricks = {
    source = "databricks/databricks"
    }
    }
    }
  4. Terraformプロジェクトの認証を構成する必要があります。 Databricks Terraform プロバイダーのドキュメントの 「認証 」を参照してください。

設定例

このセクションでは、エクスペリメントを使用して、既存のDatabricksワークスペースでDatabricksノートブック、クラスター、およびクラスターでノートブックを実行するためのジョブをプロビジョニングできる構成の例を示します。ここでは、 要件を既に設定していること、および前のセクションで説明したように Terraform プロジェクトを作成し、Terraform 認証を使用してプロジェクトを構成していることを前提としています。

  1. Terraform プロジェクトに me.tf という名前のファイルを作成し、次のコードを追加します。 このファイルは、現在のユーザー (あなた) に関する情報を取得します。
# Retrieve information about the current user.
data "databricks_current_user" "me" {}
  1. notebook.tfという名前の別のファイルを作成し、次のコードを追加します。このファイルはノートブックを表します。
variable "notebook_subdirectory" {
description = "A name for the subdirectory to store the notebook."
type = string
default = "Terraform"
}

variable "notebook_filename" {
description = "The notebook's filename."
type = string
}

variable "notebook_language" {
description = "The language of the notebook."
type = string
}

resource "databricks_notebook" "this" {
path = "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
language = var.notebook_language
source = "./${var.notebook_filename}"
}

output "notebook_url" {
value = databricks_notebook.this.url
}
  1. notebook.auto.tfvarsという名前の別のファイルを作成し、次のコードを追加します。このファイルは、ノートブックのプロパティを指定します。
notebook_subdirectory = "Terraform"
notebook_filename = "notebook-getting-started.py"
notebook_language = "PYTHON"
  1. notebook-getting-started.pyという名前の別のファイルを作成し、次のコードを追加します。このファイルは、ノートブックの内容を表します。
display(spark.range(10))
  1. cluster.tfという名前の別のファイルを作成し、次のコードを追加します。このファイルはクラスターを表します。
variable "cluster_name" {
description = "A name for the cluster."
type = string
default = "My Cluster"
}

variable "cluster_autotermination_minutes" {
description = "How many minutes before automatically terminating due to inactivity."
type = number
default = 60
}

variable "cluster_num_workers" {
description = "The number of workers."
type = number
default = 1
}

# Create the cluster with the "smallest" amount
# of resources allowed.
data "databricks_node_type" "smallest" {
local_disk = true
}

# Use the latest Databricks Runtime
# Long Term Support (LTS) version.
data "databricks_spark_version" "latest_lts" {
long_term_support = true
}

resource "databricks_cluster" "this" {
cluster_name = var.cluster_name
node_type_id = data.databricks_node_type.smallest.id
spark_version = data.databricks_spark_version.latest_lts.id
autotermination_minutes = var.cluster_autotermination_minutes
num_workers = var.cluster_num_workers
}

output "cluster_url" {
value = databricks_cluster.this.url
}
  1. cluster.auto.tfvarsという名前の別のファイルを作成し、次のコードを追加します。このファイルは、クラスターのプロパティを指定します。
cluster_name                    = "My Cluster"
cluster_autotermination_minutes = 60
cluster_num_workers = 1
  1. job.tfという名前の別のファイルを作成し、次のコードを追加します。このファイルは、クラスターでノートブックを実行するジョブを表します。
variable "job_name" {
description = "A name for the job."
type = string
default = "My Job"
}

variable "task_key" {
description = "A name for the task."
type = string
default = "my_task"
}

resource "databricks_job" "this" {
name = var.job_name
task {
task_key = var.task_key
existing_cluster_id = databricks_cluster.this.cluster_id
notebook_task {
notebook_path = databricks_notebook.this.path
}
}
email_notifications {
on_success = [ data.databricks_current_user.me.user_name ]
on_failure = [ data.databricks_current_user.me.user_name ]
}
}

output "job_url" {
value = databricks_job.this.url
}
  1. job.auto.tfvarsという名前の別のファイルを作成し、次のコードを追加します。このファイルは、ジョブのプロパティを指定します。
job_name = "My Job"
task_key = "my_task"
  1. terraform planを実行します。エラーがある場合は、それらを修正してからコマンドを再実行します。

  2. terraform applyを実行します。

  3. ノートブック、クラスター、ジョブが作成されたことを確認します。 terraform apply コマンドの出力で、 notebook_urlcluster_urljob_urlの URL を探し、その場所に移動します。

  4. ジョブを実行します。:[ ジョブ ]ページで、[ 今すぐ実行 ] をクリックします。ジョブが完了したら、Eメールの受信トレイを確認します。

  5. このサンプルテストを完了したら、 terraform destroyを実行して Databricks ワークスペースからノートブック、クラスター、ジョブを削除します。

注記

terraform plan``terraform apply、 、およびterraform destroy コマンドの詳細については、TerraformCLI ドキュメントの ドキュメンテーションTerraform を参照してください。

  1. ノートブック、クラスター、およびジョブが削除されたことを確認します:ノートブック、クラスター、[ ジョブ ] ページを更新すると、それぞれにリソースが見つからないことを示すメッセージが表示されます。

テスティング

Terraform構成をデプロイする前またはデプロイ後にテストします。 リソースをデプロイする前に、単体テストに類似したテストを実行できます。 また、リソースがデプロイされた後に、統合テストに類似したテストを実行することもできます。 Terraformドキュメントの 「テスト 」を参照してください。

この記事のサンプル構成に対して統合テストに類似したテストを実行するには、次のプロセスに従います。

  1. cluster.tftest.hclという名前のファイルを作成し、次のコードを追加します。このファイルは、デプロイされたクラスターに予期されるクラスター名があるかどうかをテストします。
# Filename: cluster.tftest.hcl

run "cluster_name_test" {
command = apply

assert {
condition = databricks_cluster.this.cluster_name == var.cluster_name
error_message = "Cluster name did not match expected name"
}
}
  1. job.tftest.hclという名前のファイルを作成し、次のコードを追加します。このファイルは、デプロイされたジョブが予期されるジョブ名を持つかどうかをテストします。
run "job_name_test" {
command = apply

assert {
condition = databricks_job.this.name == var.job_name
error_message = "Job name did not match expected name"
}
}
  1. notebook.tftest.hclという名前のファイルを作成し、次のコードを追加します。このファイルは、デプロイされたノートブックに予期されるワークスペース パスがあるかどうかをテストします。
run "notebook_path_test" {
command = apply

assert {
condition = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
error_message = "Notebook path did not match expected path"
}
}
  1. terraform testを実行します。Terraform は、各リソースを Databricks ワークスペースにデプロイし、関連する各テストを実行してそのテスト結果を報告し、デプロイされたリソースを破棄します。

単体テストに類似したテストを、この記事のサンプル構成に対して次のプロセスで実行します。

  • 上記の各テストの行 command = applycommand = planに変更し、 terraform testを実行します。 Terraform は、関連する各テストを実行し、そのテスト結果を報告しますが、リソースはデプロイしません。
  • Databricks Terraform プロバイダーをモックすると、リソースをデプロイしたり、認証資格情報を必要とせずに terraform test を実行したりできます。 Terraformドキュメントの モック を参照してください。 模擬テストを実行するには、テストに行 の mock_provider "databricks" {} を追加し、行 command = apply または command = planを削除する方法の 1 つの方法があります。
# Filename: cluster.tftest.hcl

mock_provider "databricks" {}

run "cluster_mock_name_test" {
assert {
condition = databricks_cluster.this.cluster_name == var.cluster_name
error_message = "Cluster name did not match expected name"
}
}
# Filename: job.tftest.hcl

mock_provider "databricks" {}

run "job_mock_name_test" {
assert {
condition = databricks_job.this.name == var.job_name
error_message = "Job name did not match expected name"
}
}
# Filename: notebook.tftest.hcl

mock_provider "databricks" {}

run "notebook_mock_path_test" {
assert {
condition = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
error_message = "Notebook path did not match expected path"
}
}

次のステップ

追加のリソース