ステージ(Stage)は、Snowflakeでデータのロード(取り込み)とアンロード(書き出し)を行う際のファイル中間置き場です。COPY INTO文によるバルクロード、Snowpipeによる自動取り込み、データエクスポートなど、ほぼすべてのファイル連携はステージを経由します。SnowPro Core試験ではData Loadingドメインの必須トピックです。
Snowflakeには4種類のステージがあり、用途・管理方法・セキュリティモデルが異なります。
| ステージ種類 | 参照構文 | 作成方法 | GRANT制御 | 主な用途 |
|---|---|---|---|---|
| User Stage | @~ | 自動(ユーザーごと) | 不可 | 個人作業・検証用の一時ファイル置き場 |
| Table Stage | @%table_name | 自動(テーブルごと) | 不可 | 特定テーブル専用の一時ロード |
| Named Internal Stage | @stage_name | CREATE STAGE | 可能 | チーム共有・権限管理が必要なロード/アンロード |
| External Stage | @stage_name | CREATE STAGE | 可能 | S3 / Azure Blob / GCS上の既存データ連携 |
Named Internal StageはSnowflake内部ストレージにファイルを格納するステージです。GRANTで権限制御が可能なため、チーム運用ではUser/Table Stageよりも推奨されます。
-- Named Internal Stageの作成
CREATE OR REPLACE STAGE hr_load_stage
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1 FIELD_OPTIONALLY_ENCLOSED_BY = '"')
COMMENT = 'HR部門のCSVロード用ステージ';
-- ファイルアップロード(SnowSQL / PUT)
PUT file:///data/employees.csv @hr_load_stage AUTO_COMPRESS = TRUE;
-- ステージ上のファイル一覧を確認
LIST @hr_load_stage;
-- ロード実行
COPY INTO hr.employees
FROM @hr_load_stage
PATTERN = '.*employees.*\.csv\.gz'
ON_ERROR = 'CONTINUE';External Stageは、S3・Azure Blob Storage・GCS上の外部ストレージを直接参照するステージです。データをSnowflake内部にコピーせずにロード元として利用できるため、既存データレイクとの連携に最適です。
Storage IntegrationはSnowflakeとクラウドストレージ間のアクセスを、IAMロールベースの委任で安全に管理するオブジェクトです。長期鍵の埋め込みが不要になり、ACCOUNTADMIN権限で一元管理できます。
-- Storage Integrationの作成(ACCOUNTADMIN)
CREATE OR REPLACE STORAGE INTEGRATION s3_integration
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-access'
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('s3://data-lake-prod/raw/', 's3://data-lake-prod/staging/');
-- IAM信頼関係に必要な情報を取得
DESC INTEGRATION s3_integration;
-- External Stageの作成
CREATE OR REPLACE STAGE data_lake_stage
STORAGE_INTEGRATION = s3_integration
URL = 's3://data-lake-prod/raw/'
FILE_FORMAT = (TYPE = PARQUET);COPY INTOはステージからテーブルへのロードと、テーブルからステージへのアンロードの両方向で使用します。
-- ロード:ステージ → テーブル
COPY INTO analytics.orders
FROM @data_lake_stage/orders/2026/03/
FILE_FORMAT = (TYPE = PARQUET)
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
-- アンロード:テーブル → ステージ
COPY INTO @export_stage/monthly_report/
FROM (
SELECT region, SUM(amount) AS total_amount
FROM analytics.orders
WHERE order_date >= '2026-03-01'
GROUP BY region
)
FILE_FORMAT = (TYPE = CSV COMPRESSION = GZIP)
HEADER = TRUE
OVERWRITE = TRUE;| オプション | 用途 | デフォルト値 |
|---|---|---|
| ON_ERROR | エラーファイルの処理方針 | ABORT_STATEMENT |
| PURGE | ロード成功後のファイル自動削除 | FALSE |
| MATCH_BY_COLUMN_NAME | カラム名での自動マッピング | NONE |
| PATTERN | 正規表現でファイル名をフィルタ | (なし) |
| VALIDATION_MODE | ロード前のバリデーション | (なし) |
Named File Formatを事前に定義しておくと、複数のステージやCOPY INTOで一貫したフォーマット設定を再利用できます。
-- Named File Formatの作成
CREATE OR REPLACE FILE FORMAT csv_standard
TYPE = CSV
SKIP_HEADER = 1
FIELD_DELIMITER = ','
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ('NULL', 'null', '')
EMPTY_FIELD_AS_NULL = TRUE;
-- ステージでFile Formatを参照
CREATE OR REPLACE STAGE shared_csv_stage
FILE_FORMAT = csv_standard;Directory Tablesは、ステージ上のファイルメタデータ(ファイルパス・サイズ・最終更新日時等)をテーブルとしてクエリできる機能です。ステージ作成時にDIRECTORY = (ENABLE = TRUE)を指定して有効化します。
-- Directory Table有効化
ALTER STAGE data_lake_stage SET DIRECTORY = (ENABLE = TRUE);
-- メタデータの手動リフレッシュ
ALTER STAGE data_lake_stage REFRESH;
-- Directory Tableのクエリ
SELECT *
FROM DIRECTORY(@data_lake_stage)
WHERE FILE_URL LIKE '%2026/03%'
ORDER BY LAST_MODIFIED DESC;Data Loading / Security
問題 1
チームで共有するS3バケット上のParquetファイルをSnowflakeにロードする構成を設計している。セキュリティ要件として長期鍵をSnowflakeに保存してはならない。最も適切な構成はどれか。
正解: B
長期鍵をSnowflakeに保存しない要件を満たすには、Storage IntegrationでIAMロールベースのアクセス委任を設定し、External Stageから参照する構成が最適です。AWS_KEY_IDの直接指定は長期鍵の埋め込みに該当するため要件を満たしません。Internal Stageを使う場合は事前にファイルをSnowflake内部にPUTする必要があり、既存S3の直接参照にはなりません。
Storage Integrationを使わずにExternal Stageを作成できますか?
はい、AWS_KEY_IDとAWS_SECRET_KEYを直接指定してExternal Stageを作成することも技術的には可能です。ただしクレデンシャルがステージ定義に埋め込まれるため、セキュリティリスクが高くなります。Snowflakeの公式ドキュメントでもStorage Integrationの使用が強く推奨されており、IAMロールベースのアクセス委任によって長期鍵の管理が不要になります。試験でもStorage Integrationが「より安全な選択肢」として問われます。
User StageとTable Stageにはどのような制約がありますか?
User Stage(@~)はユーザーごとに自動作成される個人用ステージで、他のユーザーからはアクセスできません。Table Stage(@%table_name)はテーブルごとに自動作成され、そのテーブルへのCOPY INTO専用です。どちらもCREATE STAGE文なしで利用でき便利ですが、Named Stageと異なりファイルフォーマットの事前定義やGRANT権限の付与ができないため、チーム運用にはNamed Internal Stageが推奨されます。
COPY INTOのロード済みファイルはステージから自動削除されますか?
デフォルトではロード済みファイルはステージに残ります。COPY INTOにPURGE = TRUEオプションを指定すると、ロード成功後にステージ上の対象ファイルが自動的に削除されます。ただしPURGEは部分的にロードされたファイルの判定が難しいケースがあるため、ファイル管理を厳密に行いたい場合はREMOVEコマンドで手動削除する運用も検討します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...