
External Location上のIceberg互換Deltaテーブルを利用して、DatabricksからSnowflakeへDelta Sharingでデータ共有してみた
かわばたです。
Delta Sharing は、Databricks が開発したオープンなデータ共有プロトコルです。組織間でデータを安全に共有でき、受信側が Databricks を使っていなくても、Snowflake・Spark・pandas・Power BI などの外部プラットフォームからデータにアクセスできるのが大きな特徴です。
本記事では、Delta Sharing の基本概念を確認した上で、Databricks(AWS)から Snowflake(AWS)へ Delta Sharing でデータ共有する手順を検証します。
Snowflake は Delta Sharing のデータを Apache Iceberg REST Catalog API 経由で参照するため、Databricks 側では共有対象テーブルの保存先や Iceberg 互換設定に注意が必要です。実際に検証したところ、Databricks default storage 上のテーブルは Snowflake から参照できず、customer-managed S3 を managed location とした Unity Catalog 上のテーブルを利用する必要がありました。
そこで本記事では、External Location を使って S3 を Unity Catalog に登録し、その managed location 上に作成した Iceberg 互換 Delta テーブルを Delta Sharing で Snowflake に共有する手順を確認します。
概要
背景
企業のデータ活用が進む中、以下のようなニーズが増えています。
- 組織間・パートナー間でデータを安全に共有したい
- データのコピーや ETL パイプラインなしでデータを提供したい
- 受信側が異なるプラットフォーム(Snowflake、Spark など)を使っていても共有したい
- データガバナンスを維持したまま外部にデータを公開したい
Delta Sharing は、これらの課題を オープンプロトコル で解決します。
Delta Sharing とは
Delta Sharing は、Databricks が開発したセキュアなデータ共有のためのオープンプロトコルです。プロバイダー(データ提供者)が Unity Catalog 上で管理するデータを、レシピエント(データ受信者)に読み取り専用で共有できます。
| 用語 | 説明 |
|---|---|
| プロバイダー(Provider) | データを提供する側。Unity Catalog が有効な Databricks ワークスペースが必要 |
| レシピエント(Recipient) | データを受信する側。Databricks ユーザーでも、非 Databricks ユーザーでもよい |
| シェア(Share) | データアセットを読み取り専用でまとめたコレクション。テーブル、ビュー、ボリューム、モデル、ノートブック等を含められる |
補足: Share 自体にはテーブル、ビュー、マテリアライズドビュー、ストリーミングテーブル、ボリューム、ノートブック、AI モデル、Python UDF などを含められます。ただし、Snowflake などの外部 Iceberg クライアントから Iceberg REST Catalog API 経由で参照できるのは、主に Delta テーブル、foreign Iceberg テーブル、ビュー、マテリアライズドビュー、ストリーミングテーブルです。ボリュームやノートブック、AI モデルは外部 Iceberg クライアントからは直接参照できません。
主な特徴:
- Unity Catalog との統合によるガバナンス管理
- 受信側にデータのコピーは不要(ゼロコピーアクセス。ただし、共有対象がビュー / マテリアライズドビュー / ストリーミングテーブルの場合は、プロバイダー側でデータのマテリアライゼーションが発生する場合がある)
- 事前署名付き URL によるセキュアなデータアクセス
- 監査ログ・システムテーブルによるアクセス追跡
共有方式の比較
Delta Sharing には以下の 4 つの共有方式があります。
| 方式 | 受信側 | 認証方式 | 特徴 |
|---|---|---|---|
| Databricks-to-Databricks | Databricks ワークスペースユーザー | 共有識別子(cloud:region:uuid) | トークン管理不要。ノートブック・ボリューム・モデルも共有可能 |
| Open Sharing(トークンベース) | 非 Databricks ユーザー(Snowflake、Spark、pandas 等) | ベアラートークン | クレデンシャルファイルでエンドポイント + トークンを配布 |
| Open Sharing(OIDC フェデレーション) | 非 Databricks ユーザー | OIDC | トークン管理なしでセキュアな認証が可能 |
| Customer-Managed Server | 任意 | 自社管理 | OSS の Delta Sharing サーバーを自社でデプロイ |

