AWS/GCP/Azure上にあるデータを Snowflake に取り込む方法についてまとめました。
それぞれの環境からデータを取り込むための具体的な方法と手順について、画像付きで詳しくご紹介します。
※本記事の操作はすべてACCOUNTADMINロールで行っています。
準備
テスト用に以下のサンプルCSVファイルemployees.csvを使用します。
1001,John,Doe,john.doe@example.com,Engineering,75000
1002,Jane,Smith,jane.smith@example.com,Marketing,65000
1003,Emily,Jones,emily.jones@example.com,Sales,70000
1004,Michael,Brown,michael.brown@example.com,HR,60000
1005,Jessica,Johnson,jessica.johnson@example.com,Finance,80000
データロードの前にテーブルを用意しておきます。
ワークシートで以下のSQLを実行し、テーブルemployeesを作成します。
CREATE OR REPLACE TABLE employees (
employee_id STRING,
first_name STRING,
last_name STRING,
email STRING,
department STRING,
salary INTEGER
);
また、データロードの前にデータ構造に合うファイル形式を作成しておく必要があります。
以下のSQLを実行し、ファイル形式csv_formatを作成します。
CREATE OR REPLACE FILE FORMAT csv_format
TYPE = 'CSV'
FIELD_DELIMITER = ','
SKIP_HEADER = 0;
AWS
S3バケット作成&アップロード
データ取り込み元となるS3バケットを作成します。

バケット名はsnowflake-load-test-20250313とし、その他の設定はデフォルトのままとしています。

samplesフォルダを作成し、そこにemployees.csvをアップロードします。
認証設定
S3アクセス用の認証設定を行います。
IAMコンソールを開き、「ポリシー」から以下のJSON形式ポリシーをもつポリシーを作成します。
<bucket>は対象のバケット、<prefix>は対象のフォルダで置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<bucket>",
"Condition": {
"StringLike": {
"s3:prefix": [
"<prefix>/*"
]
}
}
}
]
}

適当なポリシー名を指定し、ポリシーを作成します。

次にロールを作成します。
ロールの作成画面で「信頼されたエンティティタイプ」として「AWSアカウント」を選択します。「AWSアカウント」は「このアカウント」のままで、「オプション」は「外部IDを要求する」にチェックを入れておき、外部IDには「0000」と入力しておきます(AWSアカウント、外部IDは後で修正するため仮置きとして設定しています)。

「次へ」をクリックし、許可ポリシーで先ほど作成したポリシーを指定します。

「次へ」をクリックし、適当なロール名を指定してロールを作成します。

次に、Snowflake 側で認証に必要となるクラウドストレージ統合を作成します。
Snowflake にログインし、以下のSQLを実行します。
STORAGE_AWS_ROLE_ARNには先ほど作成したロールのARNを指定し、STORAGE_ALLOWED_LOCATIONSにはロード対象ファイルが存在するディレクトリのパスを指定します。
CREATE STORAGE INTEGRATION s3_int
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
STORAGE_AWS_ROLE_ARN = '<iam_role>'
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/');
以下のSQLを実行し、作成したクラウドストレージ統合の設定値を確認します。
DESC INTEGRATION s3_int;

実行結果からSTORAGE_AWS_IAM_USER_ARNとSTORAGE_AWS_EXTERNAL_IDの値を控えておきます。
AWSのIAMコンソールに戻り、先ほど作成したロールの「信頼関係」→「信頼ポリシーを編集」からJSON形式のポリシーを修正します。
<snowflake_user_arn>にSTORAGE_AWS_IAM_USER_ARNの値を、<snowflake_external_id>にSTORAGE_AWS_EXTERNAL_IDの値を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<snowflake_user_arn>:"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<snowflake_external_id>"
}
}
}
]
}
設定したら「ポリシーを更新」をクリックします。以上でAWS側の設定は完了です。
外部ステージ作成
Snowflake 外部からデータをロードするにあたり、ロード対象データを示す外部ステージを作成する必要があります。
「データ」→「データベース」からステージ作成対象のスキーマに移動し、「作成」ボタンから「ステージ」→「Amazon S3」を選択します。

ステージ作成画面が開くため、以下の項目を指定します。
- ステージ名:適当なステージ名
- URL:ロード対象データがあるS3ディレクトリのURL
- 認証:ストレージ統合(上記で作成したストレージ統合を選択)


設定が完了したら「作成」ボタンをクリックします。
作成に成功すると、以下のようにemployees.csvが認識され表示されます。

