zero-ETL integration（preview版）の検証

## アジェンダ

1.　概要
2.　前提
3.　実装方法
4.　追加検証
5.　所感
6.　さいごに

---
## 概要

AWSは、Amazon Aurora MySQLのデータをAmazon Redshiftにニアリアルタイムで同期させる新サービス「 Amazon Aurora MySQL zero-ETL integration with Amazon Redshift」（以下、ゼロETL）をパブリックプレビューとして提供開始したことを発表しました。
※東京リージョンで利用可能
※2022年11月の「AWS re:Invent 2022」で発表

---
AWSにはいくつかデータベースのサービスがあります。
これらのデータベースからAmazon Reshiftにデータを集約してデータ分析を行う際に発生する、いわゆる**ETLの手間**が課題となっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/b4325a35-4905-25a5-97ff-56918cbed1c6.png)


---
以下図のように、通常は複数のデータソースから分析までにパイプラインが必要です。
ゼロETLは、ニアリアルタイムでAmazon Redshiftにデータ集約を可能にすることで、このETLの課題を解決するとして提供されるサービスです。
ETLの部分を簡単かつ自動でやってしまおう、ということがゼロETLの基本的な概念です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/5c47a8a4-74d3-b680-5c47-ca2b79b43e9d.png)



---
## 前提
・現在はpreview版であること
　→今回の検証内容から仕様が変わる可能性がある
・挙動確認が主な検証となること
　→ゼロETLを検証している記事が着手時点でなかったため
・AWS環境が準備されていること
　→すでに検証で使用するIAMユーザが払いだされている状態からスタート

---
## 実装方法
大枠での流れは以下です。
①カスタマイズされた DB クラスターパラメータグループで Aurora MySQL ソースを設定
②Amazon Redshift Serverless デスティネーションをその名前空間に必要なリソースポリシーで設定
③大文字と小文字を区別する識別子を有効にするためRedshift Serverlessワークグループを更新
④必要な権限を設定
⑤ゼロETL統合を作成
⑥Amazon Redshiftにある統合からデータベースを作成

---
**イメージ図**
以下、イメージ図です。
　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/f073b0e8-4bb6-6bd8-4ec0-6c8e2dc34b4b.png)



---
>>> カスタマイズされた DB クラスターパラメータグループで
Aurora MySQL ソースを設定

---
**パラメータグループの作成**
グループ名と説明は任意の名称を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/56848eb8-27f4-8812-3a2a-e041cb9672cc.png)



---
**パラメータグループの設定変更**
ゼロETLに必要なbinlog（※Server層が出力するログ）に関する値を変更します。
コメントのログを待たずに、トランザクションのイベント送信を可能にし、並行して動作するための設定値変更です。（＝ニアリアルタイムの実現）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/fb10f39f-e1e4-e579-8315-d0099149ab69.png)



---
**データベース作成**
Aurora(MySQL Compatible)を選択し、バージョンは3.03.1以上を選択します。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/5dc65833-8f17-db0e-3d6e-4fe63da1d277.png)

---
DBクラスター識別子・マスターユーザ名・マスターパスワードには
制約に沿った値を任意で設定します。
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/5e337f68-cda7-ea22-81b3-ee0cc23a93ee.png)

---
**セキュリティグループの作成**
セキュリティグループは公式のdemoだとデフォルトですが
最後にMySQLから接続してゼロETLの実装結果を確認するため、パブリックアクセスの接続を「あり」および、セキュリティグループの新規作成と設定が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/7f32eccc-c03d-a8c7-a690-6523b504dc4b.png)

---
さきほど設定したパラメータを選択し、
今回は検証ですのでデータベースの削除保護を解除しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/6f2c3350-63da-cc72-7873-3a0947136cd7.png)


---
>>> Amazon Redshift Serverless デスティネーションを
その名前空間に必要なリソースポリシーで設定
---
**Redshift serverlessワークグループの作成**
ワークグループの名称を任意に設定します。ベース容量は最小値としておきます。
※本来は8が最小値となるがゼロETL作成については32が最小値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/2dbe8a7c-5cbc-158e-0b64-2eb68c63f195.png)

---
**名前空間の作成**
名前空間の名称に任意の値を設定し、制約に沿ってアカウント情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/ebd64573-fc87-38a3-36a8-cb0563a71591.png)

---
**ユーザの追加**
AWS ユーザーまたはロールの Amazon Resource Name (ARN)、またはこの名前空間で統合の作成が許可されている AWS アカウント ID (IAM プリンシパル) のいずれかを入力します。
アカウント ID は、root ユーザーの ARN として保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/9bfd4a30-07ee-3b4f-03ab-2359900615ca.png)

---
**RDSとの接続**
ゼロETL統合のデータソースであるAurora MySQL DB クラスターのARNを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/bb47831b-e677-bda5-74f8-8c26073f24ac.png)

---
>>> 大文字と小文字を区別する識別子を有効にするため
Redshift Serverlessワークグループを更新
---