Snowflake 連携時の前提条件
Snowflake は Delta Sharing のデータを Apache Iceberg REST Catalog API 経由で参照します。
主な前提条件は次のとおりです。
- Databricks default storage 上のアセットは external Iceberg clients に共有できない
- Delta テーブルを共有する場合は
IcebergCompatV3を有効化する - Snowflake では uniform-enabled なテーブルのみ表示される
- deletion vectors が有効なテーブルは2026年5月時点では未サポート
- managed Iceberg tables は2026年5月時点では未サポート
このため、Snowflake 向け共有では customer-managed S3 を managed location として利用し、その上に Iceberg 互換 Delta テーブルを作成する構成が必要になります。
Open Sharing(トークンベース)の仕組み
Open Sharing(トークンベース)では、以下のフローでデータ共有が行われます。
- プロバイダーが Share を作成 — Unity Catalog 上で共有するテーブルをまとめた Share を作成
- プロバイダーが Recipient を作成 — TOKEN 認証タイプの Recipient を作成すると、ベアラートークンとクレデンシャルファイルが自動生成される
- アクティベーションリンクの送付 — プロバイダーが受信者にアクティベーションリンクを安全に送付
- 受信者がクレデンシャルファイルをダウンロード — アクティベーションリンクにアクセスし、エンドポイント URL とベアラートークンを含むクレデンシャルファイルをダウンロード(1 回限り)
- 外部プラットフォームから接続 — クレデンシャルファイルの情報を使って、Snowflake 等の外部プラットフォームからデータにアクセス
トークンの制約:
| 項目 | 内容 |
|---|---|
| 最大有効期間 | 1 年 |
| 同時トークン数 | 最大 2(現行トークン + ローテーション中のトークン) |
| クレデンシャルファイル | ダウンロードは 1 回限り。シークレットとして扱う必要あり |
| ローテーション | CLI(databricks recipients rotate-token)で実施可能 |
Snowflake からの接続方式
Snowflake は Apache Iceberg REST Catalog API を通じて Delta Sharing のデータにアクセスします。具体的には、Snowflake の CATALOG INTEGRATION を作成し、Delta Sharing の Iceberg エンドポイントに接続します。
| 項目 | 内容 |
|---|---|
| Snowflake 側の設定 | CREATE CATALOG INTEGRATION(CATALOG_SOURCE = ICEBERG_REST) |
| エンドポイント URL | <workspace-url>/api/2.0/delta-sharing/metastores/<metastore-id>/iceberg |
| 認証方式 | ベアラートークン(REST_AUTHENTICATION TYPE = BEARER) |
| アクセス方式 | ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS(Databricks が一時的なクラウドストレージ認証情報を発行) |
Delta Sharing のアクティベーションリンクには Snowflake 用の専用 UI があり、クレデンシャルファイルをアップロードして Share を選択すると、Snowflake 用の CREATE CATALOG INTEGRATION SQL が自動生成されます。
検証環境
| 項目 | Databricks(プロバイダー) | Snowflake(レシピエント) |
|---|---|---|
| クラウド | AWS | AWS |
| リージョン | AWS-us-west-2 | AWS_AP_NORTHEAST_1(東京リージョン) |
| Unity Catalog | 有効 | - |
| エディション | Premium | Enterprise |
| ロール / 権限 | メタストア管理者(CREATE SHARE, CREATE RECIPIENT 権限) | ACCOUNTADMIN |
Delta Sharing によるデータ共有の検証
Databricks で External Location と managed location を準備する
Snowflake から Delta Sharing のデータを参照するには、Databricks 側の共有対象テーブルを customer-managed storage 上に配置する必要があります。ここでは S3 を Unity Catalog の External Location として登録し、その配下を catalog の managed location として使用します。
AWS 側の設定およびExternal Locationの設定については下記を参考に作成しました。

