みなさん、こんにちは!
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バケット作成&アップロード
バケット名は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を取得することができます。
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 の外部データ取り込み方法についてご紹介しました。
ストレージ統合作成 → 認証設定 → 外部ステージ作成 →データロード という流れは共通しているのですが、クラウドプロバイダごとに設定方法や認証方法に若干違いがあり、少しややこしく感じた部分もありました。本記事が外部データ取り込みを行う際の参考になれば幸いです。