Terraform CDK Databricks プロバイダー

この記事では、Databricks によって提供もサポートもされていない Terraform 用クラウド開発キット (CDKTF) について説明します。 プロバイダーに連絡するには、 Terraformコミュニティを参照してください。

この記事では、Python または TypeScript を Terraform CDK Databricks プロバイダー および Terraform 用クラウド開発キット (CDKTF) と共に使用する方法について説明します。 CDKTF は、使い慣れたプログラミング言語、ツール、エンジニアリング手法を使用して Databricks リソースを作成、配置、管理できるサードパーティのInfrastructure-as-Code (IaC) プラットフォームです。 この記事では Python と TypeScript の使用方法について説明しますが、CDKTF では 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 --versionpipenv --versionを実行します。 Python をインストールしPipenvをまだインストールしていない場合はインストールします。

    python --version
    pipenv --version
    

    タイプスクリプト バージョン4.4以降。 TypeScript がインストールされているかどうかを確認し、インストールされているバージョンを確認するには、コマンド tsc -vを実行します。 TypeScript がまだインストールされていない場合は、インストールします

    tsc -v
    

    言語 の前提条件をインストールします。

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

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

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

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

    mkdir cdktf-demo
    cd cdktf-demo
    
    md cdktf-demo
    cd cdktf-demo
    
  2. 次のコマンドを実行して、CDKTF プロジェクトを作成します。

    cdktf init --template=python --local
    
    cdktf init --template=typescript --local
    
  3. プロジェクト名の入力を求めるプロンプトが出されたら、Enter キーを押してデフォルトのプロジェクト名 cdktf-demo を受け入れ ます

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

  5. [ 既存の Terraform プロジェクトから開始しますか] というプロンプトが表示されたら、 N と入力して Enter キーを押します。

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

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

  • .gitignoreこれは、このプロジェクトをリモート Git リポジトリにプッシュする場合に Git が無視するファイルとディレクトリのリストです。

  • cdktf.jsonCDKTF プロジェクトの構成設定が含まれています。 構成設定の詳細については、「 構成ファイル 」を参照してください。

  • helpCDKTF プロジェクトで作業するために実行できる次のステップに関する情報が含まれています。

  • main-test.pyCDKTF プロジェクト用に記述できるサポート単体テストが含まれています。 単体 テストの詳細については、「単体テスト 」を参照してください。

  • main.pyこれには、CDKTF プロジェクト用に記述した Python コードが含まれています。

  • Pipfile および Pipfile.lockは、CDKTF プロジェクトのコードの依存関係を管理します。

  • jest.config.js CDKTF プロジェクト用に記述できるサポート単体テストを管理する __tests__ サブディレクトリ。 単体 テストの詳細については、「単体テスト 」を参照してください。

  • CDKTF プロジェクトのコード依存関係を含む node_modules サブディレクトリ。

  • .gitignoreこれは、このプロジェクトをリモート Git リポジトリにプッシュする場合に Git が無視するファイルとディレクトリのリストです。

  • cdktf.jsonCDKTF プロジェクトの構成設定が含まれています。 構成設定の詳細については、「 構成ファイル 」を参照してください。

  • helpCDKTF プロジェクトで作業するために実行できる次のステップに関する情報が含まれています。

  • main.tsこれには、CDKTF プロジェクト用に記述した TypeScript コードが含まれています。

  • .npmrcpackage.jsonpackage-lock.jsonsetup.js、および tsconfig.jsonは、CDKTF プロジェクトのコードの依存関係やその他の設定を管理します。

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

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

  1. 次のようにプロジェクトの依存関係をインストールします。

    pipenvを使用して、 Terraform CDK Databricks プロバイダーを CDKTF プロジェクトにインストールし、Databricks リソースを生成します。これを行うには、次のコマンドを実行します。

    pipenv install cdktf-cdktf-provider-databricks
    

    npm (TypeScript 用) を使用して、 Terraform CDK Databricks プロバイダーを CDKTF プロジェクトにインストールし、Databricks リソースを生成します。また、 Node.js パッケージの TypeScript 定義 をインストールして、 Buffer クラスを使用してノートブックにコードを記述します。 これを行うには、次のコマンドを実行します。

    npm install @cdktf/provider-databricks --force
    npm install --save-dev @types/node
    
  2. main.py ファイル (Python の場合) または main.ts ファイル (TypeScript の場合) の内容を次のコードに置き換えます。このコードは、Databricks ワークスペースで CDKTF を認証し、ノートブックを実行するジョブと共にノートブックを生成します。 このコードの構文ドキュメントを表示するには、 Python または TypeScript の Terraform CDK Databricks プロバイダー コンストラクト リファレンス を参照してください。

    #!/usr/bin/env python
    from unicodedata import name
    from constructs import Construct
    from cdktf import App, TerraformStack, TerraformOutput
    from cdktf_cdktf_provider_databricks import *
    import vars
    from base64 import b64encode
    
    class MyStack(TerraformStack):
      def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)
    
        DatabricksProvider(
          scope = self,
          id    = "databricksAuth"
        )
    
        current_user = DataDatabricksCurrentUser(
          scope     = self,
          id_       = "currentUser"
        )
    
        # Define the 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.
        job = Job(
          scope = self,
          id_   = "job",
          name  = f"{vars.resource_prefix}-job",
          new_cluster = JobNewCluster(
            num_workers   = vars.num_workers,
            spark_version = vars.spark_version,
            node_type_id  = vars.node_type_id
          ),
          notebook_task = JobNotebookTask(
            notebook_path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py"
          ),
          email_notifications = JobEmailNotifications(
            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 = notebook.url
        )
    
        TerraformOutput(
          scope = self,
          id    = "Job URL",
          value = job.url
        )
    
    app = App()
    MyStack(app, "cdktf-python")
    
    app.synth()
    
    import { Construct } from "constructs";
    import { App, TerraformOutput, TerraformStack } from "cdktf";
    import { DatabricksProvider, DataDatabricksCurrentUser, Notebook, Job } from "@cdktf/provider-databricks";
    import * as vars from "./vars";
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name);
    
        new DatabricksProvider(this, "databricksAuth", {})
    
        const currentUser = new DataDatabricksCurrentUser(this, "currentUser", {});
    
        // Define the notebook.
        const notebook = new Notebook(this, "notebook", {
          path: `${currentUser.home}/CDKTF/${vars.resourcePrefix}-notebook.py`,
          language: "PYTHON",
          contentBase64: Buffer.from("display(spark.range(10))", "utf8").toString("base64")
        });
    
        // Define the job to run the notebook.
        const job = new Job(this, "job", {
          name: `${vars.resourcePrefix}-job`,
          newCluster: {
            numWorkers: vars.numWorkers,
            sparkVersion: vars.sparkVersion,
            nodeTypeId: vars.nodeTypeId
          },
          notebookTask: {
            notebookPath: `${currentUser.home}/CDKTF/${vars.resourcePrefix}-notebook.py`
          },
          emailNotifications: {
            onSuccess: [ currentUser.userName ],
            onFailure: [ currentUser.userName ]
          }
        });
    
        // Output the notebook and job URLs.
        new TerraformOutput(this, "Notebook URL", {
          value: notebook.url
        });
    
        new TerraformOutput(this, "Job URL", {
          value: job.url
        });
      }
    }
    
    const app = new App();
    new MyStack(app, "cdktf-demo");
    app.synth();
    
  3. main.py (Python の場合) または main.ts (TypeScript の場合) と同じディレクトリに、vars.py (Python の場合) または vars.ts (TypeScript の場合) という名前のファイルを作成します。次の値を独自の値に置き換えて、リソース プレフィックスとクラスター設定 ( ワーカーの数Spark ランタイム バージョン文字列ノード タイプなど) を指定します。

    #!/usr/bin/env python
    resource_prefix = "cdktf-demo"
    num_workers     = 1
    spark_version   = "10.4.x-scala2.12"
    node_type_id    = "n1-standard-4"
    
    export const resourcePrefix = "cdktf-demo"
    export const numWorkers     = 1
    export const sparkVersion   = "10.4.x-scala2.12"
    export const nodeTypeId     = "n1-standard-4"
    

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

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

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

    cdktf synth
    
  2. 変更を加える前に、保留中のリソースの変更を確認できます。 以下を実行します。

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

    cdktf deploy
    
  4. 承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によってノートブックとジョブが作成され、ワークスペースにデプロイされます。

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

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

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

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

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

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

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

