Glue Studioのネイティブ機能でSnowflakeに接続する（プレビュー機能）

:::note info
2023年7月25日にGAされたようです。本記事はプレビューの時に試してみた記事であるため、現在のGA版と仕様が異なる可能性がありますのでご注意ください。
:::

https://aws.amazon.com/jp/about-aws/whats-new/2023/07/snowflake-connectivity-aws-glue-apache-spark/?nc1=h_ls

# やりたいこと
Glue StudioのデータソースでSnowflakeが選択できるようになったようです（2023/6/27時点でプレビュー、米国東部 (オハイオ)、米国東部 (バージニア北部)、米国西部 (オレゴン)のみ）。以前はカスタムコネクタを作成しなくてはなりませんでしたが、接続を作成すればGlue Studioの純粋な機能だけで接続してデータをロードできるようになりました。

https://aws.amazon.com/about-aws/whats-new/2023/06/aws-glue-native-snowflake-connectivity-etl-capabilities-preview/

これを使って、データをロードしてみようと思います。

# 前提条件
Snowflake側にDB、スキーマ、テーブルを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/4897615d-d0e1-41ec-cf06-b416c6c2b911.png)
テーブルの中身は、この3行です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/f29dac69-de22-cf95-033f-dc81d00d3b77.png)

また、AWSアカウントはプレビューのこの機能が利用できる**バージニア北部リージョン**で実施します。

# やってみる
## Secret Managerでシークレットの作成
Secret Managerで以下のようにシークレットを作成します。
ユーザー名は`sfUser`、パスワードは`sfPassword`がキーとなるので注意。[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/glue/latest/ug/creating-snowflake-connection.html)に記載があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3f7dfdd7-7e92-579e-f166-4a3a4e91828e.png)

ユーザー名とパスワードですが、Snowflake側メインページの左上の自身のアイコン→Profile で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/67423ed2-b126-53ea-12fa-fdebdcfbfc31.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/eda4f0db-e7d7-6c01-9548-2fd9196750e1.png)

## Connectionの作成
次は、GlueのコンソールからConnectionを作成します。
Connectorsのページから、「Create connection」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/817ad6a8-41b6-cdfa-908e-dd59e3105cc6.png)

以下のように入力し、Connectionを作成します。
Connection typeのところが、今回のupdateで追加されたSnowflakeのコネクタータイプですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/abdca870-2d5e-a8da-e01e-34dbec74da06.png)

上記の中のSnowflake URLですが、Snowflakeメインページの左下から自身のアカウント識別子をクリックし、さらに画像の赤枠のクリップマークを押すとSnowflake URLがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/01299f7e-e933-7d7b-d298-4df0493f6032.png)

## ジョブの作成
いよいよジョブの作成です。
Glue StudioのSourceのノードの中にSnowflakeがいますね。これを利用してジョブを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/27d0ec2a-6148-5e1d-7243-7d214e4339c9.png)

Snowflakeのノードですが、以下のように設定します。
Snowflake connectionは先ほど作成したConnectionを選択します。
Database, Schema, Tableは事前に作成したそれぞれの名前を入力します。
S3の方は、parquetでS3に出力する設定を入れています（画像は省略）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6403dde5-21fc-7c57-80e9-b41e7d3b3094.png)

ジョブの作成中に、Data PreviewタブからSnowflakeのテーブルの値が見られました！接続に成功していますね。
作成中にこのようにSnowflakeのテーブルの値が見られるのは嬉しいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3c9d027e-163b-32cb-47cd-2eef2f4c6634.png)

このジョブを実行してみたところ、実行は成功してS3にparquetファイルが出力されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/001199d4-43a0-cc9f-8f2b-96a42f2d4c34.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/b7f93c48-525f-00dd-1211-9fbd7a6cc621.png)
お試しで1つのparquetファイルを除いてみた結果、スキーマも無事元のテーブルのカラム名と同じになっていそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/65b9f9e2-1ade-c130-980c-4e2f9ebb20c7.png)

## 注意点
今回はSecret Managerを利用したので、Glueのジョブが利用するロールにシークレットへの読み取りアクセスの許可を付与しなくてはいけません。これをしないで、一度ジョブがエラーとなってしまいました。
今回は、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/iam-policy-examples-asm-secrets.html)を参考に以下のようなインラインポリシーを作成し付与したところ、、うまく動きました。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecretname"
            ]
        }
    ]
}
```

# おわりに
Snowflakeからのデータロードは今までも出来てはいましたが、今回のupdateでより簡単にできるようになりました。色々なデータソースからまずはS3に持ってこれればAWS上での分析が捗るので、今後もよく使われるデータソースからのロードはどんどん簡単になっていってほしいですね。
次は、Snowflakeのテーブルに対して、ブックマーク機能を利用しての増分のみロードする方法も実施してみたいです。