APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【IaC】TerraformでAzure Databricksのワークスペースをデプロイ

はじめに

GLB事業部Lakehouse部の阿部です。

エーピーコミュニケーションズAdvent Calendar 2023の15日目の投稿です。 前編・後編に分けて、TerraformでDatabricksワークスペースをデプロイ・管理する方法について解説します。
前編では、ワークスペースをデプロイする方法について解説します。

Terraformとは

Terraformは「インフラストラクチャー・アズ・コード(IaC)」アプローチを使用し、設定ファイルを通じてインフラストラクチャーを定義します。これにより、バージョン管理、変更の追跡、チーム間の共有が容易になります。また、クラウドプロバイダー(AWS、Azure、Google Cloudなど)をはじめ、多くのテクノロジーと互換性があります。

https://registry.terraform.io/providers/databricks/databricks/latest/docs

前準備

大きく分けて3つの準備があります。

  1. Azureでの設定

  2. ワークスペースの作成(事前に箱だけ用意して、後からリソースを追加していく)

  3. ツールのインストール

それでは手順通りに見ていきます。

Azureのテナントにログイン

ローカル環境変数を定義しておきます。

export SUBS_NAME=GLB
export STORAGE_TF_ACCOUNT=kabetfstate
export STORAGE_TF_CONTAINER=tfstate

Azure CLIでテナントにログインします。

az login --tenant <tenant_id>

使用サブスクリプションを定義します。

az account set --subscription $SUBS_NAME

teffarom tfstate 用のリソースグループ作成

az group create --name $RG_TF_NAME --location japaneast

{ "id": "/xxx/xxx/resourceGroups/rg-kabe-tfstate", "location": "japaneast", "managedBy": null, "name": "rg-kabe-tfstate", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }

teffarom tfstate 用のストレージアカウントの作成

az storage account create --name $STORAGE_TF_ACCOUNT --resource-group $RG_TF_NAME -l japaneast --sku Standard_LRS --enable-hierarchical-namespace true

ワークスペースの作成

本当はローカルからワークスペースの作成をしようと考えていましたが、Azureでのサービスプリンシパルの作成、および認証が上手くいかなかったため 事前にワークスペースを作成しておきます。

また、今回はAzure Databricksのワークスペースレベルでリソースを作成します。 セキュリティのベストプラクティスとしては、以下のように書かれています。

セキュリティのベスト プラクティスとして、自動化ツール、システム、スクリプト、アプリを使用して認証する場合、Databricks では、ワークスペース ユーザーではなくサービス プリンシパルに属する個人用アクセス トークンを使用することを推奨しています。 サービス プリンシパルのトークンを作成するには、「サービス プリンシパルのトークンを管理する」をご覧ください。 https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/terraform/#configure-terraform-authentication

今回は簡易的な検証のため、Microsoft Entra IDアクセストークンを作成せずに進めます。

ツールのインストール

Terraformとazure CLIをインストールします。 以下にローカルでの各バージョン情報を載せておきます。

  • mac OS: Sonoma 14.0
  • Azure CLI 2.54.0
  • terraform v1.6.5
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
brew update && brew install azure-cli

プロバイダーの定義

ローカルでの作業ディレクトリを用意しておき、ワークスペースのリソース設定ファイルを置いていきます。 今回はワークスペースレベルでのみリソースを作成します。

まずはじめに、Terraformプロジェクトで必要とされるプロバイダーを定義します。

variable "databricks_connection_profile" {}

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
    databricks = {
      source = "databricks/databricks"
    }
  }
}

# Use Databricks CLI authentication.
provider "databricks" {
  profile = var.databricks_connection_profile
}

事前作成したワークスペースのインスタンス名を設定します。

databricks_host = "https://<workspace-instance-name>"

terraform init コマンドを実行し、auth.tfファイルを含む作業ディレクトリを初期化します。

terraform init

実行すると、以下のようなメッセージが表示されます。

Initializing the backend...
〜
Initializing provider plugins...
〜
Terraform has been successfully initialized!

terraform planコマンドを実行し、Terraformのプロジェクトが正しく構成されたかどうかを確認します。エラーの場合は、修正してコマンドを再実行します。

terraform plan

以下のようにメッセージが表示されます。

var.databricks_connection_profile
  Enter a value: 

main.tfで定義したdatabricks_connection_profileの値を入力します。今回は値を指定していないため、そのままEnterを押します。

以下のメッセージが表示されます。

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

はじめての設定のため差分変更がないため、No.changesと表示されています。 今後は、変更を適用するterraform applyコマンドを実行する前に差分変更を確認する必要があります。

terraform applyコマンドを実行して変更を適用します。

terraform apply

以下のメッセージが表示され、追加、変更、削除されたリソースはないことがわかります。

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

サンプル構成

プロバイダー定義が完了したところで、ワークスペースのリソースを定義します。 以下ドキュメントに沿ってサンプル構成を定義しました。

https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/terraform/#configure-terraform-authentication

以下ファイルは、ワークスペースにおける現在のユーザー情報を取得するために使用され、その結果はdatabricks_current_user.meという識別子でTerraform内で参照できます。

# Retrieve information about the current user.
data "databricks_current_user" "me" {}

以下はクラスターの設定ファイルです。

# define cluster name
variable "cluster_name" {
  description = "A name for the cluster."
  type        = string
  default     = "My Cluster"
}
# configure autotermination minutes
variable "cluster_autotermination_minutes" {
  description = "How many minutes before automatically terminating due to inactivity."
  type        = number
  default     = 60
}
# configure worker node
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
}

このファイルは、クラスターのプロパティを指定します。

cluster_name                    = "My Cluster"
cluster_autotermination_minutes = 60
cluster_num_workers             = 1

このファイルは、クラスターでノートブックを実行するジョブを表します。

variable "job_name" {
  description = "A name for the job."
  type        = string
  default     = "My Job"
}

resource "databricks_job" "this" {
  name = var.job_name
  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
}
job_name = "My Job"

terraform planコマンドを実行し、現在の状態と設定ファイルとの間で必要な変更を計算します。

terraform plan

-outオプションを使用して計画を保存すると、Terraformはその特定の計画に基づいて後で変更を適用できます。そのため、plan と apply の間で環境が変化する可能性を防ぐことができます。 このオプションを使用しない場合、terraform apply を実行すると、Terraformは最新の状態に基づいて新たな計画を作成し、それに基づいて変更を適用します。これは、最初に計画した内容と異なる結果をもたらす可能性があります。

terraform applyコマンドを実行し、構成が目的の状態になるように必要な変更を適用します。

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

設定ファイルでoutputに指定したurlが表示されます。

Outputs:

cluster_url = "xxx" job_url = "https://xxx" notebook_url = "xxx/Terraform/notebook-getting-started.py"

Azure Databricksのリソース設定のデプロイが完了しました。 次の記事では、ワークスペースの管理について記事を書いていますので、こちらもご覧いただければと思います。

おわりに

今回はワークスペースレベルでリソースを作成しましたが、どのレベルでリソースを作成するかで設定が異なります。

気になる方はドキュメントを参照ください。

learn.microsoft.com

最後までご覧いただきありがとうございます。
私たちはDatabricksを用いたデータ分析基盤の導入から内製化支援まで幅広く支援をしております。
もしご興味がある方は、お問い合わせ頂ければ幸いです。

www.ap-com.co.jp

そして、一緒に働いていただける仲間も募集中です!
APCにご興味がある方の連絡をお待ちしております。

www.ap-com.co.jp