【プレビュー版検証】AWS Glue Elastic Viewsを使って、Elasticsearch Serviceの連携までをやってみた

## 概要
AWS Glue Elastic Viewsのプレビュー版について、説明したいと思います。
あまり情報もなく、セットアップも画面UIも荒削りなので現時点ではプロダクト採用には難しいですがデータ同期がマネージドサービスで実現できることにメリットがありそうです。

## 前提

### プレビューに申し込んでいること
[こちらのフォーム](https://pages.awscloud.com/AWS-Glue-Elastic-Views-Preview.html)から申し込んでください。
約1週間後にAvailableになったよ〜って通知がメールできます。

## 背景

サーバーレス構成のデータの保存先として DynamoDBを利用しています。そのシステムに全文検索機能をはじめ、少し凝った検索機能を追加する場合、DynamoDBだけではなかなか実装が難しいと思います。

### ステップ1
コスト優先ということでDynamoDB Streamsを利用して別のテーブルに検索語句を連携する方式を採用しました。
※以下の記事、大変参考にさせていただきました
[DynamoDBで全文検索もどきをする](https://qiita.com/kurimoto/items/97db4addf73f8dede0e3)

そして、お客様の検索条件の飽くなき探究心に運用が耐えられず、Amazon Auroraの移行を検討

### ステップ２
Auroraに関しては、geometry型を用いた検索もしているのでアーキテクチャとしては悪くないのですがRDBの性質上、前方一致検索しか採用したくない・・・
（部分一致検索はFull Scanとなり、早晩運用が破綻すると考えたため）

### ステップ3（これから）
ユーザビリティを考えると全文検索を実現したい。そのため、Elasticsearch Serviceを組み合わせて実現したいなぁ・・・と思っていた矢先、AWS Glue Elastic Viewsが発表される

## 環境構築

AWSから[Getting Started](https://d146gprkjwpihi.cloudfront.net/getting-started-set-up-domain-es.html)が公開されています。
英語のみでGoogle翻訳するとツラミですが、我慢しましょう・・・

### DynamoDB
すでに存在するテーブルを利用するので割愛

### Amazon ES domain
[Create the Amazon ES domain](https://d146gprkjwpihi.cloudfront.net/getting-started-set-up-domain-es.html)を参考に作成をしてください。
また、チュートリアルの簡易さを優先してドメインはPublicに設定しているようです。各自のセキュリティポリシーに合わせて検討ください

## AWS Glue EV
サービス一覧には表示されないので直リンク[AWS Glue Elastic Views](https://console.aws.amazon.com/elasticviews#)でアクセスします

また、DynamoDBのテーブルは既に存在することをします。
そのうえで、AWS Glue Elastic Viewsで作業するのは
- テーブル作成及び有効化
- ビューの作成及びPartiQLの定義
- マテビューの有効化（ES or S3）で、データが連携される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/0cf14641-2c58-5a5d-3281-9b06f3e9d8be.png)

### テーブル作成
コンソールからDynamoDBのテーブル一覧が表示されるので、選択するだけです。
スキーマ定義が作成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/f26869b9-c17a-464c-1532-31acaa95c57b.png)

※アクティベートを忘れないようにしてください。1分程度で有効化されます

### ビュー作成
テーブルのページからビュー作成ボタンを押下してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/a558030d-0a39-9a31-3514-a7e6c56493d7.png)

※ビューのページから作成ボタンを押下すると、PartiQLの設定などを手動で記述する必要があります

ビュー名のみ任意で設定して、その他はデフォルト値のまま作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/6c60f25d-968f-2f1e-3ddc-538998318b6f.png)

### マテビュー作成
右上のボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/18b9847c-ba23-e76a-c58f-d80f444e0ec4.png)
※アクティベートを忘れないようにしてください。1分程度で有効化されます

addターゲットを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/b7e75540-d3dc-a687-a924-7f2430f0eee2.png)

Elasticsearch Serviceを選択し、チュートリアルで作成した ES Domainを選択してください
index nameはES内に確保される領域ですが、今回はtestを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/b73a03ac-1b0e-a3b7-73d1-4386ce86039e.png)

### マテビュー実体化
赤枠のボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/5d09e5f1-3378-05ce-f862-b141e7b172f2.png)

### Elasticsearch Serviceの確認
マテビューで定義したインデックスを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/eec44cbd-4af6-7fdd-9f9e-afc70d945842.png)

約７万件作成されるまでに１分程度

### マテビューでフィルター
record_timeでフィルターをかけ、Elasticsearch Serviceに期待する件数のみ連携されるか、確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/f1223044-71ab-8015-58a8-c91e2c3653b9.png)
※今回は200件を期待
※文字列をダブルクォーテーションで括ると上手く動作しませんでした。

約1時間後に全件連携された。どこがボトルネックになっているかわからず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/a710423b-ac1d-fca4-d7b2-90129ef1300d.png)


## 余談
取得元のDynamoDBのテーブルには約500万件のデータがありましたが、Elasticsearch Service側のパフォーマンスの限界に達していました。このあたりは運用に合わせてチューニングが必要になると思われます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222498/07cbf5f3-b8d1-4db0-7d75-f428815e7328.png)

## まとめ
PartiQLを上手く利用できれば、ESのボリュームサイズも配慮しながら連携できそうです
コスト面で許容できそうなら、プロダクションにも採用していきたいと思います