ここではRedshift Serverlessワークグループの識別子を更新します。
理由はAurora MySQLはデフォルトで大文字と小文字を区別するのに対して、Redshiftはデフォルトで区別されないためです。AWS Cloud Shellを使用します。
※AWSに掲載されているコマンドをコピーして使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/d7964907-cf62-4f4f-45d6-db56616c17dd.png)

---
>>> 必要な権限を設定
---

**権限の追加**
ゼロETL統合を作成するには、ユーザーまたはロールに適切なIAM権限を持つアイデンティティベースのポリシーがアタッチされている必要があります。
※以下エラーは一般公開前の想定内エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/e4b680aa-a4d9-fa61-ec3d-cf385da9a1a4.png)

---
>>> ゼロETL統合を作成
---

ゼロETLはRDSの画面から作成します。
RDSの左側に新規として「ゼロのETL統合」とあり、こちらから作成することができます。
ゼロETL自体に料金はかかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/a8e5149b-7881-2080-c632-baa9212b9623.png)

---
ゼロETLでは以下イメージ図の矢印部分を作成するのが目的なので
ソースを選択できる箇所では、さきほど作成したRDSのデータベースを選択する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/789e1d9e-a457-1623-5313-e23a15941a11.png)

---
>>> Amazon Redshiftにある統合からデータベースを作成
---

**統合IDの取得**
ここからゼロETLのデータ先であるRedshiftの設定です。
Redshiftのクエリエディタで以下SQLを実行すると統合のIDを取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/ed29b596-aa8d-5503-6940-d9431848317c.png)



---
**統合を使用したデータベース作成**
さきほど取得したIDをFROM句に指定し、データベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/608b9ffd-12f1-736b-65a2-2c6e0791c8b7.png)

---
今回はもう1つRDSのデータベースを作成して統合を確認したいので
上記の手順で同じようにデータベースを作成します。
注意点としては、1つのRedshift名前空間に対して2つのRDSデータソースを紐づけるので、統合の設定にはRDS2：Redshift1の設定にすることがポイントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/f9ac0b9e-01d4-3d8d-cb0f-4d38122505db.png)

---
**実装確認**
MySQLでデータベースとテーブルを作成しテストデータを投入します。
Redshift側でSELECTすると時間を要することなく、作成したテーブルとそのデータの中身を確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/168b980e-c018-c1ad-9fe6-993d5ec27014.png)

---
追加で作成した2つ目のデータソースも同じように
時間を要することなくニアリアルタイムでデータを確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/2a40b472-b6de-8d2b-f6b0-6871c2c9db58.png)

---
また、それぞれのデータソースで作成したデータを
Redshift上でJOINして、表示できることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/d7df63cd-b59a-10c6-deeb-62d6bf941000.png)

---
## 追加検証
[AWS公式ページ](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/zero-etl-using.troubleshooting.html#zero-etl-using.troubleshooting.resourcepolicy)でpreview版時点での制約が公開されています。
そのなかで今回は★の部分について追加検証を実施しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/88c92276-179a-9341-c2d6-5aff8329ac42.png)



---
**今回の検証**
追加検証としては以下を検証ポイントとします。
・クエリごとに反映されないものがあるか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/abfa8faf-5b1b-fd7f-4b81-6596a26599e3.png)

---
**検証結果**
検証結果は以下の通りです。
候補でピックアップしたクエリはすべて反映することがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/72af4864-9f72-d5a8-6d22-941fa5f4e348.png)

---
**詳細**
たとえば「UPDATE」を例にすると
RDS側でUPDATEした内容がニアリアルタイムでRedshift側に反映されるか
反映されないものなどはあるかという観点で確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/b9bd1b00-4521-5344-4382-de3ecfdbce3f.png)

---
またMySQL側で統合用に作成したデータベースに対して
Redshift側からデータベースを修正することができないこともわかりました。
※テーブルの作成、挿入、削除など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/5f7597ca-3614-4916-da6b-bf87fb0ae636.png)


---
## 所感
今回の検証を実施して気になった点は以下です。
・ETLのT(加工)の部分の役割
　→ゼロETLは抽出(E)と格納(L)ができるサービス
　→Tで複雑な加工をしている場合は移行方法が不明
・データ量とリアルタイム性の相関
　→データ量やテーブル量によってリアルタイム性が下がることはあるか不明
・ゼロETLが実現した場合の動向
　→ETLなどコードを書くエンジニアが今後求められることが変わる
　→ゼロETLが実現すると価値があるサービス・業務があるか
       　　 （＝リアルタイム性に価値があるもの）

---
## さいごに
preview版でのゼロETL検証は以上です。
みなさまの業務の一助となれていましたら幸いです。

**appendix**
株式会社ジールでは、初期費用が不要で運用・保守の手間もかからず、ノーコード・ローコードですぐに手元データを分析可能なオールインワン型データ活用プラットフォーム「ZEUSCloud」を提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/