AWS GlueでS3からSnowflakeにデータを連携する

# はじめに

SnowflakeではSnowpipeを使用してS3からテーブルにデータを取り込むような方法がありますが、AWS Glueを使用してS3からSnowflakeにデータを連携する方法を確認するために検証した内容を記します。

# 前提

検証の前提として以下を実施済みの状態にしています。

- GlueでS3にアクセスできる
    - GlueへのIAMユーザー・IAMロールの設定
    - Glueへのデフォルトサービス設定（S3へのアクセス権限を付与）
- GlueからSnowflakeにアクセスできる（[参考:Snowflake 接続](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-snowflake-home.html])）
    - Snowflake上で以下を実施
        - ロール作成
        - ウェアハウスへのUSAGEアクセス権の付与
        - データベースへのUSAGEアクセス権の付与
        - スキーマへのアクセス権の付与
        - テーブルへの権限の付与
        - ユーザーの作成
        - ユーザーへのロールの付与
    - AWS上で以下を実施
        - Secrets ManagerでSnowflakeの認証情報（ユーザー名、パスワード）を使用してシークレットを作成

# やってみた

- S3にCSVファイルを準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/42af6e79-65b6-e164-bcf6-b0b29fe071ad.png)

```:サンプルファイル
ID,COL1,COL2
1,"aaa","aaaaa"
2,"bbb","bbbbb"
3,"ccc","ccccc"
4,"ddd","ddddd"
5,"eee","eeeee"
```

- AWS Glue Studioでジョブを作成

    - Visual ETLを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/74f7df62-adf0-4c40-90ea-99401d10fe3b.png)

    - ジョブ名を編集
（ここではS3toSnowTest）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/ce064bae-6f61-8775-0477-97f14f68b5b2.png)

    - SourceノードとしてAmazon S3を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/f2e3ecfd-1434-a78b-e2be-d1bce3cab943.png)

    - 対象オブジェクトのS3 URLやData Format、引用符の種類、タイトル行有無などを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/acffe729-4430-40d8-27d1-99cab6913805.png)

    - TransformノードとしてSQL Queryを選択（何も変換なしだとつまらないので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0ed26c77-238e-345f-c72a-d21564411879.png)

    - SQLを編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/7d7c68ae-36c7-6b3b-1b39-db5e1c946c73.png)

    - TransformノードとしてSnowflakeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/86021ddd-7a6b-57c4-cd23-9ba04451efb0.png)

    - 検証前に作成済みのSnowflakeのConnection、Database、Schema、Tableを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/be7b5099-f6bb-8dfe-9167-12c146f43fd1.png)

    - 実施するアクションとしては Drop and recreate target tableを選択（Snowflake側には指定したTableがない状態）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/22bac686-267a-aed5-9ed0-861200f67aa1.png)

- AWS Glue Studioでジョブを実行

    - ジョブを保存（Save)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0e2c1f1e-bc33-8044-63f6-43a9099ff01e.png)
    - ジョブを実行（Run）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9ac920f7-62fa-f7f8-c8ca-3b43082cddf7.png)

- AWS Glue Studioでジョブの実行結果を確認

    - 実行後の状態を確認（→成功を確認）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9eac84e8-7dd2-c981-5110-c2a1a76e246c.png)

- Snowflake側へのデータ連携結果をSnowsight（SnowflakeのWebUI）で確認

    - Glueジョブ作成時に指定したテーブルが作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/64a06295-62ad-06b8-dac5-5a45443a1a08.png)

    - Glueジョブ作成時に指定したSQLで抽出されたデータが反映されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/a4c751ec-1d1a-81e2-5904-99fd5babd847.png)

# まとめ

S3からSnowflakeへのデータ連携は、SnowSQLやSnowsightでも実施可能ですが、AWS Glue StudioでのGUI操作でも実施できることが確認できました。あくまでGUIでやりたい方、Glueに慣れている方には参考になるかと思います。