Glue Studio ノートブック と CodeWhisperer でいまどきのETL開発

# [1] はじめに

- **AWS Glue**でETL処理の開発方法はいろいろある
    - **Glue Studio**でGUIベース の NoCode/LowCode な方法
    - **Glue Studioノートブック**でコーディング
    - SageMaker Studio/ノートブックでコーディング
    - その他ローカル環境連携など
- ノートブックでインタラクティブに開発する場合は、**Glue インタラクティブセッション** 機能を利用する
- 流行りの生成AIでコード自動生成支援する **Amazon CodeWhispere** がGlue Studioノートブックと統合されたので、ETL開発にも活用できる
- ここでは、Glue Studioノートブックでより簡単にETLコード開発する方法をまとめる

# [2] Glue インタラクティブセッションとは？
- ノートブックのバックエンドジョブ実行環境として、Glueのサーバーレス環境を使って、インタラクティブに動作確認しながら開発できる機能
- Glueはサーバーレスエンジンなので、基本的にはジョブ実行単位でDPU（コンピュートリソース）が適宜割り当てられるが、インタラクティブに開発したい場合は、セッションを確立してから終了するまでサーバーレスでDPUが起動して随時コードを実行しながら開発ができるイメージ
- なので、課金モデルもセッション単位で稼働したDPU処理時間の従量制課金

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/interactive-sessions-overview.html

# [3] Glue Studio ノートブックとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/0e60a64c-db80-f18b-2c89-d64159af841b.png)

- Glueコンソールで提供されるフルマネージドノートブック機能
- 数クリックで起動できる
- Glue インタラクティブセッション機能と統合されているので、すぐにコードでインタラクティブにETLジョブを開発できる
- 驚きな点として、Glue Studio ノートブックそのものは無料（SageMakerのノートブックはインスタンス実行時間の課金がある点と異なる）
    - 料金サイトより " AWS は、ジョブノートブックでは料金を請求しませんが、使用するインタラクティブセッションでは料金を請求します "
    - https://aws.amazon.com/jp/glue/pricing/

# [4] Amazon CodeWhispererとは？
- 流行りの生成AIで、コメント行を書くだけでコードの自動生成や、その他に脆弱性チェック、コンプライアンスチェックなどをしてくれる便利な支援サービス
- Glue Studioノートブックがサービス統合されて、IAM権限設定だけですぐに使える
- Glue Studioノートブックから利用する際は、追加料金なしで使えるというのもお得
    - What's New より "Amazon CodeWhisperer は追加料金なしで使用でき、AWS Glue Studio ノートブックでリアルタイムのコードの提案を生成できます。"
https://aws.amazon.com/jp/about-aws/whats-new/2023/07/aws-glue-studio-amazon-codewhisperer/

https://aws.amazon.com/jp/blogs/news/build-data-integration-jobs-with-ai-companion-on-aws-glue-studio-notebook-powered-by-amazon-codewhisperer/


# [5] インタラクティブセッション利用に必要な権限設定例

とりあえず動かすための例（実際は適宜要件に応じてLeast Privilegeで調整）
- Glue Studio ノートブックでジョブを作成する際に付与するIAM Roleを作成する
    - ユースケースはGlueとし、信頼ポリシーをアタッチ
    - 以下のマネージドポリシーを含める
        - `AWSGlueServiceRole`
        - `AmazonS3FullAccess`
    - さらにインラインポリシーでPassRoleを追加

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```
https://docs.aws.amazon.com/ja_jp/glue/latest/ug/notebook-getting-started.html

- CodeWhispererを利用する場合は、さらに以下のインラインポリシーを追加

```json
Inline policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CodeWhispererPermissions",
            "Effect": "Allow",
            "Action": [
                "codewhisperer:GenerateRecommendations"
            ],
            "Resource": "*"
        }
    ]
}
```

# [6] Glue Studio ノートブックで開発してみる

### ノートブック起動

まずは `ETL Jobs` - `Notebooks` から「`Jupyter Notebooks`」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/80ca9aeb-2978-58cb-46c3-ddc81c2ecd83.png)

次にジョブ名、あらかじめ作成したIAM ROLE、カーネルを選択して開始する（カーネルはSparkの他にRayが選べる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/a215dd60-3c2f-f2a6-c0b3-1ffd6fad8546.png)

すると、サンプルコード付きのノートブックが立ち上がり、コード開発を開始できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/29f81bb3-0935-a6b1-fbee-8f028d73d0be.png)

### セッションの開始と終了

- 前述の通り、課金はセッション単位となるが、基本的にセルを実行することでセッションが開始される
- サンプルコードを実行すると、初回は下記のようにセッション開始処理が走り、「`Session XXXX has been created`」となればセッションが開始される（課金スタート）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/96036008-a6a9-27c5-a898-449b469aeef5.png)

- アクティブなセッションは「`%session_id`」を実行すると確認できる
- セッションを終了させるには
    - 「`%stop_session`」を実行する
    - 継続アイドル状態の場合は、規定値でタイムアウト（自動切断）する
        - セッションタイムアウト値は「`%idle_timeout`」で設定できる
        - デフォルトは 48 H


### ジョブパラメーターの変更

- ジョブ単位で設定するDPU数やWorker Typeなどのパラメーターは、ノートブックのセル上から`マジック`コマンドで定義する

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/interactive-sessions-magics.html

例）
```sh
# ワーカー数
%number_of_workers 2
# ワーカータイプ
%worker_type G.2X