Catalog に managed location を設定して作成します。
CREATE CATALOG IF NOT EXISTS delta_sharing_ext
MANAGED LOCATION 's3://my-company-dbx-managed/delta-sharing';
-- スキーマの作成
CREATE SCHEMA IF NOT EXISTS delta_sharing_ext.sales;
補足:
MANAGED LOCATIONに指定する S3 パスは、あらかじめ Unity Catalog の External Location として登録済みのパス、またはその subpath である必要があります。
Databricks 側で Iceberg 互換 Delta テーブルを作成する
managed location 上に Iceberg 互換 Delta テーブルを作成し、テストデータを投入します。
-- Databricks で実行
USE CATALOG delta_sharing_ext;
USE SCHEMA sales;
-- Iceberg 互換 Delta テーブルの作成(UniForm / IcebergCompatV3 有効化)
CREATE OR REPLACE TABLE delta_sharing_ext.sales.customers (
customer_id INT,
customer_name STRING,
region STRING,
signup_date DATE
)
TBLPROPERTIES (
'delta.universalFormat.enabledFormats' = 'iceberg',
'delta.enableIcebergCompatV3' = 'true',
'delta.enableDeletionVectors' = 'false'
);
-- テストデータの挿入
INSERT INTO delta_sharing_ext.sales.customers VALUES
(1, 'Tanaka Corp', 'Tokyo', '2026-01-15'),
(2, 'Suzuki Ltd', 'Osaka', '2026-02-20'),
(3, 'Yamamoto Inc', 'Nagoya', '2026-03-10'),
(4, 'Sato Holdings', 'Fukuoka', '2026-04-05'),
(5, 'Ito Partners', 'Sapporo', '2026-04-20');
-- データ確認
SELECT * FROM delta_sharing_ext.sales.customers;

補足: Snowflake から参照する際の Iceberg 互換性について
Snowflake は Delta Sharing のデータを Apache Iceberg REST Catalog API 経由で参照します。
そのため、Databricks 側で共有する Delta テーブルは external Iceberg client 向けの条件を満たしている必要があります。
- Delta テーブルは
IcebergCompatV3を有効化して Iceberg 互換メタデータを生成できる状態にする- Snowflake では uniform-enabled なテーブルのみが表示される
- deletion vectors が有効なテーブルは2026年5月時点では未サポート
- managed Iceberg tables は2026年5月時点では未サポート
- default storage 上のアセットは external Iceberg clients に共有できない
本検証では、customer-managed S3 上に配置した Iceberg 互換 Delta テーブル(UniForm / IcebergCompatV3 有効)を使用しています。
Deletion vectorsとは
Delta Lake のストレージ最適化機能で、行の削除時にデータファイルを即座に書き換えるのではなく、「どの行が削除されたか」を別ファイルに記録する仕組みです。DELETE/UPDATE/MERGE のパフォーマンスが向上しますが、この形式は外部のIcebergクライアント(Snowflakeなど)がまだ対応していないため、テーブルが見えなくなる原因になります。
-- Deletion Vectors の状態確認
DESCRIBE DETAIL delta_sharing_ext.sales.customers;
-- 無効化 & 既存の Deletion Vectors を除去
ALTER TABLE delta_sharing_ext.sales.customers
SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
REORG TABLE delta_sharing_ext.sales.customers APPLY (PURGE);
【参考】
https://docs.databricks.com/gcp/en/delta/deletion-vectors
Databricks 側のShare作成
テストデータを含む Share を作成します。
-- Databricks で実行
-- Share の作成
CREATE SHARE IF NOT EXISTS snowflake_share
COMMENT 'Delta Sharing test for Snowflake integration';

-- Share にテーブルを追加
ALTER SHARE snowflake_share
ADD TABLE delta_sharing_ext.sales.customers;
-- Share の内容を確認
SHOW ALL IN SHARE snowflake_share;

補足: Share にスキーマ全体を追加すると、今後追加されるテーブルも自動的に共有対象になります。
Databricks 側のRecipient作成
Snowflake 用のトークンベース Recipient を作成します。
-- Databricks で実行
-- トークンベース Recipient の作成
CREATE RECIPIENT IF NOT EXISTS snowflake_recipient
COMMENT 'Recipient for Snowflake integration test';
上記コードでエラーとなった場合
Unity Catalogメタストアで「External Delta Sharing」が有効になっていない場合、有効化をする必要があります。
- Databricks Account Console → カタログ → 対象メタストアを選択
- Delta Sharing の設定で External Sharing(外部共有) を有効化


-- Recipient の詳細を確認(アクティベーションリンクを取得)
DESCRIBE RECIPIENT snowflake_recipient;

注意: アクティベーションリンクはクレデンシャルファイルがダウンロードされると表示されなくなります。リンクは安全な方法で受信者に共有してください。
Databricks 側のShareへアクセス権付与
作成した Recipient に Share へのアクセス権を付与します。
-- Databricks で実行
-- Recipient に Share へのアクセス権を付与
GRANT SELECT ON SHARE snowflake_share TO RECIPIENT snowflake_recipient;
-- 権限の確認
SHOW GRANTS ON SHARE snowflake_share;

