はじめに
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つの準備があります。
ツールのインストール
Azure側でのリソース設定
ワークスペースの作成(事前に箱だけ用意して、後からリソースを追加していく)
それでは手順通りに見ていきます。
ツールのインストール
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
Azureのテナントにログイン
ローカル環境変数を定義しておきます。
export SUBS_NAME=GLB export STORAGE_TF_ACCOUNT=kabetfstate export STORAGE_TF_CONTAINER=tfstate exportRG_TF_NAME=rg-kabe-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プロジェクトで必要とされるプロバイダーを定義します。
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.
サンプル構成
プロバイダー定義が完了したところで、ワークスペースのリソースを定義します。 以下ドキュメントに沿ってサンプル構成を定義しました。
以下ファイルは、ワークスペースにおける現在のユーザー情報を取得するために使用され、その結果は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のリソース設定のデプロイが完了しました。 次の記事では、ワークスペースの管理について記事を書いていますので、こちらもご覧いただければと思います。
おわりに
今回はワークスペースレベルでリソースを作成しましたが、どのレベルでリソースを作成するかで設定が異なります。
気になる方はドキュメントを参照ください。
最後までご覧いただきありがとうございます。
私たちはDatabricksを用いたデータ分析基盤の導入から内製化支援まで幅広く支援をしております。
もしご興味がある方は、お問い合わせ頂ければ幸いです。
そして、一緒に働いていただける仲間も募集中です!
APCにご興味がある方の連絡をお待ちしております。