【Snowflake】Snowflake x Iceberg 〜 入門編 〜

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/06/18/143804

の続き。

前回は、Apache Icebergについておおよそ把握できたので
今回は、Snowflake内でIcebergを作ってみる
 => Snowflakeの公式ドキュメントがよくできているので、結構簡単にできる

目次

【0】Snowflake公式ドキュメント
 1)使用するSQL
 2)前提条件
【1】Step1:ウェアハウスとデータベースを設定する
【2】Step2:外部ボリュームを作成する
 1)S3ロケーションへのアクセスを許可するIAMポリシーを作成する
 2)Snowflakeで外部ボリュームを作成する
 3)バケットオブジェクトにアクセスするためにIAMユーザー権限を付与する
【3】Step3:テーブルを作成する
【4】クリーンアップする

【0】Snowflake公式ドキュメント

* 以下の公式ドキュメントに従って操作してみるのが良さそう
 => 面倒なのは、IAMロール周りの作成で、後はそんなに難しくなさそう

チュートリアル: 初めてのIcebergテーブルを作成する
https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table

1)使用するSQL

CREATE EXTERNAL VOLUME / DROP EXTERNAL VOLUME

*  Apache Icebergテーブル 用の外部ボリューム を作成 / 削除

https://docs.snowflake.com/ja/sql-reference/sql/create-external-volume
https://docs.snowflake.com/ja/sql-reference/sql/drop-external-volume

CREATE ICEBERG TABLE / DROP ICEBERG TABLE

*  Apache Icebergテーブル を作成 / 削除

https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table
https://docs.snowflake.com/ja/sql-reference/sql/drop-iceberg-table

2)前提条件

* S3バケットを用意しておくこと

【1】Step1:ウェアハウスとデータベースを設定する

* ウェアハウスに関しては、すでにあれば省略可能
* データベースに関しては、後々(【3】)で、
 「ALTER DATABASE iceberg_tutorial_db SET ...」するので
 できれば専用DBがあったほうがいい

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#set-up-a-warehouse-and-database

CREATE WAREHOUSE iceberg_tutorial_wh
  WAREHOUSE_TYPE = STANDARD
  WAREHOUSE_SIZE = XSMALL;

USE WAREHOUSE iceberg_tutorial_wh;

CREATE OR REPLACE DATABASE iceberg_tutorial_db;
USE DATABASE iceberg_tutorial_db;

【2】Step2:外部ボリュームを作成する

* 公式ドキュメントがわかりやすいので、

1)S3ロケーションへのアクセスを許可するIAMポリシーを作成する

* 以下を参照

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#create-an-iam-policy-that-grants-access-to-your-s3-location

2)Snowflakeで外部ボリュームを作成する

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#create-an-external-volume-in-snowflake

-- STORAGE_AWS_ROLE_ARNは、1)で作成したIAMロールのARN
CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
   STORAGE_LOCATIONS =
      (
         (
            NAME = 'my-s3-us-west-2'
            STORAGE_PROVIDER = 'S3'
            STORAGE_BASE_URL = 's3://<my_bucket>/'
            STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
            STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
         )
      );

-- 以下を実行し、STORAGE_AWS_IAM_USER_ARN プロパティの値を記録
-- 例: "STORAGE_AWS_IAM_USER_ARN": "arn:aws:iam::123456789001:user/abc1-b-self1234"
DESC EXTERNAL VOLUME iceberg_external_volume;
-- 後述3)の「IAM ロールのポリシードキュメント」で使用する

3)バケットオブジェクトにアクセスするためにIAMユーザー権限を付与する

* 以下を参照

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#grant-the-iam-user-permissions-to-access-bucket-objects

【3】Step3:テーブルを作成する

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#create-a-table

-- [1] Icebergカタログとしてテーブルを作成する
CREATE OR REPLACE ICEBERG TABLE customer_iceberg (
    c_custkey INTEGER,
    c_name STRING,
    c_address STRING,
    c_nationkey INTEGER,
    c_phone STRING,
    c_acctbal INTEGER,
    c_mktsegment STRING,
    c_comment STRING
)
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'iceberg_external_volume'
    BASE_LOCATION = 'customer_iceberg';

-- 補足:BASE_LOCATION
--  Snowflakeがテーブルのデータファイルとメタデータファイルを
--  書き込めるディレクトリへのパス。
--  テーブルの EXTERNAL_VOLUME 位置からの相対パスを指定

https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake

-- [2] データベースのカタログ統合と外部ボリュームを設定する
ALTER DATABASE iceberg_tutorial_db SET CATALOG = 'SNOWFLAKE';
ALTER DATABASE iceberg_tutorial_db SET EXTERNAL_VOLUME = 'iceberg_external_volume';

-- [3] 確認
SHOW PARAMETERS IN DATABASE;
-- => [2] で設定した値が確認できる(e.g. CATALOG:SNOWFLAKE)

その後

* あとは、以下を参考に色々触ってみる

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#load-data-and-query-the-tables
https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#delete-rows

【4】クリーンアップする

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table#clean-up

DROP ICEBERG TABLE customer_iceberg;
-- DROP ICEBERG TABLE nation_iceberg;
DROP EXTERNAL VOLUME iceberg_external_volume;

USE DATABASE <my_other_database>;
DROP DATABASE iceberg_tutorial_db;

-- WAREHOUSEを作成してたら、、、
USE WAREHOUSE <my_other_warehouse>;
DROP WAREHOUSE iceberg_tutorial_wh;

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake x Iceberg 〜 基礎知識編 〜
https://dk521123.hatenablog.com/entry/2025/06/18/143804