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

チュートリアル: アプリを Lakebase オートスケールに接続する

備考

Lakebase オートスケールは次のリージョンで利用できます: us-east-1us-east-2eu-central-1eu-west-1eu-west-2ap-south-1ap-southeast-1ap-southeast-2

Lakebase オートスケールは、オートスケール コンピュート、ゼロへのスケール、分岐、即時復元を備えた Lakebase の最新バージョンです。 Lakebase プロビジョニングとの機能の比較については、 「バージョン間の選択」を参照してください。

このチュートリアルでは、資格情報の自動ローテーションを使用してDatabricksアプリを Lakebase オートスケールに接続する方法を示します。 アプリは、有効期限が切れる前に、Databricks から新しいデータベース資格情報を生成します。この例では Flask を使用していますが、認証パターンはどのフレームワークにも適用されます。

仕組み

Databricks Apps 1 時間後に期限切れになるOAuthタグを使用して Lakebase に対して認証します。 これに対処するには、アプリのサービスプリンシパルの Postgres ロールを作成し、データベースに接続する必要があるたびに新しいウイルスを自動的に生成するようにアプリを構成します。 これは接続プール パターンを通じて行われます。プールは必要に応じて新しいトークンを使用して新しい接続を作成するため、アプリは期限切れの資格情報を使用することはありません。

アプリをDatabricksにデプロイすると、アプリはそのサービス プリンシパルとして実行され、その ID 用の仮想マシンが生成されます。 ローカルでテストする場合、アプリは Databricks ユーザー アカウントとして実行され、トークンが生成されます。どちらも同じトークンローテーションコードを使用します。認証コンテキストのみが変更されます。

始める前に

このチュートリアルを完了するには、次のものが必要です。

  • Lakebase Postgres オートスケールが有効になっているDatabricksワークスペースへのアクセス (アプリ スイッチャーに Lakebase が表示されない場合は、ワークスペース管理者に問い合わせてください)
  • Databricks Appsを作成する権限
  • PythonとSQLの基本的な知識
  • ローカル開発用にDatabricks CLI をインストールしました
  • Python 3.9以降がローカルにインストールされている

ステップ 1: アプリとデータベースを作成する

まず、Databricks アプリと Lakebase プロジェクトの両方を作成します。アプリは、データベース認証に使用するサービスプリンシパル ID を自動的に取得します。

アプリを作成する

Flask Hello World テンプレートを使用して新しい Databricks アプリを作成します (ワークスペースで + 新規 > アプリ )。詳細な手順については、 「Databricks アプリを作成する」を参照してください。

インストール後、アプリの 環境 タブに移動し、 DATABRICKS_CLIENT_ID値 ( 6b215d2b-f099-4bdb-900a-60837201ececのような UUID 形式) をメモします。これは、OAuth 認証用のアプリの Postgres ユーザー名になります。

注記

アプリをまだデプロイしないでください。最初にデータベース接続を構成します。

データベースを作成する

データベースをホストするための新しい Lakebase オートスケール プロジェクトを作成します。 クリックアプリアイコン。右上隅の [アプリ][Lakebase] を選択し、希望の名前 (たとえば、 my-app-db ) と Postgres バージョン (デフォルトの Postgres 17 を受け入れます) を使用して新しいプロジェクトを作成します。完全なセットアップの詳細については、 「プロジェクトの作成」を参照してください。

コンピュートがアクティブになるまで (約 1 分) 待ってから続行してください。

ステップ 2: データベース認証とスキーマを構成する

OAuth認証を使用してアプリのサービスプリンシパル用の Postgres ロールを作成し、アプリで表示するデータを含むサンプル テーブルを作成します。

OAuth認証を設定する

Lakebase プロジェクトで、SQL エディターを開き、次のコマンドを実行します。databricks_auth拡張機能により OAuth 認証が有効になり、Postgres ロールが従来のパスワードの代わりに Databricks トークンを受け入れることができるようになります。

SQL
-- Enable the Databricks authentication extension
CREATE EXTENSION IF NOT EXISTS databricks_auth;

-- Create a Postgres role for your app's service principal
-- Replace the UUID below with your DATABRICKS_CLIENT_ID from Step 1
SELECT databricks_create_role('<DATABRICKS_CLIENT_ID>', 'service_principal');