クレデンシャルファイルのダウンロード
Recipient に発行されたアクティベーションリンクにアクセスし、クレデンシャルファイルをダウンロードします。
DESCRIBE RECIPIENTで取得したアクティベーションリンクにブラウザでアクセス- クレデンシャルファイル(.share / JSON 形式)をダウンロード

クレデンシャルファイルには以下の情報が含まれています。
{
"shareCredentialsVersion": 1,
"bearerToken": "<bearer-token>",
"endpoint": "<workspace-url>/api/2.0/delta-sharing/metastores/<metastore-id>",
"icebergEndpoint": "<workspace-url>/api/2.0/delta-sharing/metastores/<metastore-id>/iceberg"
}
| フィールド | 説明 |
|---|---|
bearerToken |
認証用のベアラートークン |
endpoint |
Delta Sharing プロトコル用のエンドポイント |
icebergEndpoint |
Iceberg REST Catalog API 用のエンドポイント(Snowflake はこちらを使用) |
注意: クレデンシャルファイルのダウンロードは 1 回限り です。ファイルはシークレットとして安全に管理してください。紛失した場合はトークンをローテーションして新しいアクティベーションリンクを発行する必要があります。
Snowflake 側のCATALOG INTEGRATION作成
クレデンシャルファイルの情報を使って、Snowflake で Delta Sharing 用の Catalog Integration を作成します。
Delta Sharing のアクティベーションリンクページには Snowflake アイコンがあり、クレデンシャルファイルをアップロードして Share を選択すると SQL が自動生成されます。手動で作成する場合は以下の SQL を実行します。
-- Snowflake で実行
CREATE OR REPLACE CATALOG INTEGRATION delta_sharing_integration
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
REST_CONFIG = (
CATALOG_URI = '<icebergEndpoint の値を入力>',
CATALOG_NAME = 'snowflake_share',
ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS
)
REST_AUTHENTICATION = (
TYPE = BEARER,
BEARER_TOKEN = '<bearerToken の値を入力>'
)
ENABLED = TRUE;
| パラメータ | 設定値 |
|---|---|
CATALOG_URI |
クレデンシャルファイルの icebergEndpoint の値 |
CATALOG_NAME |
Share 名(今回は snowflake_share) |
ACCESS_DELEGATION_MODE |
VENDED_CREDENTIALS(Databricks が一時認証情報を発行) |
BEARER_TOKEN |
クレデンシャルファイルの bearerToken の値 |

-- Catalog Integration の検証
SELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('delta_sharing_integration');

Snowflake 側で共有データの参照
Catalog Integration を使って catalog-linked database を作成し、共有データを参照します。
-- Snowflake で実行
-- catalog-linked database の作成
CREATE OR REPLACE DATABASE delta_sharing_db
LINKED_CATALOG = (
CATALOG = 'delta_sharing_integration'
);
-- ※ SYNC_INTERVAL_SECONDS を指定して、リモートカタログのスキーマ / テーブル同期頻度を設定することも可能です(デフォルト 30 秒、30〜86400 秒)

-- スキーマとテーブルの確認
SHOW SCHEMAS IN DATABASE delta_sharing_db;
SHOW TABLES IN delta_sharing_db.sales;

-- 共有データの参照
SELECT * FROM delta_sharing_db.sales.customers;
-- 件数確認
SELECT COUNT(*) AS row_count FROM delta_sharing_db.sales.customers;

読み取り専用の確認
Delta Sharing で共有されたデータは読み取り専用です。書き込みを試みてエラーになることを確認します。
-- Snowflake で実行
-- 書き込みを試みる → エラーになるはず
INSERT INTO delta_sharing_db.sales.customers VALUES
(99, 'Test Corp', 'Test', '2026-05-01');