ノートブックに変更を加えない場合は、「 ステップ 6: クリーンアップ」に進みます。

  1. main.py ファイル (Python の場合) または main.ts ファイル (TypeScript の場合) で、 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")
        )
    
       const notebook = new Notebook(this, "notebook", {
          path: currentUser.home + "/CDKTF/" + vars.resourcePrefix + "-notebook.py",
          language: "PYTHON",
          contentBase64: Buffer.from("display(spark.range(10))", "utf8").toString("base64")
       });
    

    以下に対して:

        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")
        )
    
       const notebook = new Notebook(this, "notebook", {
          path: currentUser.home + "/CDKTF/" + vars.resourcePrefix + "-notebook.py",
          language: "PYTHON",
          contentBase64: Buffer.from(`
    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)`, "utf8").toString("base64")
       });
    

    バッククォート (') で始まるコード行と末尾のコード行が、コード エディターの端と同じ高さであることを確認します。 そうしないと、Terraform によってノートブックに空白が挿入され、新しい Python コードの実行が失敗する可能性があります。

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

    cdktf synth
    
  3. 変更を加える前に、保留中のリソースの変更を確認できます。 以下を実行します。

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

    cdktf deploy
    
  5. 承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によってノートブックの内容が変更されます。

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

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

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

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

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

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

    cdktf destroy
    
  2. 承認を求めるメッセージが表示されたら、 Enter キーを押します。Terraform によって、ワークスペースからリソースが削除されます。