Snowflake

Snowflake Storage Integrationsで実現する外部ステージの安全な認証

2026-03-26
更新: 2026-03-27
NicheeLab編集部
目次
  1. Storage Integrationの仕組み
  2. 認証フロー(AWS S3の場合)
  3. CREATE STORAGE INTEGRATION(AWS S3)
  4. CREATE STORAGE INTEGRATION(Azure Blob)
  5. CREATE STORAGE INTEGRATION(GCS)
  6. DESCRIBE INTEGRATIONの出力
  7. IAM Trust Policy設定(AWS)
  8. External Stageの作成
  9. 直接認証 vs Storage Integration 比較表
  10. 権限モデル
  11. トラブルシューティング
  12. サンプル問題
  13. よくある質問

Storage Integrationは、Snowflakeが外部クラウドストレージ(S3・Azure Blob・GCS)へアクセスする際の認証を一元管理するオブジェクトです。ステージ定義にアクセスキーやシークレットを埋め込む代わりに、クラウドプロバイダ側のIAMロールやサービスプリンシパルへのアクセス委任を設定することで、長期鍵の配布・管理が不要になります。

Storage Integrationの仕組み

Storage Integrationを作成すると、Snowflakeは内部的にクラウドプロバイダ固有のサービスアカウント(AWSの場合はIAMユーザーARN)を生成します。このサービスアカウントに対してクラウド側でロールの引き受け(Assume Role)を許可するTrust Policyを設定することで、Snowflakeが安全にストレージへアクセスできるようになります。

概念説明
Storage IntegrationSnowflakeアカウントレベルの認証オブジェクト
STORAGE_ALLOWED_LOCATIONSアクセスを許可するクラウドストレージパスのリスト
STORAGE_BLOCKED_LOCATIONSallowed内でもアクセスを拒否するパスのリスト
External StageStorage Integrationを参照するステージ定義
DESCRIBE INTEGRATIONSnowflakeが生成したIAM ARN / External IDの確認コマンド

認証フロー(AWS S3の場合)

┌──────────────────────┐
│  Snowflake           │
│  Storage Integration │
│  (STORAGE_AWS_IAM_   │
│   USER_ARN を保持)   │
└────────┬─────────────┘
         │ 1. Assume Role リクエスト
         │    (External ID を付与)
         ▼
┌──────────────────────┐
│  AWS IAM Role        │
│  (Trust Policy で    │
│   Snowflake ARN +    │
│   External ID を許可)│
└────────┬─────────────┘
         │ 2. 一時クレデンシャル発行
         ▼
┌──────────────────────┐
│  S3 Bucket           │
│  /orders/            │
│  (IAM Roleの権限で   │
│   読み取り/書き込み)  │
└──────────────────────┘

CREATE STORAGE INTEGRATION(AWS S3)

-- AWS S3用 Storage Integration
CREATE OR REPLACE STORAGE INTEGRATION s3_orders_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-access-role'
  STORAGE_ALLOWED_LOCATIONS = (
    's3://company-data-lake/orders/',
    's3://company-data-lake/returns/'
  )
  STORAGE_BLOCKED_LOCATIONS = (
    's3://company-data-lake/orders/secrets/'
  );

CREATE STORAGE INTEGRATION(Azure Blob)

-- Azure Blob Storage用 Storage Integration
CREATE OR REPLACE STORAGE INTEGRATION azure_data_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = 'a]1b2c3d4-e5f6-7890-abcd-ef1234567890'
  STORAGE_ALLOWED_LOCATIONS = (
    'azure://myaccount.blob.core.windows.net/data-container/input/'
  );

CREATE STORAGE INTEGRATION(GCS)

-- Google Cloud Storage用 Storage Integration
CREATE OR REPLACE STORAGE INTEGRATION gcs_analytics_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = (
    'gcs://analytics-bucket/raw/',
    'gcs://analytics-bucket/processed/'
  );

DESCRIBE INTEGRATIONの出力

Storage Integration作成後、DESCRIBE INTEGRATIONでSnowflakeが生成したサービスアカウント情報を取得します。この値をクラウド側のTrust Policyに設定します。

DESC INTEGRATION s3_orders_int;

-- 主要な出力項目(AWSの場合)
-- ┌─────────────────────────────┬──────────────────────────────────────┐
-- │ property                    │ property_value                       │
-- ├─────────────────────────────┼──────────────────────────────────────┤
-- │ STORAGE_AWS_IAM_USER_ARN    │ arn:aws:iam::987654321098:user/abc123│
-- │ STORAGE_AWS_EXTERNAL_ID     │ ABC123_SFCRole=2_dGVzdA==            │
-- │ STORAGE_ALLOWED_LOCATIONS   │ s3://company-data-lake/orders/,...   │
-- │ STORAGE_BLOCKED_LOCATIONS   │ s3://company-data-lake/orders/sec... │
-- └─────────────────────────────┴──────────────────────────────────────┘

IAM Trust Policy設定(AWS)

DESCRIBE INTEGRATIONで取得したSTORAGE_AWS_IAM_USER_ARNとSTORAGE_AWS_EXTERNAL_IDをAWS側のIAMロールのTrust Policyに設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::987654321098:user/abc123"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "ABC123_SFCRole=2_dGVzdA=="
        }
      }
    }
  ]
}

IAMロールにはS3バケットへのGetObject / ListBucket(読み取り)、必要に応じてPutObject / DeleteObject(書き込み)の権限を付与します。

External Stageの作成

-- Storage Integrationを参照するExternal Stage
CREATE OR REPLACE STAGE ext_orders_stage
  URL = 's3://company-data-lake/orders/'
  STORAGE_INTEGRATION = s3_orders_int
  FILE_FORMAT = (TYPE = 'PARQUET');

-- ステージ上のファイル確認
LIST @ext_orders_stage;

-- データロード
COPY INTO ORDERS
  FROM @ext_orders_stage
  PATTERN = '.*\.parquet'
  ON_ERROR = 'CONTINUE';

-- データアンロード
COPY INTO @ext_orders_stage/export/
  FROM ORDERS
  FILE_FORMAT = (TYPE = 'PARQUET')
  HEADER = TRUE;

直接認証 vs Storage Integration 比較表

観点直接認証(鍵埋め込み)Storage Integration
セキュリティ低い(平文鍵がステージ定義に露出)高い(IAMロール委任、鍵なし)
鍵管理手動ローテーション必要一時クレデンシャル自動発行
鍵ローテーションステージ再作成が必要不要(クラウド側のみ管理)
アクセス範囲鍵の権限に依存ALLOWED/BLOCKED_LOCATIONSで制御
複数ステージの共有各ステージに鍵を設定1つのIntegrationを複数ステージで共有
推奨度非推奨(レガシー)推奨(公式ベストプラクティス)

権限モデル

操作必要な権限対象ロール
CREATE INTEGRATIONCREATE INTEGRATION(アカウントレベル)ACCOUNTADMIN または委任ロール
ALTER / DROP INTEGRATIONOWNERSHIP ON INTEGRATIONIntegration所有ロール
ステージで参照USAGE ON INTEGRATIONステージ作成ロール
DESCRIBE INTEGRATIONUSAGE ON INTEGRATION設定確認者
-- 権限付与の例
-- ACCOUNTADMINがIntegrationを作成
USE ROLE ACCOUNTADMIN;
CREATE STORAGE INTEGRATION s3_orders_int ...;

-- データエンジニアロールにUSAGE権限を付与
GRANT USAGE ON INTEGRATION s3_orders_int TO ROLE DATA_ENGINEER;

-- DATA_ENGINEERがステージを作成
USE ROLE DATA_ENGINEER;
CREATE STAGE ext_orders
  URL = 's3://company-data-lake/orders/'
  STORAGE_INTEGRATION = s3_orders_int;

トラブルシューティング

エラー / 症状原因対処
Failure using stage area. Cause: Access DeniedIAMロールのTrust PolicyにSnowflakeのARNが未設定DESC INTEGRATIONのSTORAGE_AWS_IAM_USER_ARNをTrust Policyに設定
External ID mismatchTrust PolicyのExternalIdがDESC出力と不一致STORAGE_AWS_EXTERNAL_IDを正確にコピーして再設定
Insufficient privileges on integrationステージ作成ロールにUSAGE権限なしGRANT USAGE ON INTEGRATION ... TO ROLE ...
ListBucket Access DeniedIAMポリシーにs3:ListBucket権限なしIAMポリシーにListBucket権限を追加(Resource: バケットARN)
KMS Access DeniedSSE-KMS暗号化バケットでKMS権限不足IAMポリシーにkms:Decrypt / kms:GenerateDataKeyを追加
指定パスにファイルが見えないSTORAGE_ALLOWED_LOCATIONSとステージURLのパスが不一致URLがALLOWED_LOCATIONSのプレフィックス範囲内か確認

