概要
Snowflake から Microsoft Fabric(Fabric)の OneLake 上に Iceberg テーブルを配置し、Fabric 側で参照・クエリするまでの手順を整理します。Snowflake マネージド Iceberg テーブルを Fabric のメタデータ仮想化により Delta テーブルとしてクエリしています。
手順
1. Fabric のテナント設定を変更
管理ポータルにて サービス プリンシパルは Fabric の公開用 API を呼び出すことができます の設定を 有効化 にします。
2. Fabric にてワークスペースにレイクハウスを作成
対象ワークスペースにレイクハウスを作成します。
3. サブフォルダを作成
Iceberg テーブルの配置先となるサブフォルダを作成します(例:Files/snowflake_iceberg 配下)。
4. サブフォルダの URL を取得
後続で Snowflake の External Volume に設定するため、作成したサブフォルダの URL を取得します。
5. テナント ID を取得
Azure Entra ID(Azure AD)のテナント ID を取得します。
6. Snowflake にて Volume を作成
STORAGE_BASE_URL に取得した サブフォルダの URL を、AZURE_TENANT_ID に取得した テナント ID をセットして External Volume を作成します。サブフォルダの URL は、https ではなく azure スキームに変更します(https://... → azure://...)。
CREATE OR REPLACE EXTERNAL VOLUME onelake_iceberg_vol_01
STORAGE_LOCATIONS =
(
(
NAME = 'onelake iceberg volume'
STORAGE_PROVIDER = 'AZURE'
STORAGE_BASE_URL = 'azure://onelake.dfs.fabric.microsoft.com/qiita_sf_with_fabric/snowflake.Lakehouse/Files/snowflake_iceberg'
AZURE_TENANT_ID = '02dd4e36-XXXXX'
)
)
ALLOW_WRITES = true;
サブフォルダの URLがhttpsのままである場合に、下記のエラーが発生します。azureに変更してください。
CREATE OR REPLACE EXTERNAL VOLUME onelake_iceberg_vol_01
STORAGE_LOCATIONS =
(
(
NAME = 'onelake iceberg volume'
STORAGE_PROVIDER = 'AZURE'
STORAGE_BASE_URL = 'https://onelake.dfs.fabric.microsoft.com/qiita_sf_with_fabric/snowflake.Lakehouse/Files/snowflake_iceberg'
AZURE_TENANT_ID = '02dd4e36-xxxx'
)
)
ALLOW_WRITES = true;
SQL compilation error: invalid value ''https://onelake.dfs.fabric.microsoft.com/qiita_sf_with_fabric/snowflake.Lakehouse/Files/snowflake_iceberg'' for property 'STORAGE_BASE_URL'
7. AZURE_CONSENT_URL にて認証情報をテナントに追加
External Volume の作成後、DESC EXTERNAL VOLUME の結果から AZURE_CONSENT_URL を取得します。
DESC EXTERNAL VOLUME onelake_iceberg_vol_01;
SELECT
PARSE_JSON($4):AZURE_MULTI_TENANT_APP_NAME::string AS AZURE_MULTI_TENANT_APP_NAME,
PARSE_JSON($4):AZURE_CONSENT_URL::string AS AZURE_CONSENT_URL
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE $2 = 'STORAGE_LOCATION_1';
AZURE_CONSENT_URL にアクセスし、Azure へログインしたうえで 承諾 を選択します。
8. Fabric にて Snowflake の認証情報に権限付与
Fabric 側(OneLake 側)で、Snowflake が利用するサービスプリンシパルにワークスペース権限を付与します。
ワークスペースにて、右上の アクセスの管理 を選択します。
+ユーザーまたはグループの追加 を選択します。
AZURE_MULTI_TENANT_APP_NAME のハイフン前までの名称(例:akjttesnowflakepacint_1768903577114 -> akjttesnowflakepacint)を追加し、共同作成者 を選択したうえで、追加 を選択します。
Snowflake にて External Volume の疎通確認を行い、success が true であることを確認します。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('onelake_iceberg_vol_01');
{
"success": true,
"storageLocationSelectionResult": "PASSED",
"storageLocationName": "onelake iceberg volume",
"servicePrincipalProperties": "AZURE_MULTI_TENANT_APP_NAME: akjttesnowflakepacint_1768903577114; AZURE_CONSENT_URL: https://login.microsoftonline.com/02dd4e36-5bc7-47b7-b351-1cf888365c24/oauth2/authorize?client_id=ece9bf25-a45d-4b53-b844-fc958a3b5dd0&response_type=code",
"location": "azure://onelake.dfs.fabric.microsoft.com/qiita_sf_with_fabric/snowflake.Lakehouse/Files/snowflake_iceberg",
"storageAccount": "onelake",
"region": "southeastasia",
"writeResult": "PASSED",
"readResult": "PASSED",
"listResult": "PASSED",
"deleteResult": "PASSED",
"awsRoleArnValidationResult": "SKIPPED",
"azureGetUserDelegationKeyResult": "SKIPPED"
}
9. Snowflake にてマネージド Iceberg テーブルを作成
データベースとスキーマを作成します。
CREATE DATABASE IF NOT EXISTS ONELAKE_ICEBERG_01;
CREATE SCHEMA IF NOT EXISTS ONELAKE_ICEBERG_01.SCHEMA_01;
USE DATABASE ONELAKE_ICEBERG_01;
USE SCHEMA SCHEMA_01;
テーブルの作成とデータ挿入を実施します。CATALOG = 'SNOWFLAKE' を指定することで Snowflake マネージド Iceberg テーブルとして作成し、EXTERNAL_VOLUME に OneLake を割り当てます。
CREATE OR REPLACE ICEBERG TABLE TABLE_01 (
ID INT,
NAME STRING,
TS TIMESTAMP_NTZ
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'onelake_iceberg_vol_01';
INSERT INTO TABLE_01 (ID, NAME, TS)
VALUES
(1, 'Alice', CURRENT_TIMESTAMP());
10. Fabric にてファイルを確認
Fabric 側で Iceberg テーブルのファイルが作成されていることを確認します(OneLake の対象フォルダ配下にファイルが生成されていることを確認します)。
11. Fabric からクエリの実行
Fabric 側で Iceberg テーブルを参照するため、ショートカット(メタデータ仮想化)を作成します。
スキーマの設定ボタン -> 新しいテーブルのショートカット を選択します。
Microsoft OneLake を選択します。
作成したレイクハウスを選択し、次へ を選択します。
Iceberg テーブルのパスをチェックし、次へ を選択します。
作成 を選択します。
Fabric にてノートブックを作成し、クエリを実行して想定通りにデータを取得できることを確認します。
%%sql
SELECT * FROM snowflake.dbo.`TABLE_01.gGv9twFu` LIMIT 1000;
Fabric のテーブルを右クリックして ファイルの表示 を選択すると、_delta_log ディレクトリが作成されていることを確認できます。これは Fabric 側が Iceberg のメタデータを参照し、Delta 形式のトランザクションログとして仮想化(変換ログの生成)している状態です。
"Conversion completed successfully at 2026-02-04 03:40:48 UTC time. Latest Metadata file: 00001-19be467e-0858-4be1-a2b4-5fae657a0d55.metadata.json"
12. Snowflake にてデータを追加
Snowflake にて Iceberg テーブルにデータを追加します。
INSERT INTO TABLE_01 (ID, NAME, TS)
VALUES
(2, 'Bob', CURRENT_TIMESTAMP());
Fabric にてテーブルのフォルダを確認すると、_delta_log に Delta のトランザクションログが追加されたことを確認します。
クエリすると想定通りに、追加されたデータを確認できます。