-- Grant necessary permissions (use the same DATABRICKS_CLIENT_ID)
GRANT CONNECT ON DATABASE databricks_postgres TO "<DATABRICKS_CLIENT_ID>";
GRANT CREATE, USAGE ON SCHEMA public TO "<DATABRICKS_CLIENT_ID>";

<DATABRICKS_CLIENT_ID>アプリのDATABRICKS_CLIENT_ID値に置き換えます。サービスプリンシパルは、 Databricksが自動的に管理するOAuthを使用して認証できるようになりました。 詳細については、 「Databricks ID の OAuth ロールを作成する」を参照してください。

データベーススキーマを作成する

サービスプリンシパルの明示的な権限を持つサンプルテーブルを作成します (サービスプリンシパルは当然スキーマ権限を継承しません)。

SQL
-- Create a sample table
CREATE TABLE notes (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Grant permissions to your app's service principal (use your DATABRICKS_CLIENT_ID)
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE notes TO "<DATABRICKS_CLIENT_ID>";

-- Insert sample data
INSERT INTO notes (content) VALUES
('Welcome to Lakebase Autoscaling!'),
('This app connects to Postgres'),
('Data fetched from your database');

<DATABRICKS_CLIENT_ID> DATABRICKS_CLIENT_ID値に置き換えます。

ステップ 3: アプリケーションを構築して構成する

アプリ ファイルをダウンロードし、自動 OAuth トークン ローテーションを使用してデータベース接続を構成し、デプロイする前にローカルでテストします。

アプリファイルをダウンロードして設定する

アプリの「 ファイルの同期」 セクションからエクスポート コマンドをコピーして、ワークスペースからアプリ ファイルをダウンロードします。

Bash
databricks workspace export-dir /Workspace/Users/<your-email>/databricks_apps/<app-folder>/flask-hello-world-app .

データベース接続の詳細を追加するには、 app.yamlを編集します。Lakebase Connect モーダルから接続値 のみ を選択して、接続値を取得します。

YAML
command: ['flask', '--app', 'app.py', 'run', '--host', '0.0.0.0', '--port', '8000']

env:
- name: PGHOST
value: '<your-endpoint-hostname>'
- name: PGDATABASE
value: 'databricks_postgres'
- name: PGUSER
value: '<DATABRICKS_CLIENT_ID>'
- name: PGPORT
value: '5432'
- name: PGSSLMODE
value: 'require'
- name: ENDPOINT_NAME
value: 'projects/<project-id>/branches/<branch-id>/endpoints/<endpoint-id>'

プレースホルダーを置き換えます:

  • <your-endpoint-hostname> : Connect モーダルから PGHOST 値をコピーします (例: ep-xyz.database.us-west-2.dev.databricks.com )
  • <DATABRICKS_CLIENT_ID> : ステップ 1 のDATABRICKS_CLIENT_IDを使用します
  • projects/<project-id>/branches/<branch-id>/endpoints/<endpoint-id> : databricks postgres list-endpointsを実行し、 nameフィールドの値をコピーします (形式: projects/<uuid>/branches/<uuid>/endpoints/<id> )

OAuthローテーションとデータベース クエリを実装する

app.pyこのコードに置き換えます。これにより、2 つの重要な変更が実装されます。認証のための自動OAuthノート ローテーションと、ステップ 2 で作成したメモを取得して表示するデータベース クエリです。

Python
import os
from databricks.sdk import WorkspaceClient
import psycopg
from psycopg_pool import ConnectionPool
from flask import Flask

app = Flask(__name__)

# Initialize Databricks client for token generation
w = WorkspaceClient()

# Custom connection class that generates fresh OAuth tokens
class OAuthConnection(psycopg.Connection):
@classmethod
def connect(cls, conninfo='', **kwargs):
# Generate a fresh OAuth token for each connection
endpoint_name = os.environ["ENDPOINT_NAME"]
credential = w.postgres.generate_database_credential(endpoint=endpoint_name)
kwargs['password'] = credential.token
return super().connect(conninfo, **kwargs)

# Configure connection parameters
username = os.environ["PGUSER"]
host = os.environ["PGHOST"]
port = os.environ.get("PGPORT", "5432")
database = os.environ["PGDATABASE"]
sslmode = os.environ.get("PGSSLMODE", "require")

# Create connection pool with automatic token rotation
pool = ConnectionPool(
conninfo=f"dbname={database} user={username} host={host} port={port} sslmode={sslmode}",
connection_class=OAuthConnection,
min_size=1,
max_size=10,
open=True
)

@app.route('/')
def hello_world():
# Use connection from pool (automatically gets fresh token)
with pool.connection() as conn:
with conn.cursor() as cur:
cur.execute("SELECT content, created_at FROM notes ORDER BY created_at DESC LIMIT 5")
notes = cur.fetchall()

# Display results
notes_html = "<ul>" + "".join([f"<li>{note[0]} - {note[1]}</li>" for note in notes]) + "</ul>"
return f'<h1>Hello from Lakebase!</h1><h2>Recent Notes:</h2>{notes_html}'

if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000)

