Snowflake Iceberg Table作成手順|外部ボリューム設定からCREATEまで

Snowflake Iceberg Table作成手順|外部ボリューム設定からCREATEまでのサムネイル Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:Iceberg Tableをそろそろ自分の手で作ってみよう

「Iceberg Tableって聞いたことはあるけれど、実際にどう作ればいいの?」と迷っている方は多いのではないでしょうか。概念はなんとなく理解できても、いざ作ろうとすると「外部ボリュームって何?」「IAMロールも要るの?」と手が止まってしまいがちです。

この記事では、Snowflakeで Iceberg Table を作成する一連の流れ を、初心者向けに丁寧に解説します。Iceberg Tableそのものの概念については Snowflake Iceberg Tablesとは?外部ストレージで動くオープンテーブル形式を初心者向けに解説 で扱っているので、合わせて読むと理解が深まります。

Iceberg Table作成の全体像

Iceberg Tableを作る流れはざっくり次の3ステップです。順番にやれば難しくありません。

  1. クラウドストレージ側の準備(S3バケット作成 + IAMロール作成)
  2. Snowflake側で外部ボリュームを作成(CREATE EXTERNAL VOLUME)
  3. CREATE ICEBERG TABLE でテーブルを作る

ここでいう「外部ボリューム」とは、Snowflakeが外部ストレージ(S3など)へアクセスするための入り口のようなものです。Iceberg Tableのデータ本体(Parquetファイル)とメタデータは、このボリュームを通じてS3上に書かれます。

ステップ1:S3バケットとIAMロールを準備する

まずはAWSコンソールでS3バケットを用意します。例として my-iceberg-bucket を作ったとしましょう。次に、Snowflakeがこのバケットを読み書きできるようにする IAMロール を作成します。ポリシーには s3:GetObjects3:PutObjects3:DeleteObjects3: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_ARNSTORAGE_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:バケット内のサブフォルダです。テーブルごとに分けると整理しやすいですよ。

あとは通常のテーブルと同じ感覚で INSERTSELECT ができます。

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を橋渡しする第一歩を踏み出してみてくださいね。

参考リンク

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket