AWS GlueでSnowflakeと接続するために必要なこと

# はじめに

AWS GlueでSnowflakeと接続するために必要なことを確認したときの記録です。

# 前提

Snowflakeのアカウントを作成済みである必要があります。

# ゴール

AWS Glue StudioでSnowflakeに接続できるノードを作成できるようになることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/52ff9d22-f5e5-b099-775c-2200f4bb814e.png)


# 必要なこと

    - Snowflake上で以下を実施
        - ロール作成
        - ウェアハウスへのUSAGEアクセス権の付与
        - データベースへのUSAGEアクセス権の付与
        - スキーマへのアクセス権の付与
        - テーブルへの権限の付与
        - ユーザーの作成
        - ユーザーへのロールの付与
    - AWSで以下を実施
        - Secrets ManagerでSnowflakeの認証情報（ユーザー名、パスワード）を使用してシークレットを作成


# やってみた

**Snowflake上で以下を実施**
（[こちらのサイト](https://dev.classmethod.jp/articles/s3-to-snowflake-data-integration-with-glue-studio-snowflake-connectivity/)がとてもわかりやすかったので参考にさせて頂きました。）

```sql:ロール作成（ここではロール名をGLUEJOB_ROLEとする）
CREATE ROLE GLUEJOB_ROLE;
```

```sql:ウェアハウスへのUSAGEアクセス権の付与（ここではウェアハウス名をCOMPUTE_WHとする）
GRANT USAGE ON WAREHOUSE COMPUTE_WH TO ROLE GLUEJOB_ROLE;
```

```sql:データベースへのUSAGEアクセス権の付与（ここではデータベース名をMY_DATABASEとする）
GRANT USAGE ON DATABASE MY_DATABASE TO ROLE GLUEJOB_ROLE;
```

```sql:スキーマへのアクセス権の付与（ここではスキーマとしてPUBLICを使用する）
GRANT USAGE ON SCHEMA MY_DATABASE.PUBLIC TO ROLE GLUEJOB_ROLE;
GRANT CREATE TABLE ON SCHEMA MY_DATABASE.PUBLIC TO ROLE GLUEJOB_ROLE;
```

```sql:テーブルへの権限の付与
GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA PUBLIC TO ROLE GLUEJOB_ROLE;
```

※ 将来的に追加されるテーブルに対しても権限をつけたい場合は「GRANT 〜 ON **FUTURE** TABLES 〜」とする

```sql:ユーザーの作成（ここではユーザー名をGLUEJOB_OPERATORとする）
CREATE USER GLUEJOB_OPERATOR         -- 任意のユーザー名
    PASSWORD = '*******'             -- 任意のパスワード
    DEFAULT_ROLE = 'GLUEJOB_ROLE'    -- 任意のロール名
    DEFAULT_WAREHOUSE = 'COMPUTE_WH' -- 任意のウェアハウス名
    MUST_CHANGE_PASSWORD = FALSE;    -- 初期ログイン時にパスワード変更要求をするかどうか
```

```sql:ユーザーへのロールの付与
GRANT ROLE GLUEJOB_ROLE TO USER GLUEJOB_OPERATOR;
```

**AWSで以下を実施**
- Secrets ManagerでSnowflakeの認証情報（ユーザー名、パスワード）を使用してシークレットを作成
    - 「新しいシークレットを保存する」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/12fe9d42-a089-31dc-4999-70d2e5ee2fe8.png)

    - 「その他のシークレットのタイプ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/690f4de6-370e-b79a-48b8-5043de30d23a.png)

    - 「キー/値のペア」でsfUser、sfPasswordをキーとするペアを入力
    （sfUserはSnowflakeで作成したユーザー、sfPasswordはそのユーザーのパスワード）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/2860efba-21c6-b5f3-341e-2bee785e8350.png)

    - シークレットの名前を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/ebe969b8-76a6-88b6-a3a5-bb5f327b0b8d.png)
（ローテーションスケジュール、ローテーション関数はデフォルトまたは任意の設定でOK）

**AWS Glue StudioでソースノードとしてSnowflakeを指定して接続できることを確認する**

- Snowflake上でテーブル・データを準備
    - テーブルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/c54451e1-9662-6894-66c9-a34cd395673e.png)

    - データを準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/27be038c-c31d-e7bc-dbb7-8b0be437fc2d.png)


- Connectionを作成（図中右側のcreate a new connectionを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9cf1788e-91c9-c7ce-385d-5f6d3c8d94ef.png)

- Snowflakeの接続情報を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/f6aeefa2-6364-4681-bb39-80fa1db9e05c.png)

- 補足：Snowflake URLはここ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/bfbbbc6f-261f-3460-02ca-a15fc25e2ea6.png)

- AWS Glue StudioでSnowflakeのノードを指定してアクセスする

    - Glueジョブを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/b49aab23-0a39-c653-9bf9-7694484b8380.png)

    - Snowflakeのノードを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/055a5af7-f6c5-9f27-6bcd-8e1cd6f7f4f6.png)


# 注意点（つまづいたところ）

- GlueでSnowflakeの接続情報を設定するにあたって、入力するSnowflake URLが違っていたため接続できないということがありました。入力するべきURLは前述の補足説明の通りです。
- GlueからSecrets Managerにアクセスする権限がなく接続できないことがありました。GlueでSecrets Managerを使用するには、AWS Glue の IAM ロールにシークレット値を取得するアクセス許可を付与する必要があります。公式情報「[AWS Secrets Manager への接続認証情報の保存](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/connection-properties-secrets-manager.html)」を参考に設定し解消しました。


# まとめ

AWS Glue StudioでSnowflakeと接続するために必要なこと実施すれば、Snowflakeに接続できるノードを作成でき、Glueを使用してETLができるようになります。