Snowflake

Snowflake External Volumes and Iceberg Integration: Complete Setup Guide

2026-03-26
更新: 2026-03-27
NicheeLab Editorial Team

An External Volume is an object that defines the external cloud storage location where Snowflake stores data files (Parquet) and metadata for Apache Iceberg Tables. It points to S3, Azure Blob Storage, or Google Cloud Storage as the durable data backend, letting the Snowflake compute engine read and write Iceberg-format tables.

How External Volumes Relate to Iceberg Tables

Snowflake
  │
  ├─ CREATE ICEBERG TABLE ... EXTERNAL_VOLUME = 'my_vol'
  │    └─ Table metadata: Snowflake Catalog or External Catalog
  │
  └─ External Volume (my_vol)
       │
       └─ Cloud storage
            ├─ data/     ← Parquet data files
            └─ metadata/ ← Iceberg metadata (manifest, snapshot)

Creating an External Volume for AWS S3

CREATE OR REPLACE EXTERNAL VOLUME iceberg_s3_vol
  STORAGE_LOCATIONS = (
    (
      NAME = 'us-east-1-primary'
      STORAGE_BASE_URL = 's3://my-iceberg-bucket/warehouse/'
      STORAGE_PROVIDER = 'S3'
      STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-iceberg-role'
    )
  );

-- Check External Volume details to configure IAM on the AWS side
DESCRIBE EXTERNAL VOLUME iceberg_s3_vol;
-- → STORAGE_AWS_IAM_USER_ARN
-- → STORAGE_AWS_EXTERNAL_ID
-- Add these to the trust policy of the AWS IAM role

Creating an External Volume for Azure Blob Storage

CREATE OR REPLACE EXTERNAL VOLUME iceberg_azure_vol
  STORAGE_LOCATIONS = (
    (
      NAME = 'azure-east-primary'
      STORAGE_BASE_URL = 'azure://myaccount.blob.core.windows.net/iceberg-container/warehouse/'
      STORAGE_PROVIDER = 'AZURE'
      AZURE_TENANT_ID = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'
    )
  );

-- After DESCRIBE, grant the service principal permissions in Azure AD

Creating an External Volume for Google Cloud Storage

CREATE OR REPLACE EXTERNAL VOLUME iceberg_gcs_vol
  STORAGE_LOCATIONS = (
    (
      NAME = 'gcs-us-primary'
      STORAGE_BASE_URL = 'gcs://my-iceberg-bucket/warehouse/'
      STORAGE_PROVIDER = 'GCS'
    )
  );

-- After DESCRIBE, grant Storage Admin to the GCP service account

Cloud-by-Cloud Configuration Comparison

ItemAWS S3Azure BlobGCS
STORAGE_PROVIDERS3AZUREGCS
URL prefixs3://azure://gcs://
Auth configurationIAM Role ARNAzure Tenant IDGCP service account (auto)
Where to configure after DESCRIBEIAM role trust policyAzure AD permissionsIAM Storage Admin

Creating Iceberg Tables Managed by the Snowflake Catalog

