はじめに:Iceberg Tableをそろそろ自分の手で作ってみよう
「Iceberg Tableって聞いたことはあるけれど、実際にどう作ればいいの?」と迷っている方は多いのではないでしょうか。概念はなんとなく理解できても、いざ作ろうとすると「外部ボリュームって何?」「IAMロールも要るの?」と手が止まってしまいがちです。
この記事では、Snowflakeで Iceberg Table を作成する一連の流れ を、初心者向けに丁寧に解説します。Iceberg Tableそのものの概念については Snowflake Iceberg Tablesとは?外部ストレージで動くオープンテーブル形式を初心者向けに解説 で扱っているので、合わせて読むと理解が深まります。

Iceberg Table作成の全体像
Iceberg Tableを作る流れはざっくり次の3ステップです。順番にやれば難しくありません。
- クラウドストレージ側の準備(S3バケット作成 + IAMロール作成)
- Snowflake側で外部ボリュームを作成(CREATE EXTERNAL VOLUME)
- CREATE ICEBERG TABLE でテーブルを作る
ここでいう「外部ボリューム」とは、Snowflakeが外部ストレージ(S3など)へアクセスするための入り口のようなものです。Iceberg Tableのデータ本体(Parquetファイル)とメタデータは、このボリュームを通じてS3上に書かれます。
ステップ1:S3バケットとIAMロールを準備する
まずはAWSコンソールでS3バケットを用意します。例として my-iceberg-bucket を作ったとしましょう。次に、Snowflakeがこのバケットを読み書きできるようにする IAMロール を作成します。ポリシーには s3:GetObject、s3:PutObject、s3:DeleteObject、s3:ListBucket あたりを含めてください。
このロールのARN(例: arn:aws:iam::123456789012:role/snowflake-iceberg-role)はあとで使うのでメモしておきましょう。
ステップ2:外部ボリュームを作成する
Snowflake側で CREATE EXTERNAL VOLUME を実行します。ACCOUNTADMINロールが必要です。
CREATE OR REPLACE EXTERNAL VOLUME iceberg_ext_vol
STORAGE_LOCATIONS =
(
(
NAME = 'my-s3-loc'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://my-iceberg-bucket/iceberg/'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-iceberg-role'
STORAGE_AWS_EXTERNAL_ID = 'my-external-id-001'
)
)
ALLOW_WRITES = TRUE;
作成できたら、Snowflake側のIAMユーザー情報を取得します。
DESC EXTERNAL VOLUME iceberg_ext_vol;
返ってきた STORAGE_AWS_IAM_USER_ARN と STORAGE_AWS_EXTERNAL_ID を、AWS側のIAMロールの信頼ポリシーに反映してください。ここを忘れると後のステップで「アクセスできません」エラーになります。

ステップ3:接続を検証する
SnowflakeからS3に本当にアクセスできるかは、次のコマンドで確認できます。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('iceberg_ext_vol');
すべてSUCCESSと表示されればOKです。失敗した場合はIAMロールの信頼関係やバケットポリシーを見直しましょう。エラーが出る場合は Snowflake「Failed to access remote file」エラーの原因と解決方法 も参考にしてみてください。
ステップ4:CREATE ICEBERG TABLEでテーブルを作る
いよいよテーブル作成です。一番シンプルな「Snowflakeをカタログとして使う」パターンが初心者にはおすすめです。
CREATE OR REPLACE ICEBERG TABLE sales_iceberg (
sale_id NUMBER(10,0),
sale_date DATE,
amount NUMBER(12,2),
customer STRING
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_ext_vol'
BASE_LOCATION = 'sales/';
ポイントは3つです。
- CATALOG = ‘SNOWFLAKE’:メタデータ管理をSnowflakeに任せます。読み書き両方OKです。
- EXTERNAL_VOLUME:ステップ2で作った外部ボリューム名を指定します。
- BASE_LOCATION:バケット内のサブフォルダです。テーブルごとに分けると整理しやすいですよ。
あとは通常のテーブルと同じ感覚で INSERT や SELECT ができます。
INSERT INTO sales_iceberg VALUES (1, '2026-06-01', 1980.00, 'Alice');
SELECT * FROM sales_iceberg;
よくあるつまずきポイント
- 権限不足:CREATE EXTERNAL VOLUMEはアカウントレベルの権限が必要です。普段使いのロールでは作れません。
- BASE_LOCATIONの重複:同じパスを別テーブルで使うとメタデータが壊れる原因になります。テーブル単位でユニークなパスにしましょう。
- ALLOW_WRITES=FALSEのまま書き込もうとする:外部からのIceberg(AWS Glueカタログなど)を読むだけならFALSEでOKですが、Snowflake側で書き込むなら必ずTRUEに設定します。
まとめ
Iceberg Tableの作成は「外部ボリュームを作る → 信頼関係を結ぶ → CREATE ICEBERG TABLE」という流れさえ押さえれば、決して難しくありません。一度設定してしまえば、同じ外部ボリュームを使って複数のIceberg Tableをサクサク作れるようになります。ぜひ手を動かして、自社のデータレイクとSnowflakeを橋渡しする第一歩を踏み出してみてくださいね。
参考リンク
- Apache Iceberg™ テーブル(Snowflake公式)
- CREATE EXTERNAL VOLUME(Snowflake公式)
- CREATE ICEBERG TABLE(Snowflake公式)
関連記事
- Snowflake Iceberg Tablesとは?外部ストレージで動くオープンテーブル形式を初心者向けに解説 – Iceberg Tableの概念や仕組みをまずは理解したい方向け。
- Snowflake「Failed to access remote file」エラーの原因と解決方法|S3/Azure/GCS別 – 外部ストレージ接続でつまずいたときに役立ちます。