サンプル問題

Architect / Data Engineer

問題 1

あるチームがS3上のParquetファイルをSnowflakeにロードするためにExternal Stageを作成しました。CREATE STAGE文でSTORAGE_INTEGRATIONパラメータを指定しています。しかしLIST @stageを実行すると「Access Denied」エラーが発生します。Storage IntegrationのDESCRIBE結果は正常に取得できています。最も可能性の高い原因はどれですか?

  1. AWS IAMロールのTrust PolicyにDESCRIBE INTEGRATIONで取得したSTORAGE_AWS_IAM_USER_ARNとSTORAGE_AWS_EXTERNAL_IDが設定されていない
  2. ステージのFILE_FORMATがCSVに設定されているためParquetが読めない
  3. ウェアハウスが起動していないためステージにアクセスできない
  4. STORAGE_BLOCKED_LOCATIONSにS3バケット全体が指定されている

正解: A

DESCRIBE INTEGRATIONが正常に取得できていることから、Snowflake側のIntegration設定自体は正しいことがわかります。Access DeniedエラーはAWS側の権限問題を示しており、最も一般的な原因はIAMロールのTrust PolicyにSnowflakeのサービスアカウント(STORAGE_AWS_IAM_USER_ARN)とExternalId(STORAGE_AWS_EXTERNAL_ID)が正しく設定されていないことです。BのFILE_FORMATはデータ解析時のエラーであり、LIST(ファイル一覧取得)では影響しません。CのウェアハウスはLISTコマンドには必要ですが、エラーメッセージが「Access Denied」であることからウェアハウスの問題ではありません。DのBLOCKED_LOCATIONSにバケット全体を指定するとIntegration作成時にエラーになるため、この時点では発生しません。

よくある質問

Storage IntegrationなしでExternal Stageを作成することは可能ですか?

技術的にはAWS_KEY_IDとAWS_SECRET_KEYを直接指定してExternal Stageを作成できます。しかしクレデンシャルがステージ定義に平文で埋め込まれるため、SHOW STAGESで他のロールに見える可能性がありセキュリティリスクが高くなります。Snowflake公式ドキュメントではStorage Integrationの使用が強く推奨されており、IAMロールベースのアクセス委任によって長期鍵の管理が不要になります。試験でもStorage Integrationが「より安全な選択肢」として問われます。

STORAGE_ALLOWED_LOCATIONSとSTORAGE_BLOCKED_LOCATIONSの関係は?

STORAGE_ALLOWED_LOCATIONSはStorage Integrationがアクセスを許可するクラウドストレージパスの明示的リストです。STORAGE_BLOCKED_LOCATIONSはallowed内であっても特定のサブパスへのアクセスを拒否するための除外リストです。例えばs3://data-bucket/全体を許可しつつ、s3://data-bucket/secrets/は除外するといった設定が可能です。この2つを組み合わせることで、最小権限の原則に基づいた細かなアクセス制御を実現します。

複数のStorage Integrationを使い分けるベストプラクティスは?

環境分離(本番/検証/開発)ごとにStorage Integrationを分けるのが推奨パターンです。各IntegrationのSTORAGE_ALLOWED_LOCATIONSに対応するバケットパスだけを許可し、USAGE ON INTEGRATION権限を環境別のロールに付与します。これにより開発者が誤って本番バケットへアクセスするリスクを排除できます。また、監査の観点でもIntegration単位でACCOUNT_USAGE.ACCESS_HISTORYからアクセスログを分離追跡しやすくなります。

クラウドの基礎から読む

資格の話をしない、クラウドそのものの入門 8 章があります。登録なしで全部読めます。

第 0 部・無料

クラウド自体がはじめての方へ

サーバー・ネットワーク・データベースの前提知識なしで読める 8 章。登録不要・無料。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。SnowparkとDat...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate(SOL-C01)完全解説|現在は予約不可・試験内容と次の受験先

SnowPro Associate: Platform(SOL-C01)は2026年10月時点でSnowflakeの公式...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.