はじめに:Iceberg Tablesって何がうれしいの?
「Snowflakeに大事なデータを取り込むのは便利だけど、データはやっぱり自分のS3に置いておきたい…」そんな声に応えてくれるのが Snowflake Iceberg Tables です。S3やAzure Blob、GCSといった 外部ストレージ に置いたファイルを、Snowflakeから普通のテーブルと同じようにSELECT・INSERT・UPDATEできる、便利な機能です。
この記事では、Iceberg Tablesって結局なんなの?という素朴な疑問から、実際の作り方まで解説していきます。

Apache Icebergとは:オープンテーブル形式の正体
Apache Iceberg はもともとNetflixが開発し、現在はApacheで開発が続いているオープンソースの「テーブル形式」です。難しく聞こえますが、ざっくり言うと 「Parquetファイルの集まりに、テーブルらしさを与えるためのメタデータ(目次)の仕組み」 です。
Parquetだけだと「ただのファイルの寄せ集め」ですが、Icebergのメタデータがあるおかげで、スキーマ変更・タイムトラベル・トランザクションといった本物のテーブルらしい挙動が可能になります。しかも形式が公開されているので、Snowflake以外のエンジン(Spark、Trino、DuckDBなど)からも同じデータを読めるのが大きな魅力です。
Snowflakeでの2つの利用パターン
Snowflake Iceberg Tablesには、大きく2つの使い方があります。
① Snowflake管理のIcebergテーブル
Snowflakeがカタログ(メタデータ管理)も書き込みも面倒見てくれるパターンです。通常のテーブルとほぼ同じ感覚で使え、書き込み性能も高いのが特徴。データの実体だけ自分のストレージにあるイメージです。
② 外部カタログ管理のIcebergテーブル
AWS GlueやREST Catalogなど外部のカタログサービスでメタデータを管理し、Snowflakeは読み取り専用で参照するパターンです。複数エンジンでデータを共有したいときに便利です。

実際に作ってみよう
まずは 外部ボリューム(EXTERNAL VOLUME) を作ります。これは「Snowflakeがこのバケットを読み書きしていいよ」という入口の設定です。
CREATE OR REPLACE EXTERNAL VOLUME my_iceberg_vol
STORAGE_LOCATIONS = (
(
NAME = 'my-s3-loc'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://my-bucket/iceberg/'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-iceberg-role'
)
);
続いて、Snowflake管理のIcebergテーブルを作ります。
CREATE OR REPLACE ICEBERG TABLE sales_iceberg (
order_id NUMBER,
amount NUMBER(10,2),
ordered_at TIMESTAMP_NTZ
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_iceberg_vol'
BASE_LOCATION = 'sales/';
INSERT INTO sales_iceberg VALUES (1, 1980.00, CURRENT_TIMESTAMP);
SELECT * FROM sales_iceberg;
このSELECTは、見た目は普通のテーブル参照ですが、実体はS3上のParquet+Icebergメタデータを読みに行っています。普通のSQLでオープン形式のデータを扱える点が、Iceberg Tablesの大きな魅力です。
通常のSnowflakeテーブルとの違い
- データの置き場所:通常テーブルはSnowflake内部、Icebergは自分のクラウドストレージ
- 他エンジンからの読み取り:通常テーブルは不可、Icebergは可能
- 料金:Icebergはストレージ費用が自分のクラウド側にかかるため、コスト体系が変わる
- 機能制限:Icebergは一部Snowflake機能(Time Travelの挙動など)で制約あり
こんなときに使いたい
「データレイクとしてS3にすでにParquetを蓄積している」「Sparkチームと同じデータを共有したい」「将来エンジンを乗り換えるかもしれないからベンダーロックインを避けたい」といったケースで威力を発揮します。逆に、Snowflakeだけで完結する小〜中規模ワークロードなら通常テーブルで十分なことも多いです。
また、外部ストレージへのアクセス権設定を間違えると Failed to access remote fileエラー が出やすいので、IAMロール設定は丁寧に行いましょう。
まとめ
Snowflake Iceberg Tablesは、自分のクラウドストレージにあるオープン形式のデータを、Snowflakeから普通のテーブルとして扱える機能でした。データの主権を保ちつつ、Snowflakeの強力なクエリエンジンを使えるのは大きなメリットです。まずは小さなテーブルで試して、外部ボリュームの仕組みに慣れてみてください。
参考リンク
関連記事
- Snowflake「Failed to access remote file」エラーの原因と解決方法 – 外部ストレージ連携で詰まったらまず読みたい記事です
- Snowflake「Time travel data is not available」エラーの原因と過去データ復元のコツ – Icebergでも気をつけたいTime Travelの考え方
- Snowflake Openflowとは?Apache NiFiベースのデータ統合サービスを初心者向けに解説 – Iceberg化前のデータ取り込みに役立つ統合基盤
- SnowPro Core Domain 1完全攻略 – Snowflakeアーキテクチャの理解を深めるのに最適