-- Create an Iceberg Table managed by the Snowflake catalog
-- Snowflake manages both metadata and data (read/write enabled)
CREATE OR REPLACE ICEBERG TABLE analytics.events.user_actions (
  event_id STRING,
  user_id INT,
  event_type STRING,
  event_timestamp TIMESTAMP_NTZ,
  properties OBJECT
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_s3_vol'
  BASE_LOCATION = 'analytics/user_actions/';

-- DML works just like a regular table
INSERT INTO analytics.events.user_actions
VALUES ('evt-001', 12345, 'page_view', '2026-03-27 10:00:00', PARSE_JSON('{"page": "/home"}'));

SELECT * FROM analytics.events.user_actions
WHERE event_timestamp >= '2026-03-27';

Creating Iceberg Tables Backed by an External Catalog

-- Integrate with AWS Glue Data Catalog
-- First create a Catalog Integration
CREATE OR REPLACE CATALOG INTEGRATION glue_catalog
  CATALOG_SOURCE = GLUE
  CATALOG_NAMESPACE = 'analytics_db'
  TABLE_FORMAT = ICEBERG
  GLUE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-glue-role'
  GLUE_CATALOG_ID = '123456789012'
  GLUE_REGION = 'us-east-1'
  ENABLED = TRUE;

-- Iceberg Table managed by the external catalog (read-only)
CREATE OR REPLACE ICEBERG TABLE analytics.events.external_events
  EXTERNAL_VOLUME = 'iceberg_s3_vol'
  CATALOG = 'glue_catalog'
  CATALOG_TABLE_NAME = 'events';

Comparing Catalog Management Approaches

AspectSnowflake catalogExternal catalog (Glue, etc.)
Metadata managementManaged by SnowflakeManaged by an external service
WritesINSERT / UPDATE / DELETE / MERGE supportedRead-only
Data sharingSpark and others can read the Parquet files directlySpark and others reference the same catalog
Use caseSnowflake-centric workloadsMulti-engine setups (Spark + Snowflake)

Managing External Volumes

-- List
SHOW EXTERNAL VOLUMES;

-- Inspect details (information required for IAM setup)
DESCRIBE EXTERNAL VOLUME iceberg_s3_vol;

-- Drop an External Volume (Iceberg Tables that reference it must be dropped first)
DROP EXTERNAL VOLUME iceberg_s3_vol;

Best Practices

  • Separate External Volumes by team or domain: split External Volumes and buckets by use case for least-privilege IAM and cleaner cost attribution
  • Use BASE_LOCATION to logically partition paths: when multiple tables share an External Volume, give each a distinct BASE_LOCATION
  • Prefer the Snowflake catalog: use the Snowflake catalog when Snowflake reads and writes the data; reach for an external catalog only when you need multi-engine access
  • Storage lifecycle rules: align bucket lifecycle rules with Iceberg snapshot expiration to archive or remove stale data files

Check Your Understanding

Data Sharing & Interoperability

問題 1

Team A wants both Spark and Snowflake to access the same Iceberg Table, with Spark managing the table in the AWS Glue Data Catalog. When creating the Iceberg Table in Snowflake, which value of CATALOG is correct?

  1. Specify CATALOG = 'SNOWFLAKE' and migrate metadata into Snowflake
  2. Specify CATALOG = 'GLUE' and reference the Glue catalog ARN directly
  3. Specify the name of a previously created Catalog Integration (e.g., glue_catalog) as CATALOG
  4. Omit CATALOG entirely — specifying only EXTERNAL_VOLUME will auto-link to Glue

正解: C

To integrate with an external catalog (such as AWS Glue), first create the connection with CREATE CATALOG INTEGRATION, then pass the integration's name as the CATALOG parameter of CREATE ICEBERG TABLE. CATALOG = 'SNOWFLAKE' creates a Snowflake-managed catalog that is decoupled from Spark's Glue catalog. There is no direct 'GLUE' value — access must go through a Catalog Integration.

Frequently Asked Questions

What is the difference between an External Volume and an External Stage?

An External Stage points to files in cloud storage that Snowflake loads via COPY INTO. An External Volume, by contrast, specifies the storage location where Snowflake directly reads and writes Apache Iceberg table data (Parquet data files plus metadata). External Stages are for ETL data loading, while External Volumes are the data backend for Iceberg Tables.

Can multiple Iceberg Tables share a single External Volume?

Yes. You can isolate each table's data by subpath within an External Volume. Specifying CATALOG_TABLE_NAME or BASE_LOCATION on CREATE ICEBERG TABLE places the table's data in a distinct directory inside the same External Volume. That said, packing too many tables into one External Volume makes IAM permissions hard to manage, so splitting External Volumes by team or use case is recommended.

Which Snowflake Edition supports External Volumes?

External Volumes and Iceberg Tables are available on Standard Edition and above. Iceberg Tables managed by the Snowflake catalog (where Snowflake performs writes) may require Enterprise Edition or higher. Read-only Iceberg Tables that use an external catalog (such as AWS Glue) are available on all Editions.

Check what you learned with practice questions

Practice with certification-focused question sets

無料で問題を解いてみる
Author

NicheeLab Editorial Team

NicheeLab editorial team focused on data engineering and cloud certification learning. Content is structured around practical study needs and official exam domains.


Related articles
Snowflake

Snowflake Certifications: All 11 Exams Explained (2026)

Every SnowPro certification — Associate, Core, Specialty, Ad...

Snowflake

Snowflake Exam Difficulty Ranking: All 11 Certs Compared (2026)

All 11 SnowPro exams ranked by difficulty with study-time es...

Snowflake

Snowflake Study Guide: Fastest Pass Route by Exam (2026)

How to pass SnowPro certifications efficiently — official ma...

Snowflake

SnowPro Core (COF-C03): Complete Exam Guide (2026)

Pass the SnowPro Core exam — six domains, scope, sample ques...

Snowflake

SnowPro Associate Platform (SOL-C01): Complete Guide (2026)

The entry-level SnowPro Associate exam — scope, weighting, s...

Browse all Snowflake articles (103)
© 2026 NicheeLab All rights reserved.