# その他各種設定（Spark UI、Auto Scalingなどの有効化）
%%configure 
{
  "--enable-spark-ui": "true",
  "--spark-event-logs-path": "s3://suhroyu-demo/glueimmersionday/output/lab3/sparklog/",
  "max_retries": "0",
  "--enable-auto-scaling": "true",
  "--enable-metrics": "true",
  "--enable-continuous-cloudwatch-log": "true",
  "--job-bookmark-option": "job-bookmark-enable"
}

```

これら設定により、下記 `Job details` タブに反映される
（ノートブックの場合はGUIからは変更できない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/366e4b62-4df3-d452-f42c-b0f40a6285cc.png)

**注意事項）**

すでにセッション開始済みの状態でパラメーターを変更した場合は、以下のようにアラートが出るので、一度「`%stop_session`」でセッションを停止し再開（再実行）すると、新しいセッションで変更が反映される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/854f2b74-fee4-5346-8cb6-3c39bfc614e0.png)

### 任意のライブラリの追加

Pythonモジュールはマジックコマンドの `%additional_python_modules`で追加できる

例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/17c69c29-ef6c-d55d-ec00-58f86e027299.png)

ちなみにGlueでビルトインで対応しているPythonモジュールはこちら参照

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-python-libraries.html

その他、独自ライブラリ含めて.pyファイルをzipで丸めてS3に格納して、`--additional-python-modules`オプションで指定して取り込む方法などもある

### Glue データカタログへの接続

Glue データカタログのデータに対してノートブックから Spark SQL でアクセスしたり、CREATE TABLEしたり操作ができる

※ 下記はGlue Immersion Day のサンプルデータでクエリしてみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/7ed53d46-177c-73c5-0b6f-daf24108befe.png)

データの実態（csv）はS3にあり、メタデータがHIVEメタストア互換のGlueデータカタログに登録済みの状態。データソースのデータをクエリしながら開発できる点は便利。

### CodeWhispererの設定

CodeWhispererは前述のIAM権限の設定さえできていれば特別な設定は不要ですぐに使える。
ノートブックの下のメニューから、コード提案機能の一時停止など各種設定もできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/2c13787b-a479-7149-63d4-f652337c9696.png)

**Share telemetry with AWS について**
CodeWhispererでは「Share telemetry with AWS」が有効の場合、サービス向上の目的でクライアント側のテレメトリ情報を送信する（一般的にも色々なサービスでよく見かけるヤツ）
ただし、実際のコードや、IPアドレスなどのPII情報は含まれない。無効にすることでオプトアウトできる。

https://docs.aws.amazon.com/ja_jp/codewhisperer/latest/userguide/sharing-data.html

**Code with References について**
CodeWhispererでは、推奨されたコードがOSSのコードと類似している場合に参照元を提示する機能がある。これを有効化することで参照元が提示されます。

### ジョブの実行

- 手っ取り早くジョブを実行するなら、ノートブック右上の`Run`を実行する。
- ジョブの実行状況は他のジョブと同様にモニタリング機能で確認できる
- 定期実行したい場合は、`Schedules`タブからcron形式などで制御できる（`Trigger`機能と統合）
- もっとリッチに制御するなら、Workflow機能や、その他サービス（StepFunctions、MWAA、EventBridge）連携などが考えられる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/4449e272-783f-cafd-4588-56c3dcbc113e.png)


### コードのバージョン管理

開発したコードは、CodeCommit、GitHubと連携してgitでバージョン管理できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/5771cccc-a95c-9f83-6127-209153bf48f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/b2f5a88f-771a-d6a8-0b59-d9e99e5eabcf.png)

# まとめ

Glue StudioのGUIでNoCode/LowCodeも非常に便利だが、コードのみで開発したい場合はインタラクティブセッション機能が統合されたGlue Studioノートブックも使い勝手もコストパフォーマンスも良い。また、コードのバージョン管理やジョブの実行制御、モニタリングまで、実運用に必須の機能が充実している。

# その他参考情報

https://catalog.us-east-1.prod.workshops.aws/workshops/ee59d21b-4cb8-4b3d-a629-24537cf37bb5/ja-JP

https://www.youtube.com/watch?v=5fbdx849AYw