
Cross-cloud Lakehouse で Databricks Unity Catalog の Iceberg テーブルを BigQuery から参照してみた
はじめに
Google Cloud の Google Cloud Lakehouse(旧 BigLake)のカタログフェデレーション機能による AWS 上の Databricks Unity Catalog に存在する Iceberg テーブルの BigQuery からのクエリを試してみましたので、その際の手順を本記事でまとめます。
Google Cloud Lakehouse のクロスクラウド連携
Google Cloud Lakehouse(ドキュメントでは Lakehouse for Apache Iceberg との記載もあります)は、Google Cloud 上で Apache Iceberg 形式のテーブルを管理・参照するための機能です。2026年4月に BigLake から名称が変更されました。
また同時期に Cross-cloud Lakehouse という機能が現在プレビューとなっています。
この機能により、他クラウドプロバイダー(AWS 上の Databricks Unity Catalog など)に存在する Iceberg テーブルを、データの移行や ETL 処理を行うことなく Google Cloud から直接クエリできるようになっています。
Google Cloud Lakehouse(Lakehouse for Apache Iceberg)のドキュメント
Cross-cloud Lakehouse のドキュメント
Google Cloud Lakehouse のリリースノート
執筆時点で Cross-cloud Lakehouseでは、AWS の 外部ロケーションまたは の Google Cloud外部ロケーションを使用する Databricks Unity Catalog カタログのみがサポートされています。
主なポイントは以下の通りです。
- BigQuery から Unity Catalog 上の Iceberg テーブルを直接クエリでき、データの移行や複雑な ETL 処理は不要
- Databricks 側の OAuth クライアントシークレットを Google Cloud の Secret Manager に保管し、BigLake のサービスアカウントがそれを参照してフェデレーションを行う
- UniForm 有効化済みの Delta テーブルもクエリ可能
本機能については、以下の記事でも紹介されていますので、あわせてご参照ください。
また、Databricks 側でも Google Cloud の Lakehouse フェデレーションがプライベートプレビューとなっています。
前提条件
検証環境
以下の環境を使用しています。
- Databricks
- Free Editio
- AWS 上の Unity Catalog(リージョン:
us-east-2)
- Google Cloud:リージョン
us-east5 - ストレージ:AWS S3(外部ロケーション用)
AWS us-east-2(オハイオ)に最も近い Google Cloud リージョンは us-east5のため、後述のする Secret Manager・フェデレーションカタログのリージョンも揃えて us-east5 に設定しています。
なお、本記事の検証環境では Cross-Cloud Interconnect(CCI)は設定していません。
上記ドキュメントでは、大規模データを扱う場合はパフォーマンスの観点から Low Latency Dedicated または Partner CCI に該当するリージョンの利用が推奨されていますが、本記事では CCI を構成していない通常のパブリックインターネット経由での接続による動作確認となります。
事前準備
Databricks 側では、外部ロケーションを作成済みで、Unity Catalog 上に Iceberg テーブルを定義できる状態としています。本記事では main カタログ配下にスキーマを作成しテーブルを配置します。
外部ロケーションの作成手順は以下をご参照ください。
Databricks 側の設定
OAuth クライアントの作成
Google Cloud 側から Unity Catalog にアクセスするための OAuth クライアントを Databricks 上で作成します。アカウントコンソールから OAuth クライアントを追加し、Client ID とシークレットを取得しておきます。

シークレット生成画面で発行されるシークレットは作成時にしか表示されないため、控えておきます。

Iceberg テーブルの作成
Databricks 上で外部ロケーションを使用した Managed Iceberg テーブルを作成し、サンプルレコードを追加します。
-- スキーマを作成
CREATE SCHEMA IF NOT EXISTS main.iceberg_external
MANAGED LOCATION 's3://<バケット名>/iceberg_tables/';
-- Managed Iceberg テーブルを作成
CREATE TABLE main.iceberg_external.sales_data
(
sale_id BIGINT,
sale_ts TIMESTAMP,
amount DECIMAL(10,2),
region STRING
)
USING ICEBERG;
-- サンプルレコードを追加
INSERT INTO main.iceberg_external.sales_data
(sale_id, sale_ts, amount, region)
VALUES
(1001, TIMESTAMP '2025-12-01 10:30:00', 15000.50, 'Tokyo'),
(1002, TIMESTAMP '2025-12-01 11:45:00', 8500.00, 'Osaka'),
(1003, TIMESTAMP '2025-12-01 14:20:00', 12300.75, 'Tokyo'),
(1004, TIMESTAMP '2025-12-02 09:15:00', 22000.00, 'Nagoya'),
(1005, TIMESTAMP '2025-12-02 13:50:00', 9800.25, 'Fukuoka');
SELECT * FROM main.iceberg_external.sales_data ORDER BY sale_id;

