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をまだインストールしていない場合は、インストールします。Bashterraform -v
-
Node.js、バージョン 16.13 以降、 および npm。 Node.js と
npm
がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、コマンドnode -v
とnpm -v
を実行します。 Node.js の最新バージョンには、すでにnpm
. Node.js とnpm
がまだインストールされていない場合は、Node Version Manager (nvm) を使用して Node.js と npm をインストールします。Bashnode -v
npm -v -
CDKTF CLI.CDKTF CLI がインストールされているかどうか、およびインストールされているバージョンを確認するには、コマンド
cdktf --version
を実行します。 CDKTF CLI をまだインストールしていない場合は、npm を使用してインストールします。Bashcdktf --version
Homebrewを使用してmacOSにCDKTF CLIをインストールすることもできます。 CDKTF のインストールを参照してください。
-
Python バージョン3.7以降および pipenv バージョン2021.5.29以降。 Python と
pipenv
がインストールされているかどうか、およびインストールされているバージョンを確認するには、コマンドpython --version
とpipenv --version
を実行します。 Python をインストールし 、 pipenv がまだインストールされていない場合はインストールします。Bashpython --version
pipenv --version -
使用するサポートされている認証の種類に対して構成された Databricks 認証。 Databricks Terraform プロバイダーのドキュメントの 「認証 」を参照してください。
ステップ1: CDKTFプロジェクトを作成します
この手順では、ローカル開発マシンで CDKTF プロジェクトに必要なディレクトリ構造を設定します。 次に、このディレクトリ構造内に CDKTF プロジェクトを作成します。
- CDKTF プロジェクト用の空のディレクトリを作成し、そのディレクトリに切り替えます。 ターミナルまたは PowerShell で次のコマンドを実行します。
- Unix, Linux, and macOS
- Windows
mkdir cdktf-demo
cd cdktf-demo
md cdktf-demo
cd cdktf-demo
-
次のコマンドを実行して、CDKTF プロジェクトを作成します。
Bashcdktf 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
を使用して、 Terraform CDK Databricks Provider を CDKTF プロジェクトにインストールして、Databricks リソースを生成します。 これを行うには、次のコマンドを実行します。Bashpipenv 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
コマンドを実行します。Bashcdktf synth
-
変更を加える前に、保留中のリソースの変更を確認できます。 次のコマンドを実行します。
Bashcdktf diff
-
ノートブックとジョブをデプロイするには、
cdktf deploy
コマンドを実行します。Bashcdktf deploy
-
承認 を求められたら、 Enter キーを押します。Terraform は、ノートブックとジョブを作成してワークスペースにデプロイします。
ステップ 4: リソースを操作する
この手順では、 Databricks ワークスペースでジョブを実行し、指定したノートブックを実行します。
- ジョブが実行するノートブックをワークスペースで表示するには、
cdk deploy
コマンドの出力に表示される ノートブック URL リンクをコピーし、Web ブラウザーのアドレス バーに貼り付けます。 - ノートブックを実行するジョブをワークスペースで表示するには、
cdk deploy
コマンドの出力に表示される ジョブ URL リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。 - ジョブを実行するには、ジョブ ページの [今すぐ実行 ] ボタンをクリックします。
(オプション)ステップ 5: リソースに変更を加える
このオプションのステップでは、ノートブックのコードを変更し、変更したノートブックを再デプロイしてから、ジョブを使用して変更したノートブックを再実行します。
ノートブックに変更を加えない場合は、「 ステップ 6: クリーンアップ」に進んでください。
-
main.py
ファイルで、notebook
変数宣言を次のように変更してください。Pythonmy_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")
)次のように設定します。
Pythonmy_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 コードを再生成します。 これを行うには、次のコマンドを実行します。
Bashcdktf synth
-
変更を加える前に、保留中のリソースの変更を確認できます。 次のコマンドを実行します。
Bashcdktf diff
-
ノートブックの変更をデプロイするには、
cdktf deploy
コマンドを実行します。Bashcdktf deploy
-
承認 を求められたら、 Enter キーを押します。Terraform はノートブックの内容を変更します。
-
ジョブがワークスペースで実行する変更されたノートブックを表示するには、前に開いたノートブックを更新するか、
cdk deploy
コマンドの出力に表示される ノートブック URL リンクをコピーして Web ブラウザーのアドレス バーに貼り付けます。 -
ワークスペースで変更されたノートブックを実行したジョブを表示するには、前に開いたジョブを更新するか、
cdk deploy
コマンドの出力に表示される ジョブ URL リンクをコピーして Web ブラウザーのアドレス バーに貼り付けます。 -
ジョブを実行するには、ジョブ ページの [今すぐ実行 ] ボタンをクリックします。
ステップ 6: クリーンアップ
この手順では、CDKTF CLI を使用して、Databricks ワークスペースからノートブックとジョブを削除します。
-
ワークスペースからリソースを削除するには、
cdktf destroy
コマンドを実行します。Bashcdktf 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"
}
)