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

Terraform CDK Databricks プロバイダー

注記

この記事では、サードパーティによって開発された Cloud Development Kit for Terraform (CDKTF) について説明します。 プロバイダに問い合わせるには、 Terraform コミュニティを参照してください。

この記事では、Python を Terraform CDK Databricks プロバイダーCloud Development Kit for Terraform (CDKTF) と共に使用する方法について説明します。 CDKTF は、使い慣れたプログラミング言語、ツール、エンジニアリング手法を使用して Databricks リソースを作成、デプロイ、管理できるサードパーティの Infrastructure as Code (IaC) プラットフォームです。 この記事では Python の使用方法を示しますが、CDKTF では TypeScript、Java、C#、Go などの追加の言語がサポートされています。

Terraform CDK Databricks プロバイダーは、 Databricks Terraform プロバイダーに基づいています。 詳細については、「 Terraform Cloud」を参照してください。 CDKTF は、 AWS Cloud Development Kit (AWS CDK) に基づいています。

必要条件

この記事では既存のワークスペースにリソースをデプロイするため、Databricks ワークスペースが必要です。

ローカルの開発マシンには、次のものがインストールされている必要があります。

  • Terraform バージョン 1.1 以降。 Terraform がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、ターミナルまたは PowerShell からコマンド terraform -v を実行します。 Terraformをまだインストールしていない場合は、インストールします。

    Bash
    terraform -v
  • Node.js、バージョン 16.13 以降、 および npm。 Node.js と npm がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、コマンド node -vnpm -vを実行します。 Node.js の最新バージョンには、すでに npm. Node.js と npm がまだインストールされていない場合は、Node Version Manager (nvm) を使用して Node.js と npm をインストールします

    Bash
    node -v
    npm -v
  • CDKTF CLI.CDKTF CLI がインストールされているかどうか、およびインストールされているバージョンを確認するには、コマンド cdktf --versionを実行します。 CDKTF CLI をまだインストールしていない場合は、npm を使用してインストールします。

    Bash
    cdktf --version
ヒント

Homebrewを使用してmacOSにCDKTF CLIをインストールすることもできます。 CDKTF のインストールを参照してください。

  • Python バージョン3.7以降および pipenv バージョン2021.5.29以降。 Python と pipenv がインストールされているかどうか、およびインストールされているバージョンを確認するには、コマンド python --versionpipenv --versionを実行します。 Python をインストールしpipenv がまだインストールされていない場合はインストールします。

    Bash
    python --version
    pipenv --version
  • 使用するサポートされている認証の種類に対して構成された Databricks 認証。 Databricks Terraform プロバイダーのドキュメントの 「認証 」を参照してください。

ステップ1: CDKTFプロジェクトを作成します

この手順では、ローカル開発マシンで CDKTF プロジェクトに必要なディレクトリ構造を設定します。 次に、このディレクトリ構造内に CDKTF プロジェクトを作成します。

  1. CDKTF プロジェクト用の空のディレクトリを作成し、そのディレクトリに切り替えます。 ターミナルまたは PowerShell で次のコマンドを実行します。
Bash
mkdir cdktf-demo
cd cdktf-demo
  1. 次のコマンドを実行して、CDKTF プロジェクトを作成します。

    Bash
    cdktf init --template=python --local
  2. プロジェクト名 の入力を求められたら、 Enter キーを押してデフォルトのプロジェクト名である cdktf-demo を受け入れます。

  3. プロジェクトの説明 の入力を求められたら、 Enter キーを押してデフォルトのプロジェクトの説明を受け入れます。

  4. 「既存のTerraformプロジェクトから開始しますか」 と表示された場合は、「N」と入力して Enter キーを押します。

  5. CDKTF チームにクラッシュレポートを送信しますか」 というメッセージが表示されたら、「」と入力して「 n 」と入力し、 Enter キーを押します。

CDKTF は、 cdktf-demo ディレクトリに次のファイルとサブディレクトリを作成します。

  • .gitignoreこれは、このプロジェクトをリモート Git リポジトリにプッシュする場合に Git が無視するファイルとディレクトリの一覧です。
  • cdktf.jsonここには、CDKTF プロジェクトの構成設定が含まれています。 構成設定の詳細については、「 構成ファイル 」を参照してください。
  • helpここには、CDKTF プロジェクトを操作するための次のステップに関する情報が含まれています。
  • main-test.pyこれには、CDKTF プロジェクト用に記述できるサポート単体テストが含まれています。 単体 テストの詳細については、「単体テスト 」を参照してください。
  • main.pyここには、CDKTF プロジェクト用に記述した Python コードが含まれています。
  • Pipfile Pipfile.lockは、CDKTF プロジェクトのコードの依存関係を管理します。

