はじめに
こちらのドキュメントの内容をDatabricks Free Editionで動かしてみます。
Databricks Appsを使うと、対話型アプリケーションをDatabricksワークスペースに直接構築してデプロイできます。ここにLakebase (フルマネージドPostgres) をリソースとして追加すると、アプリにトランザクショナルなバックエンドが与えられます。ポイントは、Databricksがアプリ用のサービスプリンシパルを作成し、対応するPostgresロールを付与し、接続情報を環境変数としてアプリに挿入してくれるところです。つまり、資格情報や接続文字列を一切管理せずに、アプリからPostgresデータベースに接続できます。
今回はFlaskテンプレートを使って、Lakebaseに接続されたToDoアプリをデプロイし、最後にUnity Catalog経由でレイクハウスデータと一緒にクエリするところまでやってみます。これらすべてがFree Editionで動きます。
前提条件
- Databricks Free Editionのアカウント。お持ちでない場合はこちらからサインアップできます
- Free EditionではLakebaseとサーバレスコンピューティングが最初から有効になっているので、追加の設定は不要です
ステップ1: Lakebaseインスタンスのプロビジョニング
Lakebaseプロジェクトは、アプリがリソースとして接続するマネージドPostgresインスタンスです。プロジェクトはブランチに編成され、各ブランチが独立したデータベース環境を表します。Gitのブランチのような感覚でデータベース環境を扱えるのが面白いところです。
Postgresデータベースを取得するの手順に従ってLakebaseプロジェクトを作成します。プロジェクトを作成すると、productionブランチとdatabricks_postgresデータベースが用意されます。
ステップ2: Databricksアプリを作成する
Lakebase統合を示すオートスケールアプリテンプレートは、Dash、Flask、Streamlitの3つが提供されています。いずれもToDoアプリです。今回はFlaskを使います。
- ワークスペースのアプリスイッチャーで Databricks Apps を選択します
- 「+ アプリを作成」 をクリックします
- データベース タブから Lakebase Autoscaling app Flask テンプレートを選択します
ステップ3: データベースリソースを構成する
Lakebaseをリソースとして追加すると、適切なデータベース権限を持つサービスプリンシパルが作成され、接続情報が環境変数としてアプリに挿入されます。これによって、コードに接続文字列を書くことなくテンプレートが自動的にデータベースに接続できます。
「設定」 ステップでは以下を設定します。
- アプリのリソース で、Lakebaseのプロジェクト、ブランチ、データベースを選択します。ブランチ名はIDとして表示されるので、名前と照合したい場合はプロジェクトのブランチページを確認してください
- コンピュートサイズ には 「中」 を選択します。これはLakebaseのデータベースコンピュートとは別のアプリサーバーコンピュートを制御し、独立してスケーリングします
詳細はDatabricksアプリにLakebaseリソースを追加するをご覧ください。
ステップ4: 承認を確認する
Databricksの各アプリは、個々のユーザーとは切り離された専用のIDであるサービスプリンシパルとして実行されます。Lakebaseをリソースとして接続すると、そのサービスプリンシパルに対応するPostgresロールが作成され、データベースへのアクセス権が付与されます。手動でのロール設定は不要です。
ステップ5: アプリに名前を付けて作成する
Lakebaseはアプリ名を使って、{app-name}_schema_{service-principal-id} (IDからハイフンを削除) の形式でスキーマ名を生成します。アプリ名は作成後に変更できませんが、スキーマ名は後から変更できます。テンプレートのデフォルトはlakebase-autoscaling-appです。
「アプリを作成」 をクリックします。
ステップ6: アプリをデプロイする
アプリを作成するとコンピュートが自動的に起動し、約2〜3分でデプロイが完了します。アプリの状態が 「実行中」 になったら、横に表示されるURLをクリックしてアプリを開きます。
ステップ7: 統合を確認する
アプリからToDoをいくつか追加してみます。その後、Lakebaseプロジェクトで 「テーブル」 を開き、アプリのスキーマ配下のtodosテーブルを選択すると、アプリのサービスプリンシパルが書き込んだ行を確認できます。
データを直接クエリするには、LakebaseプロジェクトのSQLエディタを使います。こちらのSQLエディタはPostgresに直接接続しているため、テーブルの指定方法がDatabricks SQLとは異なる点に注意してください。カタログ名は不要でスキーマ.テーブルの2階層で指定し、スキーマ名にハイフンが含まれる場合はバッククォートではなく ダブルクォート で囲みます。
SELECT * FROM "lakebase-autoscaling-app_schema_aeb6ff9198ff4752af7dfc6d4cf570d0".todos;
スキーマ名が分からない場合は、以下で一覧を確認できます。
SELECT schema_name FROM information_schema.schemata;
なお、Lakebaseはアイドル時にゼロまでスケールダウンするため、しばらく停止した後の最初のクエリは応答に数秒かかることがあります。その他の接続オプションはデータベースへの接続をご覧ください。
ステップ8: Unity Catalog経由でクエリする
デフォルトでは、アプリのLakebaseデータにはPostgres接続経由で直接アクセスします。Unity Catalogに登録すると、標準のDatabricks SQLを使ってレイクハウスデータと一緒にクエリできるようになります。同じクエリの中でアプリのトランザクションテーブルとDeltaテーブルを結合できるということです。
Catalog Explorerを開いて新しいカタログを作成します。カタログタイプとして Lakebase Postgres を選択し、オートスケール を選択して、アプリと同じプロジェクトとブランチを指定します。詳細はLakebaseデータベースをUnity Catalogに登録するをご覧ください。
こちらはPostgresではなくDatabricks SQLでのクエリになるため、カタログ.スキーマ.テーブルの3階層で指定します。Unity Catalogのスキーマ名は、アプリ名に含まれるハイフンを保持する点に注意してください。カタログ名とスキーマ名はどちらもバッククォートで囲む必要があります。
SELECT * FROM `your-catalog-name`.`lakebase-autoscaling-app_schema_aeb6ff9198ff4752af7dfc6d4cf570d0`.todos;
おわりに
Free Editionでも、Lakebaseをバックエンドに持つDatabricks Appsをテンプレートから数分でデプロイできました。接続文字列やロール管理を意識せずにマネージドPostgresが使え、さらにUnity Catalogに登録すればレイクハウスデータとの結合まで一気通貫でできるのは便利です。ぜひお試しください。