サービスプリンシパルへの権限付与
OAuth クライアント(サービスプリンシパル)に対し、カタログ・スキーマ・テーブルへのアクセス権限と、外部クライアントから Iceberg として参照するために必要な EXTERNAL USE SCHEMA 権限を付与します。
GRANT USE CATALOG ON CATALOG main TO `<アプリケーションID>`;
GRANT USE SCHEMA ON SCHEMA main.iceberg_external TO `<アプリケーションID>`;
GRANT SELECT ON TABLE main.iceberg_external.sales_data TO `<アプリケーションID>`;
-- サービスプリンシパルに EXTERNAL USE SCHEMA 権限を付与
GRANT EXTERNAL USE SCHEMA ON SCHEMA main.iceberg_external
TO `<アプリケーションID>`;
Google Cloud 側の設定
Google Cloud 側の設定手順は以下に記載があるので、こちらに沿って進めます。
API の有効化
BigLake と Secret Manager の API を有効化します。
gcloud services enable biglake.googleapis.com secretmanager.googleapis.com
Secret Manager にシークレットを作成
Databricks の OAuth クライアント ID・シークレットを Secret Manager に保管します。あわせてフェデレーションカタログを作成するリージョンと揃えるため、Secret Manager のリージョンは us-east5 を指定しています。
# 変数の設定
PROJECT_ID="<プロジェクトID>"
REGION="us-east5"
SECRET_NAME="databricks-secret"
CATALOG_NAME="federated-catalog"
UNITY_INSTANCE="<Databricks ワークスペースのホスト名>"
UNITY_CATALOG="main" # ここではmain
# credentials.json を作成
cat > credentials.json << EOF
{
"client_id": "<Client ID>",
"client_secret": "<Client Secret>"
}
EOF
# リージョンエンドポイントを設定(カタログと同じリージョンにする)
gcloud config set api_endpoint_overrides/secretmanager \
https://secretmanager.${REGION}.rep.googleapis.com/
# シークレットを作成
gcloud secrets create ${SECRET_NAME} \
--location="${REGION}" \
--project="${PROJECT_ID}" \
--data-file=credentials.json
フェデレーションカタログを作成
gcloud alpha biglake iceberg catalogs create でフェデレーションカタログを作成します。--federated-catalog-type に unity を指定し、Unity Catalog のインスタンス名・カタログ名・Secret Manager のシークレットを指定します。
gcloud alpha biglake iceberg catalogs create ${CATALOG_NAME} \
--project="${PROJECT_ID}" \
--primary-location="${REGION}" \
--catalog-type="federated" \
--federated-catalog-type="unity" \
--secret-name="projects/${PROJECT_ID}/locations/${REGION}/secrets/${SECRET_NAME}" \
--unity-instance-name="${UNITY_INSTANCE}" \
--unity-catalog-name="${UNITY_CATALOG}" \
--refresh-interval="5m"
--refresh-interval は、フェデレーションカタログが Unity Catalog 側のメタデータを取得し直す(同期する)頻度を指定するオプションです。ここで指定した間隔で BigLake 側のカタログ情報が更新され、Databricks 側で追加・変更されたテーブルが BigQuery から参照可能になります。
ドキュメントより設定時の特徴は以下の通りです。
- 省略した場合または
0sを指定した場合、更新は無効になる - 値は
5m、5m30s、330sのような期間形式で指定する - 間隔を短くするとメタデータの鮮度は上がるが、API 呼び出しの費用が増加する可能性がある
- 間隔を長くすると費用は抑えられるが、クエリ結果が最新のデータセットを反映しない可能性がある
実行結果は以下のようになり、作成後の BigLake service account が表示されます。後述の手順でこのサービスアカウントに対してシークレットへのアクセス権を付与します。
Created catalog [projects/<プロジェクトID>/catalogs/federated-catalog].
BigLake service account: blirc-xxxxxxxxxxxxx-xxxx@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com
BigLake service account ID: xxxxxxxxxxxxxxxxxxxx
サービスアカウントにシークレットへのアクセス権を付与
サービスアカウントに対し、シークレットへの roles/secretmanager.secretAccessor を付与します。
# サービスアカウントを変数に追加
SA="blirc-xxxxxxxxxxxxx-xxxx@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com"
# リージョンエンドポイントを設定
gcloud config set api_endpoint_overrides/secretmanager \
https://secretmanager.${REGION}.rep.googleapis.com/
# アクセス権を付与
gcloud secrets add-iam-policy-binding ${SECRET_NAME} \
--project="${PROJECT_ID}" \
--location="${REGION}" \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
接続確認
権限付与後、カタログ一覧を確認します。
gcloud alpha biglake iceberg catalogs list \
--project="${PROJECT_ID}" \
--format="json"
[
{
"biglake-service-account": "blirc-xxxxxxxxxxxxx-xxxx@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com",
"catalog-type": "CATALOG_TYPE_FEDERATED",
"federated-catalog-options": {
"refresh-status": {
"start-time": "2026-05-19T13:53:40Z"
},
"secret-name": "projects/<プロジェクトID>/locations/us-east5/secrets/databricks-secret",
"unity-catalog-info": {
"catalog-name": "main",
"instance-name": "<Databricks ワークスペースのホスト名>"
}
},
"name": "projects/<プロジェクトID>/catalogs/federated-catalog",
...
}
]
その後、BigQuery のコンソール上からフェデレーションカタログ経由でテーブルが認識されていることを確認できました。

