Glueはじめの一歩

## はじめに
　最近、事業会社のIT部門で働いていますが、なんでもパートナー企業にお願いするのではなく、簡単なことは内製で対応したいと思っています。もちろん難しい事は品質を保つためにもプロの方に任せます。今回は他システムへデータ連携を行う必要があるのですが、Glueを使ってサクッとやってみたいと思います。

## この記事の対象者
AWSの資格を取ったけど、実務経験がない人
要するに、AWSをちょっと知ってる人

## 作るもの
こんな感じで、すごくシンプルな構成を考えます。
とりあえず動かしてから覚える・・・これが事業会社の情シス向けなやり方だと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/29f28422-43c3-66a7-5687-30d474c3517b.png)

「トランザクションデータを分析するため、DWHにデータ連携してほしい」
と、いう要望に対して、わざわざパートナー企業にお願いせず（コストをかけず）サクッと内製でできたらカッコイイという感覚です。
:sweat:レベル低くてすみません:bow:

## 前提
既にAurora PostgreSQLが立っている前提で話を進めます。AWS上に何かしらRDBMSが動いていて通信できれば問題ないと思います。その他、GlueからアクセスすることができるS3を用意してください。

## まずはロール作成
Glueが動作するためのサービスロールを作成します。Glueのサービス自体の動作と、GlueがデータベースやS3にアクセスするためポリシーを設定します。
- 「ロールを作成」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/198e107f-e11e-03f4-eb33-d0bc176f8537.png)
<br>


- 信頼されたエンティティを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/5b48f55e-b7e4-25eb-a5b8-fb084f6b930d.png)
<br>

- ユーズケースはGlueを選択そして「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/b9c70a20-705c-deba-ece6-f888f2bee679.png)
<br>

- ポリシーを設定
雑に付けましたが、本番では最小限に絞りましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/6611d7f2-5a12-c0fc-60ff-c41c29bf41d4.png)
<br>
    
- ロール名は　AWSGlueServiceRole-test01 としました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/e3899a40-32a7-169d-166e-9a281f71e771.png)


## コネクション（connection）の作成
Glueの画面に遷移し、Auroraへ接続するためのコネクションを作成します
- AWS Glueを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/0d972fc3-6023-1501-3665-c651685eae6a.png)
<br>

- Data connections を選択し、「Create connection」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/3a178f94-ee5d-af02-f14a-05fbd7e721eb.png)
<br>

- Data sourceにAuroraを選択して「NEXT」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/9321dcbc-16c1-161e-986c-f7750d8ccb0f.png)
<br>

- Auroraへの接続情報を入力します
    - **Database instances:** 接続するAuroraを選択します。例）XXXX-XXX-instance-2
    - **Database name:** データベース名　例）MYDB
    - **Username:** 接続するユーザ名　例）mydbadmin
    - **Password:** 接続するユーザのパスワード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/aa9c0738-dd63-5326-5772-f658651f07fe.png)
<br>

- ネットワークの設定を確認します　↑図の**▶ Network options** を選択します
    - 自動でAuroraの存在するVPC、VPCサブネット、セキュリティグループが設定済みです
    - **※このセキュリティグループに設定を追加します**
    - セキュリティグループに関しては、GlueとAuroraが接続できる必要があるので、補足説明します
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/1698ea49-f543-fe7a-3aae-8f275e7e34b0.png)

- コネクションの名前は「Aurora_connection」としました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/07d9f3c4-33d2-dff4-0dd2-73c27d53b780.png)


## ネットワーク設定の補足とセキュリティグループの設定

Glueはサーバレスのマネージドサービスなので、下図のような感じで、どこからでもAuroraに接続しようとします。そのため、AuroraとENI（Glue）が通信できるようにセキュリティグループを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/bc38b690-757f-2fa6-db3a-406da4f0fb68.png)


- セキュリティグループの設定
ここでは、上で確認したAuroraに設定済みのセキュリティグループにGlueが通信できるようにインバウンドルールを設定します。

| タイプ | プロトコル | ポート範囲 | ソース |
|:-----------|:-----------:|:------------:|:------:|
| すべてのトラフィック   | すべて | すべて | Aurorに設定済みのセキュリティグループ |


## Glue Studio 画面へ
- 赤丸で囲んだ「AWS Glue Studio」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/a3255024-ae34-9a2c-22c9-8d416a0a6751.png)

- そして、「Visual ETL」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/9e75cb5d-be59-d452-fcc9-723636d54546.png)

- データソースである、「Relational DB」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/0219bf17-4b69-a250-a943-46138e4e45de.png)
<br>


- Relational DBノードには以下のプロパティを設定します
    - **Name** 
        - Relational DB
    - **JDBC source***
        - JDBC connection details にチェック
    - **Connection name**
        - 先ほど作成した「Aurora_connection」を選択
    - **対象テーブル**
        - m_code
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/abdb2768-5a3b-a9df-2611-ed3a338e3585.png)

<br>

- 次にDrop Fieldノードを選択して、不要なフィールドを除去します
    - **Name**
        - ノード名称に「Drop Field」を設定
    - **Node Parents**
        - 呼び出し元ノード「Relational DB」を選択
    - **DropField**
        - 削除するフィールド「type_nm」を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/927d7fe5-182b-4d65-479f-73fb75e686c2.png)

- データ格納先のS3を設定します
    -　**Name**
        -　ノード名称に「Amazon S3」を設定
    -　**Node Parents**
        -　呼び出し元ノード 「Drop Field」を選択
    -　**Format**
        -　フォーマットは「Parquet」を選択　CSVで出力することもできます
    -　**Compression Type**
        -　高速な「Snappy」を選択します
    -　**S3 Target Location**
        -　格納するS3を選択します　ここでは「S3://XXXX/test01-glue」としています


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/af17e1b8-4eef-2c28-85aa-d681c302e4ca.png)


- これでフローが完成しました

## フローの実行

- 「Run」ボタンをおして、S3に正しくデータが格納されるかを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/47d3a75a-b408-d962-65da-675e07bdbb73.png)

- 実行状況は左側のメニューの　AWS Glue > Monitor (Job run monitoring)で確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/6df6709b-af68-0aca-f519-8be6c992f8c4.png)

- なんとファイルがいっぱい　レコード数分できています Paquetファイルの内容確認は[ParquetViewer](https://github.com/mukunku/ParquetViewer)が便利です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/289d1f13-b51e-6c59-df94-528b49076e42.png)

## コード修正
ファイルを一つにするためには、現状（2024-12-09現在）コードを修正する必要があります。コードは、「Script」ボタンを押すと表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/01d6bd80-59b7-a51f-2c9c-7c09885e7e74.png)



- **.coalesce(1)** 　を追加してパーティションを1つにします。性能は一旦無視します
- **groupSize**  dinamic_frameのオプションでサイズを指定します　このサイズより大きくなると分割されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/c8535a08-3538-59e9-9e14-1223ac62bab1.png)
<br>
S3を確認すると、先ほどより大きな1つのファイルが格納されているはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338832/caa3b158-5243-d869-8f26-b057913e9239.png)

## 終わりに
物凄く簡単に（雑に？）Glueを使ってみましたが、第一歩となれば幸いです。これをベースにSparkを勉強すると、もっと面白くなると思います。
この記事は一旦アップしますが、初心者の方々に見てもらった上で、分かりにくい点（もちろん間違いなども）ブラッシュアップ予定です。高価なETLツールの代わりとして是非使ってみてください！