ステップ 2: リソースを定義する

この手順では、Terraform CDK Databricks プロバイダーを使用して、ノートブックとそのノートブックを実行するジョブを定義します。

  1. プロジェクトの依存関係をインストールする: pipenvを使用して、 Terraform CDK Databricks Provider を CDKTF プロジェクトにインストールして、Databricks リソースを生成します。 これを行うには、次のコマンドを実行します。

    Bash
    pipenv install cdktf-cdktf-provider-databricks
  2. main.py ファイルの内容を次のコードで置き換えます。このコードは、Databricks ワークスペースで CDKTF を認証し、ノートブックと、ノートブックを実行するジョブを生成します。 このコードの構文ドキュメントを表示するには、PythonTerraform CDK Databricks プロバイダー コンストラクト リファレンス を参照してください。

Python
#!/usr/bin/env python
from constructs import Construct
from cdktf import (
App, TerraformStack, TerraformOutput
)
from cdktf_cdktf_provider_databricks import (
data_databricks_current_user,
job, notebook, provider
)
import vars
from base64 import b64encode

class MyStack(TerraformStack):
def __init__(self, scope: Construct, ns: str):
super().__init__(scope, ns)

provider.DatabricksProvider(
scope = self,
id = "databricksAuth"
)

current_user = data_databricks_current_user.DataDatabricksCurrentUser(
scope = self,
id_ = "currentUser"
)

# Define the notebook.
my_notebook = notebook.Notebook(
scope = self,
id_ = "notebook",
path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
language = "PYTHON",
content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
)

# Define the job to run the notebook.
my_job = job.Job(
scope = self,
id_ = "job",
name = f"{vars.resource_prefix}-job",
task = [
job.JobTask(
task_key = f"{vars.resource_prefix}-task",
new_cluster = job.JobTaskNewCluster(
num_workers = vars.num_workers,
spark_version = vars.spark_version,
node_type_id = vars.node_type_id
),
notebook_task = job.JobTaskNotebookTask(
notebook_path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py"
),
email_notifications = job.JobTaskEmailNotifications(
on_success = [ current_user.user_name ],
on_failure = [ current_user.user_name ]
)
)
]
)

# Output the notebook and job URLs.
TerraformOutput(
scope = self,
id = "Notebook URL",
value = my_notebook.url
)

TerraformOutput(
scope = self,
id = "Job URL",
value = my_job.url
)

app = App()
MyStack(app, "cdktf-demo")
app.synth()

  1. main.pyと同じディレクトリに vars.py という名前のファイルを作成します。次の値を独自の値に置き換えて、リソースのプレフィックスとクラスター設定 (ワーカーの数 、Spark ランタイム バージョン文字列 、ノード タイプ など) 指定します。
Python
#!/usr/bin/env python
resource_prefix = "cdktf-demo"
num_workers = 1
spark_version = "14.3.x-scala2.12"
node_type_id = "n1-standard-4"

ステップ 3: リソースをデプロイする

この手順では、CDKTF CLI を使用して、定義されたノートブックとそのノートブックを実行するジョブを既存の Databricks ワークスペースにデプロイします。

  1. CDKTF プロジェクトと同等の Terraform コードを生成します。 これを行うには、 cdktf synth コマンドを実行します。

    Bash
    cdktf synth
  2. 変更を加える前に、保留中のリソースの変更を確認できます。 次のコマンドを実行します。

    Bash
    cdktf diff
  3. ノートブックとジョブをデプロイするには、 cdktf deploy コマンドを実行します。

    Bash
    cdktf deploy
  4. 承認 を求められたら、 Enter キーを押します。Terraform は、ノートブックとジョブを作成してワークスペースにデプロイします。

ステップ 4: リソースを操作する

この手順では、 Databricks ワークスペースでジョブを実行し、指定したノートブックを実行します。

  1. ジョブが実行するノートブックをワークスペースで表示するには、cdk deploy コマンドの出力に表示される ノートブック URL リンクをコピーし、Web ブラウザーのアドレス バーに貼り付けます。
  2. ノートブックを実行するジョブをワークスペースで表示するには、cdk deploy コマンドの出力に表示される ジョブ URL リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
  3. ジョブを実行するには、ジョブ ページの [今すぐ実行 ] ボタンをクリックします。

