Pulumi Databricks リソース プロバイダー
このドキュメントは廃止されており、更新されない可能性があります。
この記事では、サードパーティによって開発されたPulumiについて説明します。 プロバイダーに問い合わせるには、 Pulumi サポートを参照してください。
この記事では、使い慣れたプログラミング言語、ツール、エンジニアリング手法を使用して Databricks リソースを作成、配置、管理できるサードパーティのInfrastructure-as-Code (IaC) プラットフォームである Python と Pulumi を使用する方法について説明します。 この記事では Python と Pulumi Databricks リソース プロバイダーの使用方法について説明しますが、 Pulumi は Python for Databricks に加えて、TypeScript、JavaScript、Go、C# などの他の言語をサポートしています。
Pulumi Databricks リソース プロバイダーは、 Databricks Terraform プロバイダーに基づいています。 詳細については、「 Terraform Cloud」を参照してください。
必要条件
-
Pulumi アカウント。 Pulumi アカウントをまだお持ちでない場合は、Pulumi にサインアップしてください。Pulumi は個人向けで、チーム向けは無料枠を提供しています。
-
Python 3.6 以降。 Pythonがインストールされているかどうかを確認するには、ターミナルから、またはPowerShellを使用してコマンド
python --version
を実行します。 Pythonをまだインストールしていない場合は、インストールします。
Python の一部のインストールでは、 python
の代わりに python3
を使用する必要がある場合があります。その場合は、この記事全体でpython3
を python
に置き換えてください。
-
Databricks ワークスペース インスタンスの URL (
https://1234567890123456.7.gcp.databricks.com
. -
Databricks アクセス資格情報。 Pulumi Databricks プロジェクトでは、次の Databricks 認証の種類がサポートされています。
- Databricks 個人用アクセス トークン認証 (
databricks:authType pat
)
GitHub の Pulumi Databricks リポジトリ の構成 を参照してください。
- Databricks 個人用アクセス トークン認証 (
次の手順は、Python を使用して Pulumi Databricks プロジェクトを作成する方法を示しています。 純粋なクラウド プロバイダ優先の視点からのチュートリアルについては、Pulumi ドキュメントの Google Cloud スタートガイド をご覧ください。 プログラミング言語優先の視点からのチュートリアルについては、Pulumi のドキュメントの「Python、Node.js (JavaScript、TypeScript)、Go、.NET (C#、VB、F#)」を参照してください。
ステップ 1: Pulumi プロジェクトを作成する
この手順では、ローカルの開発マシンで、Pulumi プロジェクトに必要なディレクトリ構造を設定します。 次に、このディレクトリ構造内に Pulumi プロジェクトを作成します。
- ターミナルまたは PowerShell から、空のディレクトリを作成し、次の例のようにそのディレクトリに切り替えます。
- Unix, Linux, and macOS
- Windows
mkdir pulumi-demo
cd pulumi-demo
md pulumi-demo
cd pulumi-demo
- Pulumi をインストールするには、オペレーティング システムに応じて次のコマンドを実行します。
- Unix, Linux
- MacOS
- Windows
Install Pulumi on Unix or Linux by using curl:
curl -fsSL https://get.pulumi.com | sh
Install Pulumi on macOS by using Homebrew:
brew install pulumi/tap/pulumi
Install Pulumi on Windows by using PowerShell with elevated permissions through the Chocolatey package manager:
choco install pulumi
別の Pulumi インストール オプションについては、Pulumi のドキュメントの 「ダウンロードとインストール 」を参照してください。 3. 次のコマンドを実行して、基本的な Python Pulumi プロジェクトを作成します。
pulumi new python
また、オンラインで Pulumi アカウントから Pulumi プロジェクトを作成することもできます ( [プロジェクト] > [プロジェクトの作成 ])。ただし、Databricks のプロジェクト テンプレートはありません。
-
プロンプトが表示されたら、 Enter キーを押してから、Webブラウザを使用してPulumiアカウントにオンラインでサインインします(まだサインインしていない場合)。 サインインしたら、ターミナルまたは PowerShell に戻ります。
-
プロジェクト名 の入力を求められたら、 Enter キーを押してデフォルトのプロジェクト名である
pulumi-demo
を受け入れます。 -
プロジェクトの説明 を求められたら、「
A demo Python Pulumi Databricks project
」と入力して Enter キーを押します。 -
スタック名 の入力を求められたら、 Enter キーを押してデフォルトのスタック名である
dev
を受け入れます。Pulumi は、pulumi-demo
ディレクトリに次のファイルとサブディレクトリを作成します。Pulumi.yaml
これは、Pulumi プロジェクトの設定のリストです。__main__.py
ここには、Pulumi プロジェクト用に記述した Python コードが含まれています。requirements.txt
これは、Pulumi がプロジェクトにインストールするサポート Python コード パッケージの一覧です。.gitignore
これは、このプロジェクトをリモート Git リポジトリにプッシュする場合に Git が無視するファイルとディレクトリの一覧です。venv
サブディレクトリには、Pulumi がプロジェクトに使用するサポートする Python 仮想環境コードが含まれています。
-
プロジェクトの
dev
スタックの初期デプロイを実行するには、次のコマンドを実行します。Bashpulumi up
-
この更新を実行するように求められたら、上矢印キーを押して [はい ] に移動し、 Enter キーを押します。
-
表示される View Live リンクをコピーして、Webブラウザのアドレスバーに貼り付けると、 オンラインでPulumiアカウントに移動します。
pulumi-demo
プロジェクトのdev
スタックのアクティビティの詳細が表示されます。スタックにはまだリソースがないため、今は見るべきものはあまりありません。 これらのリソースは、次の手順で作成します。
ステップ 2: Databricks リソースを作成する
この手順では、Pulumi Databricks リソース プロバイダーを使用して、既存の Databricks ワークスペースにノートブックとそのノートブックを実行するジョブを作成します。
-
Pulumi が生成した
__main.py__
ファイルに、任意のテキスト エディターまたは統合開発環境 (IDE) を使用して次のコードを入力します。 次のコードは、Pulumi Databricks ノートブック と ジョブ リソースとその設定を宣言します。Python"""A Python Pulumi program"""
import pulumi
from pulumi_databricks import *
from base64 import b64encode
# Get the authenticated user's workspace home directory path and email address.
# See https://www.pulumi.com/registry/packages/databricks/api-docs/getcurrentuser
user_home_path = get_current_user().home
user_email_address = get_current_user().user_name
# Define the name prefix to prepend to the resource names that are created
# for the Notebook and Job resources. To do this, you can use a Pulumi
# configuration value instead of hard-coding the name prefix in this file.
#
# To set a Pulumi configuration value, run the following command, which sets
# a "resource-prefix" configuration value to "pulumi-demo" in the
# associated "Pulumi.<stack-name>.yaml" configuration file:
#
# pulumi config set resource-prefix "pulumi-demo"
#
# For more information about defining and retrieving hard-coded values, see
# https://www.pulumi.com/docs/intro/concepts/config
config = pulumi.config.Config()
resource_prefix = config.require('resource-prefix')
# Define cluster resource settings.
node_type = config.require('node-type')
# Create a Notebook resource.
# See https://www.pulumi.com/registry/packages/databricks/api-docs/notebook
# This example adds a single cell to the notebook, which is constructed from
# a single base64-encoded string. In practice, you would replace this:
#
# language = "PYTHON",
# content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
#
# With this:
#
# source = "path/to/local/my-notebook.py"
#
# To provide more notebook content easier and faster. Also, the notebook's language
# is automatically detected. If you specify a notebook path, be sure that it does
# not end in .ipynb, as Pulumi relies on the workspace import API, which doesn't
# rely on any specific extensions such as .ipynb in the notebook path.
notebook = Notebook(
resource_name = f"{resource_prefix}-notebook",
path = f"{user_home_path}/Pulumi/{resource_prefix}-notebook.py",
language = 'PYTHON',
content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
)
# Export the URL of the Notebook, so that you can easily browse to it later.
# See https://www.pulumi.com/docs/intro/concepts/stack/#outputs
pulumi.export('Notebook URL', notebook.url)
# Create a Job resource.
# See https://www.pulumi.com/registry/packages/databricks/api-docs/job
# This job uses the most recent Databricks Runtime long-term support (LTS)
# runtime programmatic version ID at the time this article was first published,
# which is 14.3.x-scala2.12. You can replace this with a later version.
job = Job(
resource_name = f"{resource_prefix}-job",
name = f"{resource_prefix}-job",
tasks = [
JobTaskArgs(
task_key = f"{resource_prefix}-task",
new_cluster = JobNewClusterArgs(
num_workers = 1,
spark_version = "14.3.x-scala2.12",
node_type_id = node_type
),
notebook_task = JobNotebookTaskArgs(
notebook_path = f"{user_home_path}/Pulumi/{resource_prefix}-notebook.py"
)
)
],
email_notifications = JobEmailNotificationsArgs(
on_successes = [ user_email_address ],
on_failures = [ user_email_address ]
)
)
# Export the URL of the Job, so that you can easily browse to it later.
# See https://www.pulumi.com/docs/intro/concepts/stack/#outputs
pulumi.export('Job URL', job.url) -
resource-prefix
という名前の設定値を定義し、次のコマンドを実行して、ハードコードされた値pulumi-demo
に設定します。Pulumi は、この構成値を使用して、ノートブックとジョブに名前を付けます。Bashpulumi config set resource-prefix "pulumi-demo"
Pulumi は、
__main__.py
ファイルと同じディレクトリにPulumi.dev.yaml
という名前のファイルを作成し、この YAML ファイルに次のコードを追加します。YAMLconfig:
pulumi-demo:resource_prefix: pulumi-demo構成値を使用すると、コードのモジュール化と再利用性を高めることができます。 これで、他のユーザーが
__main__.py
ファイルを再利用し、__main__.py
ファイルの内容を変更せずにresource_prefix
変数に別の値を定義できるようになります。 -
node-type
という名前の設定値を定義し、次のコマンドを実行して、次のハードコードされた値に設定します。Pulumi は、この構成値を使用して、ジョブが実行されるクラスターのタイプを判別します。Bashpulumi config set node-type "n1-standard-4"
Pulumi.dev.yaml
ファイルの内容は、次のようになります。YAMLconfig:
pulumi-demo:node-type: n1-standard-4
pulumi-demo:resource-prefix: pulumi-demo -
Pulumi が Databricks ワークスペースで認証できるようにするには、関連するコマンドを実行して Databricks 固有の構成値を定義します。 たとえば、Databricks 個人用アクセス トークン認証の場合は、次のコマンドを実行します。 これらのコマンドでは、次のようになります。
-
<workspace-instance-url>
をワークスペース インスタンスの URL に置き換えます (例:https://1234567890123456.7.gcp.databricks.com
)。 -
<access-token>
をアクセス トークンの値に置き換えます。必ず--secret
オプションを指定してください。 これにより、Pulumi はセキュリティのベストプラクティスとしてアクセストークンを暗号化するように指示されます。
-
デフォルトでは、Pulumi は Pulumi サービスによって管理されるスタックごとの暗号化キーと値ごとのソルトを使用して値を暗号化します。 別の暗号化プロバイダーを使用するには、Pulumi ドキュメントの 「シークレット暗号化の設定 」を参照してください。
pulumi config set databricks:host "<workspace-instance-url>"
pulumi config set databricks:token "<access-token>" --secret
Pulumi.dev.yaml
ファイルの内容は、次のようになります。
config:
databricks:host: <your-workspace-instance-url>
databricks:token:
secure: <an-encrypted-version-of-your-access-token>
pulumi-demo:node-type: n1-standard-4
pulumi-demo:resource_prefix: pulumi-demo
別の Databricks 認証の種類を使用するには、 要件を参照してください。 GitHub の Pulumi Databricks リポジトリの構成も参照してください 。
ステップ 3: リソースをデプロイする
このステップでは、Pulumi Python プロジェクト テンプレートの実行の一部として、Pulumi がプロジェクトに提供する Python 仮想環境 をアクティブ化します。 この仮想環境は、正しいバージョンの Python、Pulumi、および Pulumi Databricks リソース プロバイダーを一緒に使用していることを確認するのに役立ちます。 Python仮想環境フレームワークには、 venv、 virtualenv、 pipenvなど、いくつかのものがあります。 この記事と Pulumi Python プロジェクト テンプレートでは、 venv
. venv
はすでに Python に含まれています。 詳細については、「 仮想環境の作成」を参照してください。
-
Python 仮想環境をアクティブ化するには、オペレーティング システムとシェルの種類に応じて、
pulumi-demo
ディレクトリから次のコマンドを実行します。プラットフォーム
Shell
仮想環境をアクティブ化するコマンド
Unix、Linux、macOS
bash/zsh
source venv/bin/activate
魚
source venv/bin/activate.fish
CSH/TCSHの
source venv/bin/activate.csh
PowerShell コア
venv/bin/Activate.ps1
Windows
cmd.exe
venv\Scripts\activate.bat
PowerShell
venv\Scripts\Activate.ps1
-
次のコマンドを実行して、 Python パッケージ インデックス (PyPI) から 仮想環境にPulumi Databricks リソース プロバイダー をインストールします。
Bashpip install pulumi-databricks
pip
のインストールによっては、pip
の代わりに pip3
を使用する必要がある場合があります。その場合は、この記事全体でpip3
を pip
に置き換えてください。
-
Pulumi が作成するリソースをプレビューするには、次のコマンドを実行します。
Bashpulumi preview
エラーが報告された場合は、エラーを修正してから、コマンドを再度実行してください。
PulumiアカウントでPulumiが何をするかについての詳細なレポートをオンラインで表示するには、表示される View Live リンクをコピーして、Webブラウザのアドレスバーに貼り付けます。
-
次のコマンドを実行して、リソースを作成し、Databricks ワークスペースにデプロイします。
Bashpulumi up
-
この更新を実行するように求められたら、上矢印キーを押して [はい ] に移動し、 Enter キーを押します。 エラーが報告された場合は、エラーを修正してから、コマンドを再度実行してください。
-
Pulumi アカウントで Pulumi の行動に関する詳細なレポートをオンラインで表示するには、表示される View Live リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
ステップ 4: リソースを操作する
この手順では、 Databricks ワークスペースでジョブを実行し、指定したノートブックを実行します。
- ジョブが実行するノートブックをワークスペースで表示するには、表示される ノートブック URL リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
- ノートブックを実行するジョブをワークスペースで表示するには、表示される ジョブ URL リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
- ジョブを実行するには、ジョブ ページの [今すぐ実行 ] ボタンをクリックします。
- ジョブの実行が終了したら、ジョブの実行結果を表示するには、ジョブ ページの [完了した実行 (過去 60 日間)] リストで、[ 開始時刻 ] 列の最新の時刻エントリをクリックします。 [出力 ] ウィンドウには、ノートブックのコードを実行した結果が表示され、1 から 10 までの数値が出力されます。
(オプション)ステップ 5: リソースに変更を加える
このオプションのステップでは、ノートブックのコードを変更し、変更したノートブックを再デプロイしてから、ジョブを使用して変更したノートブックを再実行します。
ノートブックに変更を加えない場合は、「 ステップ 6: クリーンアップ」に進んでください。
-
__main.py__
ファイルに戻り、次のコード行を変更します。Pythoncontent_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
これに、ファイルを保存します。
Pythoncontent_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")この変更により、ノートブックは 1 から 10 までの数字ではなく、指定された DataFrame の内容を印刷するように指示されます。
data
で始まり ''').decode("UTF-8")
で終わるコード行が、コード エディターの端に揃っていることを確認します。そうしないと、Pulumi はノートブックに追加の空白を挿入し、新しい Python コードの実行に失敗する可能性があります。
-
必要に応じて、Pulumi が変更するリソースをプレビューするには、次のコマンドを実行します。
Bashpulumi preview
エラーが報告された場合は、エラーを修正してから、コマンドを再度実行してください。
PulumiアカウントでPulumiが何をするかについての詳細なレポートをオンラインで表示するには、表示される View Live リンクをコピーして、Webブラウザのアドレスバーに貼り付けます。
-
次のコマンドを実行して、リソースの変更を Databricks ワークスペースにデプロイします。
Bashpulumi up
-
この更新を実行するように求められたら、上矢印キーを押して [はい ] に移動し、 Enter キーを押します。 エラーが報告された場合は、エラーを修正してから、コマンドを再度実行してください。
-
Pulumi アカウントで Pulumi の行動に関する詳細なレポートをオンラインで表示するには、表示される View Live リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
-
ワークスペースで変更されたノートブックを表示するには、表示される ノートブック URL リンクをコピーして、Web ブラウザーのアドレス バーに貼り付けます。
-
変更したノートブックでジョブを再実行するには、表示される ジョブURL リンクをコピーして、Webブラウザーのアドレスバーに貼り付けます。 次に、ジョブページの「 今すぐ実行 」ボタンをクリックします。
-
ジョブの実行が終了したら、ジョブの実行結果を表示するには、ジョブ ページの [完了した実行 (過去 60 日間)] リストで、[ 開始時刻 ] 列の最新の時刻エントリをクリックします。 [出力 ] ウィンドウには、ノートブックのコードを実行した結果が表示され、指定した DataFrame の内容が出力されます。
ステップ 6: クリーンアップ
この手順では、ノートブックとジョブを Databricks ワークスペースから削除し、 pulumi-demo
プロジェクトとその dev
スタックを Pulumi アカウントからオンラインで削除するように Pulumi に指示します。
-
次のコマンドを実行して、Databricks ワークスペースからリソースを削除します。
Bashpulumi destroy
-
この削除を実行するように求められたら、上矢印キーを押して [はい ] に移動し、 Enter キーを押します。
-
次のコマンドを実行して、Pulumi
pulumi-demo
プロジェクトとそのdev
スタックを Pulumi アカウントからオンラインで削除します。Bashpulumi stack rm dev
-
この削除を実行するように求められたら、「
dev
」と入力して Enter キーを押します。 -
venv
Python 仮想環境を非アクティブ化するには、次のコマンドを実行します。Bashdeactivate
テスティング
Pulumi プロジェクトは、デプロイする前にテストできます。 Pulumi ドキュメントの Pulumi プログラムのテストを参照してください。
Python ベースの Pulumi プロジェクトの単体テストでは、Python テスト フレームワークの unittest と Pulumi パッケージの pulumi.runtime 名前空間を使用して、単体テストを記述して実行できます。 シミュレートされたリソースに対してテストを実行するには、Pulumi (および Databricks) の呼び出しをモックに置き換えます。 Pulumi ドキュメントの「Pulumi プログラムのユニット テスト」を参照してください。
次の infra.py
という名前のサンプル ファイルは、この記事の main.py
ファイルで宣言されたノートブックとジョブの実装をモックしています。 この例のユニット テストでは、ノートブックの Base64 でエンコードされたコンテンツ、ジョブの名前、および成功したジョブ実行の Eメール 受信者がすべて期待値を返すかどうかを確認します。 そのため、ここでは、関連するプロパティのみが例の値でモックされます。 また、必要なリソース プロパティ値は、単体テストで使用する予定がない場合でも、常に指定する必要があります。 この例では、これらの必須値はランダムな my-mock-
値に設定され、それらの値はテストされません。
# infra.py
from pulumi_databricks import (
Notebook,
Job,
JobEmailNotificationsArgs
)
notebook = Notebook(
resource_name = 'my-mock-notebook-resource-name',
path = 'my-mock-notebook-path',
content_base64 = 'ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp'
)
job = Job(
resource_name = 'my-mock-job-resource-name',
name = 'pulumi-demo-job',
email_notifications = JobEmailNotificationsArgs(
on_successes = [ 'someone@example.com' ]
)
)
次のサンプル ファイル test_main.py
、関連するプロパティが期待値を返すかどうかをテストします。
# test_main.py
import pulumi
from pulumi_databricks import *
import unittest
import infra
# Set up mocking.
class MyMocks(pulumi.runtime.Mocks):
def new_resource(self, type_, name, inputs, provider, id_):
return [name + '_id', inputs]
def call(self, token, args, provider):
return {}
pulumi.runtime.set_mocks(MyMocks())
class TestNotebookAndJob(unittest.TestCase):
@pulumi.runtime.test
def test_notebook(self):
def check_notebook_content_base64(args):
content_base64 = args
# Does the notebook's Base64-encoded content match the expected value?
self.assertIn('ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp', content_base64)
# Pass the mocked notebook's content_base64 property value to the test.
return pulumi.Output.all(infra.notebook.content_base64).apply(check_notebook_content_base64)
@pulumi.runtime.test
def test_job(self):
def check_job_name_and_email_onsuccesses(args):
name, email_notifications = args
# Does the job's name match the expected value?
self.assertIn('pulumi-demo-job', name)
# Does the email address for successful job runs match the expected value?
self.assertIn('someone@example.com', email_notifications['on_successes'])
# Pass into the test the mocked job's property values for the job's name
# and the job's email address for successful runs.
return pulumi.Output.all(
infra.job.name,
infra.job.email_notifications
).apply(check_job_name_and_email_onsuccesses)
これらのテストを実行し、そのテスト結果を表示するには、Pulumi プロジェクトのルート ディレクトリから次のコマンドを実行します。
python -m unittest
実行できる他の種類のテストに関する情報については、Pulumi ドキュメントの次の記事を参照してください。