レック・テクノロジー・コンサルティング株式会社TECH BLOG

Snowflake の外部データ取り込み方法まとめ (AWS・GCP・Azure)

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バケットを作成します。

image.png

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

image-1.png

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>/*"
                    ]
                }
            }
        }
    ]
}

image-2.png

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

image-3.png

次にロールを作成します。

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

image-4.png

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

image-5.png

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

image-6.png

次に、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;

image-7.png

実行結果からSTORAGE_AWS_IAM_USER_ARNSTORAGE_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」を選択します。

image-8.png

ステージ作成画面が開くため、以下の項目を指定します。

  • ステージ名:適当なステージ名
  • URL:ロード対象データがあるS3ディレクトリのURL
  • 認証:ストレージ統合(上記で作成したストレージ統合を選択)

image-9.png

image-10.png

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

作成に成功すると、以下のようにemployees.csvが認識され表示されます。

image-11.png

データロード

以下のSQLを実行し、データをテーブルにロードします。

COPY INTO employees FROM @ext_stage_s3 FILE_FORMAT=csv_format;

上記の実行後、employeesテーブルにデータが入っていることが確認できます。

image-12.png

GCP

GCSバケット作成&アップロード

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

image-13.png

認証設定

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;

image-14.png

実行結果からSTORAGE_GCP_SERVICE_ACCOUNTの値を控えておきます。

GCPのIAMコンソールに移り、「アクセスを許可」をクリックします。設定画面で以下の項目を設定します。

  • 新しいプリンシパルSTORAGE_GCP_SERVICE_ACCOUNTの値
  • ロール:Storage オブジェクト管理者

image-15.png

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

外部ステージ作成

Snowflake に戻り、ステージ作成を行います。
ステージ作成画面で以下の項目を指定します。

  • ステージ名:適当なステージ名
  • URL:ロード対象データがあるGCSディレクトリのURL
  • 認証:ストレージ統合(上記で作成したストレージ統合を選択)

image-16.png

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

image-17.png

外部ステージが作成されました。

データロード

以下のSQLを実行し、データをテーブルにロードします。

COPY INTO employees FROM @ext_stage_gcs FILE_FORMAT=csv_format;

上記の実行後、employeesテーブルにデータが入っていることが確認できます。

image-18.png

Azure

ストレージ作成&アップロード

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

image-19.png

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

image-20.png

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

image-21.png

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

image-22.png

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」で確認可能です。

image-23.png

以下のSQLで設定値を確認します。

DESC INTEGRATION azure_int;

image-24.png

上記のAZURE_CONSENT_URLのリンクをクリックします。

アクセス許可画面にリダイレクトされるので、「承諾」をクリックします。
これにより、Snowflake がストレージアカウントにアクセスするためのアプリケーションが作成されます。

次に、アプリケーションにストレージアカウントに対するロールを付与します。

対象ストレージアカウントの「アクセス制御(IAM)」を開き、「追加」をクリックします。

image-26.png

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

image-27.png

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

image-28.png

「レビューと割り当て」をクリックして完了です。

外部ステージ作成

Snowflake に戻り、ステージ作成を行います。
ステージ作成画面で以下の項目を指定します。

  • ステージ名:適当なステージ名
  • URL:ロード対象データがあるストレージコンテナのURL
  • 認証:ストレージ統合(上記で作成したストレージ統合を選択)

image-29.png

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

image-30.png

外部ステージが作成されました。

データロード

以下のSQLを実行し、データをテーブルにロードします。

COPY INTO employees FROM @ext_stage_azure FILE_FORMAT=csv_format;

上記の実行後、employeesテーブルにデータが入っていることが確認できます。

image-31.png

補足

COPY コマンドによるデータロードではロードの状況が記録されており、同じファイルが立て続けにロードされてもデータが重複して挿入されることはありません。

さいごに

Snowflake の外部データ取り込み方法についてご紹介しました。

ストレージ統合作成 → 認証設定 → 外部ステージ作成 →データロード という流れは共通しているのですが、クラウドプロバイダごとに設定方法や認証方法に若干違いがあり、少しややこしく感じた部分もありました。本記事が外部データ取り込みを行う際の参考になれば幸いです。

参考

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る