0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake にて Microsoft Fabric OneLake 上での Iceberg テーブル操作方法

Posted at

概要

Snowflake から Microsoft Fabric(Fabric)の OneLake 上に Iceberg テーブルを配置し、Fabric 側で参照・クエリするまでの手順を整理します。Snowflake マネージド Iceberg テーブルを Fabric のメタデータ仮想化により Delta テーブルとしてクエリしています。

手順

1. Fabric のテナント設定を変更

管理ポータルにて サービス プリンシパルは Fabric の公開用 API を呼び出すことができます の設定を 有効化 にします。

image.png

image.png

2. Fabric にてワークスペースにレイクハウスを作成

対象ワークスペースにレイクハウスを作成します。

image.png

image.png

3. サブフォルダを作成

Iceberg テーブルの配置先となるサブフォルダを作成します(例:Files/snowflake_iceberg 配下)。

image.png

image.png

4. サブフォルダの URL を取得

後続で Snowflake の External Volume に設定するため、作成したサブフォルダの URL を取得します。

image.png

image.png

5. テナント ID を取得

Azure Entra ID(Azure AD)のテナント ID を取得します。

image.png

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;

image.png

サブフォルダの URLhttpsのままである場合に、下記のエラーが発生します。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'

image.png

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';

image.png

AZURE_CONSENT_URL にアクセスし、Azure へログインしたうえで 承諾 を選択します。

image.png

8. Fabric にて Snowflake の認証情報に権限付与

Fabric 側(OneLake 側)で、Snowflake が利用するサービスプリンシパルにワークスペース権限を付与します。

ワークスペースにて、右上の アクセスの管理 を選択します。

image.png

+ユーザーまたはグループの追加 を選択します。

image.png

AZURE_MULTI_TENANT_APP_NAME のハイフン前までの名称(例:akjttesnowflakepacint_1768903577114 -> akjttesnowflakepacint)を追加し、共同作成者 を選択したうえで、追加 を選択します。

image.png

Snowflake にて External Volume の疎通確認を行い、successtrue であることを確認します。

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"
}

image.png

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());

image.png

10. Fabric にてファイルを確認

Fabric 側で Iceberg テーブルのファイルが作成されていることを確認します(OneLake の対象フォルダ配下にファイルが生成されていることを確認します)。

image.png

11. Fabric からクエリの実行

Fabric 側で Iceberg テーブルを参照するため、ショートカット(メタデータ仮想化)を作成します。

スキーマの設定ボタン -> 新しいテーブルのショートカット を選択します。

image.png

Microsoft OneLake を選択します。

image.png

作成したレイクハウスを選択し、次へ を選択します。

image.png

Iceberg テーブルのパスをチェックし、次へ を選択します。

image.png

作成 を選択します。

image.png

Fabric にてノートブックを作成し、クエリを実行して想定通りにデータを取得できることを確認します。

%%sql
SELECT * FROM snowflake.dbo.`TABLE_01.gGv9twFu` LIMIT 1000;

image.png

Fabric のテーブルを右クリックして ファイルの表示 を選択すると、_delta_log ディレクトリが作成されていることを確認できます。これは Fabric 側が Iceberg のメタデータを参照し、Delta 形式のトランザクションログとして仮想化(変換ログの生成)している状態です。

image.png

image.png

image.png

"Conversion completed successfully at 2026-02-04 03:40:48 UTC time. Latest Metadata file: 00001-19be467e-0858-4be1-a2b4-5fae657a0d55.metadata.json"

image.png

12. Snowflake にてデータを追加

Snowflake にて Iceberg テーブルにデータを追加します。

INSERT INTO TABLE_01 (ID, NAME, TS)
VALUES
  (2, 'Bob', CURRENT_TIMESTAMP());

image.png

Fabric にてテーブルのフォルダを確認すると、_delta_log に Delta のトランザクションログが追加されたことを確認します。

image.png

クエリすると想定通りに、追加されたデータを確認できます。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?