実際に SELECT 文を実行すると、Databricks 側で投入したレコードが BigQuery から取得できました。

Iceberg 読み取りを有効化した Delta テーブル(UniForm)で試してみる
Unity Catalog では、Delta Lake テーブルに対して Iceberg 読み取りを有効化する UniForm 機能があります。こちらでもフェデレーション経由で参照できるかを確認します。
Databricks 側で以下のように UniForm(delta.universalFormat.enabledFormats = 'iceberg')を有効化した Delta テーブルを作成します。
-- Iceberg 読み取りを有効化した Delta テーブル(UniForm)
CREATE OR REPLACE TABLE main.iceberg_external.products_delta (
product_id INT,
product_name STRING,
category STRING,
price DECIMAL(10,2),
created_at TIMESTAMP
)
USING DELTA
TBLPROPERTIES (
'delta.columnMapping.mode' = 'name',
'delta.enableIcebergCompatV2' = 'true',
'delta.universalFormat.enabledFormats' = 'iceberg'
);
DESCRIBE EXTENDED main.iceberg_external.products_delta;
-- サンプルデータを追加
INSERT INTO main.iceberg_external.products_delta
(product_id, product_name, category, price, created_at)
VALUES
(101, 'Laptop Pro', 'Electronics', 129800.00, TIMESTAMP '2025-12-01 09:00:00'),
(102, 'Wireless Mouse', 'Electronics', 2980.00, TIMESTAMP '2025-12-01 10:00:00'),
(103, 'Desk Chair', 'Furniture', 45000.00, TIMESTAMP '2025-12-02 11:00:00'),
(104, 'Standing Desk', 'Furniture', 78000.00, TIMESTAMP '2025-12-02 12:00:00'),
(105, 'Monitor 27"', 'Electronics', 35800.00, TIMESTAMP '2025-12-03 13:00:00');
-- サービスプリンシパルに権限付与
GRANT SELECT ON TABLE main.iceberg_external.products_delta TO `<アプリケーションID>`;
リフレッシュ後、BigQuery 側のコンソールから対象テーブルを確認すると、Iceberg 読み取りを有効化した Delta テーブル(UniForm)もフェデレーション経由で参照できることが確認できました。


参考までに、UniForm を有効化していない通常の Delta テーブルでは、フェデレーション経由でのクエリは行えませんでした。
その他、サービスプリンシパルに Modify 権限を付与し書き込み操作を試してみたのですが、BigQuery 側で下図のエラーとなり実行できませんでした。

さいごに
Lakehouse for Apache Iceberg のカタログフェデレーション機能を使用して、AWS 上の Databricks Unity Catalog にある Iceberg テーブルを Google Cloud の BigQuery から直接参照する手順を確認してみました。
こちらの内容がどなたかの参考になれば幸いです。