このコードは、次の 3 つの主要コンポーネントを使用して、データベース資格情報の自動ローテーションを実装します。

  • WorkspaceClient : Databricks SDK 経由で新しいデータベース資格情報を生成します
  • OAuthConnection クラス : 新しい接続ごとに新しい資格情報を挿入するカスタム接続クラス
  • ConnectionPool : データベース接続を管理し、接続を作成するときにカスタム接続クラスを呼び出します。

このパターンにより、アプリが常に有効なデータベース資格情報を持つことが保証されます。 資格情報のローテーションの仕組み、さまざまなローテーション戦略、およびエラー処理の詳細については「Lakebase でのトークンのローテーション」を参照してください。

必要なパッケージを含めるようにrequirements.txtを更新します:

Txt
flask
psycopg[binary,pool]
databricks-sdk>=0.81.0

最小 SDK バージョン (0.81.0) では、 generate_database_credential()メソッドが OAuth トークン生成に使用できるようになります。

ローカルでテストする

デプロイする前に、アプリをローカルでテストして、データベース接続が機能することを確認します。ローカルでテストする場合、アプリはDatabricksユーザー アカウント (サービスプリンシパルではありません) として実行されるため、以下の環境変数のPGUSER自分の電子メール アドレスに変更する必要があります。

ワークスペースに認証し、環境変数をエクスポートします。

Bash
databricks auth login

export PGHOST="<your-endpoint-hostname>"
export PGDATABASE="databricks_postgres"
export PGUSER="your.email@company.com" # Use YOUR email for local testing, not the service principal
export PGPORT="5432"
export PGSSLMODE="require"
export ENDPOINT_NAME="<your-endpoint-name>"

app.yamlから値をコピーしますが、 PGUSER値 (サービスプリンシパル クライアント ID) をDatabricks電子メール アドレスに置き換えます。

依存関係をインストールしてアプリを実行します。

Bash
pip3 install --upgrade -r requirements.txt
python3 app.py

ブラウザでhttp://localhost:8000を開きます。3 つのサンプル ノートとともに「Hello from Lakebase!」が表示されます。接続プールは、新しい接続を作成するときに、新しい OAuth トークンを自動的に生成します。詳細については、 「Lakebase での認証」を参照してください。

ローカル アプリの出力に「Hello from Lakebase!」と最近のメモが表示される

ステップ 4: デプロイと検証

ローカルでテストした後、変更をワークスペース フォルダーに同期し、その場所からデプロイします。

Bash
# Upload files to workspace
databricks sync . /Workspace/Users/<your-email>/my-lakebase-app

# Deploy from the uploaded location
databricks apps deploy <app-name> --source-code-path /Workspace/Users/<your-email>/my-lakebase-app

<your-email> Databricksの電子メール アドレスに置き換え、 <app-name>アプリ名に置き換えます。 --source-code-pathフラグは、アプリのデフォルトの場所ではなく、アップロードされたファイルを使用するようにデプロイメントに指示します。

デプロイが完了するまで(2 ~ 3 分)待ってから、指定された URL でアプリにアクセスします。サンプルノートに「Hello from Lakebase!」と表示されます。

参照