データロード
以下のSQLを実行し、データをテーブルにロードします。
COPY INTO employees FROM @ext_stage_s3 FILE_FORMAT=csv_format;
上記の実行後、employeesテーブルにデータが入っていることが確認できます。

GCP
GCSバケット作成&アップロード
GCSバケットとディレクトリを作成し、ファイルをアップロードします。

認証設定
Snowflake で以下のSQLを実行します。
CREATE STORAGE INTEGRATION gcs_int
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'GCS'
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/');
上記実行後、以下のSQLで設定値を確認します。
DESC INTEGRATION gcs_int;

実行結果からSTORAGE_GCP_SERVICE_ACCOUNTの値を控えておきます。
GCPのIAMコンソールに移り、「アクセスを許可」をクリックします。設定画面で以下の項目を設定します。
- 新しいプリンシパル:
STORAGE_GCP_SERVICE_ACCOUNTの値 - ロール:Storage オブジェクト管理者

設定が完了したら「保存」をクリックします。
外部ステージ作成
Snowflake に戻り、ステージ作成を行います。
ステージ作成画面で以下の項目を指定します。
- ステージ名:適当なステージ名
- URL:ロード対象データがあるGCSディレクトリのURL
- 認証:ストレージ統合(上記で作成したストレージ統合を選択)

設定が完了したら「作成」をクリックします。

外部ステージが作成されました。
データロード
以下のSQLを実行し、データをテーブルにロードします。
COPY INTO employees FROM @ext_stage_gcs FILE_FORMAT=csv_format;
上記の実行後、employeesテーブルにデータが入っていることが確認できます。

Azure
ストレージ作成&アップロード
ストレージアカウントのコンソールを開き、ストレージアカウントを作成します。基本設定以外はデフォルトのままとします。

ストレージアカウントの作成が完了したら「コンテナ」でファイルアップロード対象となるコンテナ(samplesコンテナ)を新規作成します。

コンテナにファイルをアップロードします。

アップロードしたファイルのメニューから「プロパティ」をクリックして開くと、URLを取得することができます。

URLは以下のような形式となっています。
https://<storage_account>.blob.core.windows.net/samples/employees.csv
認証設定
Snowflake で以下のSQLを実行します。
CREATE STORAGE INTEGRATION azure_int
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'AZURE'
ENABLED = TRUE
AZURE_TENANT_ID = '<tenant_id>'
STORAGE_ALLOWED_LOCATIONS = ('azure://<storage_account>.blob.core.windows.net/<path>/');
※<tenant_id>は Azure ポータルから「Microsoft Entra ID」を開き、概要の「テナントID」で確認可能です。

以下のSQLで設定値を確認します。
DESC INTEGRATION azure_int;

上記のAZURE_CONSENT_URLのリンクをクリックします。
アクセス許可画面にリダイレクトされるので、「承諾」をクリックします。
これにより、Snowflake がストレージアカウントにアクセスするためのアプリケーションが作成されます。
次に、アプリケーションにストレージアカウントに対するロールを付与します。
対象ストレージアカウントの「アクセス制御(IAM)」を開き、「追加」をクリックします。

ロールの割り当ての追加で、「ストレージ BLOB データ共同作成者」をクリックして次へ進みます。
※ロードのみの場合は「ストレージ BLOB データ閲覧者」でも問題ありません。

「メンバーを選択する」をクリックし、AZURE_MULTI_TENANT_APP_NAMEに記載のアプリケーションを選択します。

「レビューと割り当て」をクリックして完了です。
外部ステージ作成
Snowflake に戻り、ステージ作成を行います。
ステージ作成画面で以下の項目を指定します。
- ステージ名:適当なステージ名
- URL:ロード対象データがあるストレージコンテナのURL
- 認証:ストレージ統合(上記で作成したストレージ統合を選択)

設定が完了したら「作成」をクリックします。

外部ステージが作成されました。
データロード
以下のSQLを実行し、データをテーブルにロードします。
COPY INTO employees FROM @ext_stage_azure FILE_FORMAT=csv_format;
上記の実行後、employeesテーブルにデータが入っていることが確認できます。

補足
COPY コマンドによるデータロードではロードの状況が記録されており、同じファイルが立て続けにロードされてもデータが重複して挿入されることはありません。
さいごに
Snowflake の外部データ取り込み方法についてご紹介しました。
ストレージ統合作成 → 認証設定 → 外部ステージ作成 →データロード という流れは共通しているのですが、クラウドプロバイダごとに設定方法や認証方法に若干違いがあり、少しややこしく感じた部分もありました。本記事が外部データ取り込みを行う際の参考になれば幸いです。