Databricks 側でデータ更新後の反映確認
プロバイダー(Databricks)側でデータを追加し、レシピエント(Snowflake)側に反映されるか確認します。
-- ===========================
-- Databricks で実行
-- ===========================
-- 追加データの挿入
INSERT INTO delta_sharing_ext.sales.customers VALUES
(6, 'Watanabe Tech', 'Sendai', '2026-05-01'),
(7, 'Kobayashi Data', 'Hiroshima', '2026-05-02'),
(8, 'Takahashi AI', 'Kobe', '2026-05-03');
-- プロバイダー側の件数確認
SELECT COUNT(*) AS provider_row_count FROM delta_sharing_ext.sales.customers;
-- → 8件

-- ===========================
-- Snowflake で実行(データ更新後)
-- ===========================
-- 件数確認
SELECT COUNT(*) AS consumer_row_count FROM delta_sharing_db.sales.customers;
-- → 8件になっていれば反映されている
-- 追加データの確認
SELECT * FROM delta_sharing_db.sales.customers WHERE customer_id >= 6;


補足: Snowflake の catalog-linked database はリモートカタログを自動的にポーリングして同期しますが、反映には一定のタイムラグがあります。更新頻度は
SYNC_INTERVAL_SECONDSの設定値に依存し、状況によっては手動リフレッシュや状態確認が必要になる場合があります。
コストに関する補足
Delta Sharing のコスト構造は、受信側のプラットフォームや共有方式によって異なります。
| コスト区分 | 内容 |
|---|---|
| プロバイダー側のコンピュート | 受信側がデータを読み取る際、プロバイダー側でデータのマテリアライゼーション処理が発生する場合がある |
| データ転送(エグレス) | 同一リージョン内ではエグレスコストは発生しない。異なるリージョン間ではクラウドプロバイダーのデータ転送料金が適用される |
| Snowflake 側のコンピュート | Snowflake 側でクエリを実行するコンピュートコストは受信側が負担 |
ポイント: Databricks と Snowflake が同一 AWS リージョンにある場合、データ転送のエグレスコストは発生しません。異なるリージョンやクラウド間での共有を行う場合は、データ転送コストを事前に見積もることを推奨します。
まとめ
| 検証項目 | 結果 |
|---|---|
| テストデータ準備 | Unity Catalog 上にカタログ・スキーマ・テーブルを作成 |
| Share 作成 | CREATE SHARE でテーブルを含む Share を作成 |
| Recipient 作成 | トークンベースの Recipient を作成し、アクティベーションリンクを取得 |
| アクセス権付与 | GRANT SELECT ON SHARE で Recipient に権限を付与 |
| クレデンシャル取得 | アクティベーションリンクからクレデンシャルファイル(エンドポイント + ベアラートークン)をダウンロード |
| Snowflake 側設定 | CREATE CATALOG INTEGRATION(Iceberg REST + ベアラートークン)で接続設定を作成 |
| データ参照 | catalog-linked database を作成し、Databricks の共有データを Snowflake から正常に参照できた |
| 読み取り専用 | 書き込みはエラーとなり、読み取り専用であることを確認 |
| データ更新の反映 | Databricks 側でのデータ追加が Snowflake 側に反映されることを確認 |
今回は、Databricks(AWS)から Snowflake(AWS)へ Delta Sharing でデータ共有する手順を検証しました。
Snowflake は Delta Sharing の共有データを Apache Iceberg REST Catalog API 経由で参照するため、Databricks 側では external Iceberg client 向けの条件を満たす必要があります。特に、Databricks default storage 上のテーブルは共有対象にできず、customer-managed S3 を managed location とした Unity Catalog 上のテーブルを利用する必要がありました。
また、共有対象の Delta テーブルには IcebergCompatV3 を有効化し、UniForm により Iceberg 互換メタデータを生成できる状態にしておく必要があります。
一方で、トークンの有効期限管理やクレデンシャルファイルの安全な受け渡しなど、運用面での考慮は必要です。また、Databricks の external Iceberg clients 向け共有機能は現時点で Public Preview であるため、本番利用の際は最新のステータスを確認してください。
参考
Databricks 公式ドキュメント
- Delta Sharing
- Data sharing
- Create a share
- Create a recipient
- Create a token-based recipient
- Create a recipient with OIDC federation
- Grant access to a share
- Read data shared with you (Databricks)
- Read shared data using open clients
- Sharing over OIDC M2M
- Manage access lists
- Manage providers
- ABAC for Delta Sharing
- SQL reference for sharing
Snowflake 公式ドキュメント
Delta Sharing OSS / Delta Lake 公式
この記事が何かの参考になれば幸いです!










