0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

みなさん、こんにちは!

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を作成します。

qiita.rb
CREATE OR REPLACE TABLE employees (
  employee_id STRING,
  first_name STRING,
  last_name STRING,
  email STRING,
  department STRING,
  salary INTEGER
);

また、データロードの前にデータ構造に合うファイル形式を作成しておく必要があります。
以下のSQLを実行し、ファイル形式csv_formatを作成します。

qiita.rb
CREATE OR REPLACE FILE FORMAT csv_format
  TYPE = 'CSV'
  FIELD_DELIMITER = ','
  SKIP_HEADER = 0;

AWS

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

データ取り込み元となるS3バケットを作成します。
image.png

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

samplesフォルダを作成し、そこにemployees.csvをアップロードします。

認証設定

S3アクセス用の認証設定を行います。

IAMコンソールを開き、「ポリシー」から以下のJSON形式ポリシーをもつポリシーを作成します。
<bucket>は対象のバケット、<prefix>は対象のフォルダで置き換えてください。

qiita.rb
{
    "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.png

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

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

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

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

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

次に、Snowflake 側で認証に必要となるクラウドストレージ統合を作成します。

Snowflake にログインし、以下のSQLを実行します。
STORAGE_AWS_ROLE_ARNには先ほど作成したロールのARNを指定し、STORAGE_ALLOWED_LOCATIONSにはロード対象ファイルが存在するディレクトリのパスを指定します。

qiita.rb
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を実行し、作成したクラウドストレージ統合の設定値を確認します。

qiita.rb
DESC INTEGRATION s3_int;

image.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の値を設定します。

qiita.rb
{
    "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.png

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

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

image.png
image.png

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

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

データロード

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

qiita.rb
COPY INTO employees FROM @ext_stage_s3 FILE_FORMAT=csv_format;

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

image.png

GCP

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

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

認証設定

Snowflake で以下のSQLを実行します。

qiita.rb
CREATE STORAGE INTEGRATION gcs_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/');

上記実行後、以下のSQLで設定値を確認します。

qiita.rb
DESC INTEGRATION gcs_int;

image.png

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

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

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

image.png

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

外部ステージ作成

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

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

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

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

データロード

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

qiita.rb
COPY INTO employees FROM @ext_stage_gcs FILE_FORMAT=csv_format;

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

image.png

Azure

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

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

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

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

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

image.png
URLは以下のような形式となっています。

https://<storage_account>.blob.core.windows.net/samples/employees.csv

認証設定

Snowflake で以下のSQLを実行します。

qiita.rb
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.png

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

qiita.rb
DESC INTEGRATION azure_int;

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

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

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

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

image.png

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

image.png

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

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

外部ステージ作成

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

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

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

image.png

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

データロード

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

qiita.rb
COPY INTO employees FROM @ext_stage_azure FILE_FORMAT=csv_format;

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

補足

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

さいごに

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

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?