(オプション)ステップ 5: リソースに変更を加える

このオプションのステップでは、ノートブックのコードを変更し、変更したノートブックを再デプロイしてから、ジョブを使用して変更したノートブックを再実行します。

ノートブックに変更を加えない場合は、「 ステップ 6: クリーンアップ」に進んでください。

  1. main.py ファイルで、notebook 変数宣言を次のように変更してください。

    Python
    my_notebook = notebook.Notebook(
    scope = self,
    id_ = "notebook",
    path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
    language = "PYTHON",
    content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
    )

    次のように設定します。

    Python
    my_notebook = notebook.Notebook(
    scope = self,
    id_ = "notebook",
    path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
    language = "PYTHON",
    content_base64 = b64encode(b'''
    data = [
    { "Category": 'A', "ID": 1, "Value": 121.44 },
    { "Category": 'B', "ID": 2, "Value": 300.01 },
    { "Category": 'C', "ID": 3, "Value": 10.99 },
    { "Category": 'E', "ID": 4, "Value": 33.87}
    ]

    df = spark.createDataFrame(data)

    display(df)
    ''').decode("UTF-8")
    )
注記

三重引用符 (''') で囲まれたコード行が、図のようにコード エディターの端に揃っていることを確認します。 そうしないと、Terraform はノートブックに追加の空白を挿入し、新しい Python コードの実行に失敗する可能性があります。

  1. CDKTF プロジェクトに対応する Terraform コードを再生成します。 これを行うには、次のコマンドを実行します。

    Bash
    cdktf synth
  2. 変更を加える前に、保留中のリソースの変更を確認できます。 次のコマンドを実行します。

    Bash
    cdktf diff
  3. ノートブックの変更をデプロイするには、 cdktf deploy コマンドを実行します。

    Bash
    cdktf deploy
  4. 承認 を求められたら、 Enter キーを押します。Terraform はノートブックの内容を変更します。

  5. ジョブがワークスペースで実行する変更されたノートブックを表示するには、前に開いたノートブックを更新するか、cdk deploy コマンドの出力に表示される ノートブック URL リンクをコピーして Web ブラウザーのアドレス バーに貼り付けます。

  6. ワークスペースで変更されたノートブックを実行したジョブを表示するには、前に開いたジョブを更新するか、cdk deploy コマンドの出力に表示される ジョブ URL リンクをコピーして Web ブラウザーのアドレス バーに貼り付けます。

  7. ジョブを実行するには、ジョブ ページの [今すぐ実行 ] ボタンをクリックします。

ステップ 6: クリーンアップ

この手順では、CDKTF CLI を使用して、Databricks ワークスペースからノートブックとジョブを削除します。

  1. ワークスペースからリソースを削除するには、 cdktf destroy コマンドを実行します。

    Bash
    cdktf destroy
  2. 承認 を求められたら、 Enter キーを押します。Terraform は、ワークスペースからリソースを削除します。

テスティング

CDKTF プロジェクトは、デプロイする前にテストできます。 CDKTF ドキュメントの 「単体テスト 」を参照してください。

Python ベースの CDKTF プロジェクトでは、Python テストフレームワーク pytestcdktf パッケージの Testing クラスを使用して、テストを記述して実行できます。 次の test_main.py という名前のサンプル ファイルは、この記事の前の main.py ファイル内の CDKTF コードをテストします。 最初のテストでは、プロジェクトのノートブックに、ノートブックのコンテンツの予想される Base64 エンコード表現が含まれるかどうかを確認します。 2 番目のテストでは、プロジェクトのジョブに予期されるジョブ名が含まれるかどうかを確認します。 これらのテストを実行するには、プロジェクトのルート ディレクトリから pytest コマンドを実行します。

Python
from cdktf import App, Testing
from cdktf_cdktf_provider_databricks import job, notebook
from main import MyStack

class TestMain:
app = App()
stack = MyStack(app, "cdktf-demo")
synthesized = Testing.synth(stack)

def test_notebook_should_have_expected_base64_content(self):
assert Testing.to_have_resource_with_properties(
received = self.synthesized,
resource_type = notebook.Notebook.TF_RESOURCE_TYPE,
properties = {
"content_base64": "ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp"
}
)

def test_job_should_have_expected_job_name(self):
assert Testing.to_have_resource_with_properties(
received = self.synthesized,
resource_type = job.Job.TF_RESOURCE_TYPE,
properties = {
"name": "cdktf-demo-job"
}
)

その他のリソース