Terraform CDK Databricks プロバイダー
注
この記事では、サード パーティによって開発された Cloud Development Kit for Terraform (CDKTF) について説明します。 プロバイダに問い合わせるには、 Terraform コミュニティを参照してください。
この記事では 、Python TerraformCDKDatabricks プロバイダー と クラウド開発キット forTerraform (CDKTF) とともに を使用する方法について説明します。CDKTF は、使い慣れたプログラミング言語、ツール、エンジニアリング手法を使用して Databricks リソースを作成、デプロイ、管理できるサードパーティの Infrastructure as Code (IaC) プラットフォームです。 この記事では Python の使用方法を説明しますが、CDKTF では TypeScript、Java、C#、Go などの追加言語もサポートされています。
Terraform CDK Databricks プロバイダーは、 Databricks Terraform プロバイダーに基づいています。 詳細については、「 Terraform クラウド」を参照してください。 CDKTF は AWS Cloud Development Kit (AWS CDK) に基づいています。
要件
この記事では既存のワークスペースにリソースをデプロイするため、Databricks ワークスペースが必要です。
ローカル開発コンピューターには、次のものがインストールされている必要があります。
Terraform、バージョン 1.1 以降。Terraform がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、ターミナルまたは PowerShell を使用してコマンド
terraform -v
を実行します。 Terraform がまだインストールされていない場合は、インストールします。terraform -v
Node.js、バージョン 16.13 以降、および npm。 Node.js と
npm
がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、コマンドnode -v
およびnpm -v
を実行します。 Node.jsの最新バージョンには、すでにnpm
が含まれています。 ノード.js と npm をノード バージョン マネージャー (nvm) を使用してインストールします (ノード.js とnpm
がまだインストールされていない場合)。node -v npm -v
CDKTF CLIです。CDKTF CLI がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、コマンド
cdktf --version
を実行します。 CDKTF CLI がまだインストールされていない場合は、npm を使用してインストールします。cdktf --version
ヒント
自作でmacOSにCDKTF CLIをインストールすることもできます。 CDKTF のインストールを参照してください。
Pythonバージョン 3.7 以上およびpipenvバージョン 2021.5.29 以上。 Python と
pipenv
がインストールされているかどうか、またインストールされているバージョンを確認するには、コマンドpython --version
とpipenv --version
を実行します。 まだインストールされていない場合は、 Pythonとpipenv をインストールします。python --version pipenv --version
使用するサポートされている認証の種類用に構成された Databricks 認証。 Databricks Terraform プロバイダーのドキュメントの 「認証 」を参照してください。
ステップ 1: CDKTF プロジェクトを作成する
このステップでは、ローカル開発マシンで、CDKTF プロジェクトに必要なディレクトリ構造を設定します。 次に、このディレクトリ構造内に CDKTF プロジェクトを作成します。
CDKTF プロジェクト用の空のディレクトリを作成し、そのディレクトリに切り替えます。 ターミナルまたは PowerShell で次のコマンドを実行します。
mkdir cdktf-demo cd cdktf-demo
md cdktf-demo cd cdktf-demo
次のコマンドを実行して、CDKTF プロジェクトを作成します。
cdktf init --template=python --local
プロジェクト名の入力を求めるプロンプトが出されたら、Enter キーを押してデフォルトのプロジェクト名
cdktf-demo
を受け入れ ます。プロジェクトの説明の入力を求めるプロンプトが出されたら、Enter キーを押してデフォルトのプロジェクトの説明を受け入れ ます。
[ 既存の Terraform プロジェクトから開始しますか] というプロンプトが表示されたら、
N
と入力して Enter キーを押します。[ クラッシュ レポートを 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 プロバイダーを使用して、ノートブックとそのノートブックを実行するジョブを定義します。
プロジェクトの依存関係をインストールします。
pipenv
を使用して、CDKTF プロジェクトにTerraform CDK Databricks プロバイダーをインストールし、Databricks リソースを生成します。 これを行うには、以下を実行します。pipenv install cdktf-cdktf-provider-databricks
main.py
ファイルの内容を次のコードで置き換えます。このコードは、Databricks ワークスペースで CDKTF を認証し、ノートブックとノートブックを実行するジョブを生成します。 このコードの構文ドキュメントを表示するには、 Python の Terraform CDK Databricks プロバイダー構造リファレンス を参照してください。#!/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()
main.py
と同じディレクトリにvars.py
という名前のファイルを作成します。リソース プレフィックスとクラスター設定 ( ワーカー数、 Spark ランタイム バージョン文字列、 ノード タイプなど) を指定するには、次の値を独自の値に置き換えます。#!/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 ワークスペースに、定義されたノートブックとそのノートブックを実行するジョブをデプロイします。
CDKTF プロジェクトに相当する Terraform コードを生成します。 これを行うには、
cdktf synth
コマンドを実行します。cdktf synth
変更を加える前に、保留中のリソースの変更を確認できます。 以下を実行します。
cdktf diff
cdktf deploy
コマンドを実行して、ノートブックとジョブをデプロイします。cdktf deploy
承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によってノートブックとジョブが作成され、ワークスペースにデプロイされます。
ステップ 4: リソースを操作する
このステップでは、指定したノートブックを実行する Databricks ワークスペースでジョブを実行します。
ジョブがワークスペースで実行されるノートブックを表示するには、
cdk deploy
コマンドの出力に表示される [ノートブック URL] リンクをコピーし、Web ブラウザーのアドレス バーに貼り付けます。ワークスペースでノートブックを実行するジョブを表示するには、
cdk deploy
コマンドの出力に表示される [ジョブ URL] リンクをコピーし、Web ブラウザーのアドレス バーに貼り付けます。ジョブを実行するには、ジョブ ページの [ 今すぐ実行 ] ボタンをクリックします。
(オプション)ステップ 5: リソースに変更を加える
このオプションの手順では、ノートブックのコードを変更し、変更されたノートブックを再デプロイしてから、ジョブを使用して変更されたノートブックを再実行します。
ノートブックに変更を加えない場合は、「 ステップ 6: クリーンアップ」に進みます。
main.py
ファイルで、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") )
以下に対して:
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 コードの実行が失敗する可能性があります。CDKTF プロジェクトに相当する Terraform コードを再生成します。 これを行うには、次のコマンドを実行します。
cdktf synth
変更を加える前に、保留中のリソースの変更を確認できます。 以下を実行します。
cdktf diff
cdktf deploy
コマンドを実行して、ノートブックの変更をデプロイします。cdktf deploy
承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によってノートブックの内容が変更されます。
ジョブがワークスペースで実行される変更されたノートブックを表示するには、前に開いたノートブックを更新するか、
cdk deploy
コマンドの出力に表示される [ノートブックの URL] リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。ワークスペースで変更されたノートブックを実行するジョブを表示するには、前に開いたジョブを更新するか、
cdk deploy
コマンドの出力に表示される [ジョブ URL] リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。ジョブを実行するには、ジョブ ページの [ 今すぐ実行 ] ボタンをクリックします。
ステップ 6: クリーンアップ
このステップでは、CDKTF CLI を使用して、Databricks ワークスペースからノートブックとジョブを削除します。
ワークスペースからリソースを削除するには、
cdktf destroy
コマンドを実行します。cdktf destroy
承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によって、ワークスペースからリソースが削除されます。
テスティング
CDKTF プロジェクトは、デプロイする前にテストできます。 CDKTF ドキュメントの 「単体テスト 」を参照してください。
Python ベースの CDKTF プロジェクトでは、Python テスト フレームワークpytestとcdktf
パッケージのTesting
クラスを使用してテストを記述および実行できます。 次の test_main.py
という名前のサンプル ファイルは、この記事の前の main.py
ファイルの CDKTF コードをテストします。 最初のテストでは、プロジェクトのノートブックに、ノートブックのコンテンツの予想される Base64 エンコード表現が含まれているかどうかを確認します。 2 番目のテストでは、プロジェクトのジョブに予想されるジョブ名が含まれているかどうかを確認します。 これらのテストを実行するには、プロジェクトのルート ディレクトリからpytest
コマンドを実行します。
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"
}
)
その他のリソース
Terraform CDK Databricks プロバイダー コンストラクト リファレンス for TypeScript、 Python、 Java、 C#、 および Go
CDKTF アプリケーションのロギングを有効にする