Amazon OpenSearch Service はじめの一歩：S3からGlueでデータをいれて全文検索っぽいことをクイックにやる

# はじめに

AWS上に既にある、またはこれから構築するデータ基盤でクイックに全文検索をしたい場合の選択として、[Amazon OpenSearch Service](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/what-is.html) を利用するのはありなのか、実際に動かして試しながら確認したときの記録を、いつかの思い出し用として記載しておこうと思います。
スクショをベースにしておいて、後でこんな感じのサービスだったというのを思い出せるようにしています。

# 前提

- 2024/3/4に試した内容です。
- OpenSearchはサーバーレス版の[Amazon OpenSearch Serverless](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/serverless.html)が選択できますが、AWS Glueからはサーバーレス版は接続ができないようです。サーバーレス版ではないほうは後述しますが、接続できました。

# やってみた

### OpenSearchを使えるようにする

- マネージド型クラスターを選んでドメインの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/b540322f-e555-6a71-6b03-ebe60be73e3a.png)

- ドメインの内容を編集して作成（今回は基本デフォルトのまま実施
![デュアルスタック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/aac37c0d-35c0-cccc-233a-691ecea6eb06.png)
![Pasted Graphic 525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/383a6d1b-c6fc-8d99-0678-df49d980838a.png)
![Pasted Graphic 526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9b0c6538-834b-d0b4-4f2c-94cf98983d9f.png)
![Pasted Graphic 527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/3694d289-b8ef-9d07-55a3-460cdb8c807d.png)
![カスタムエンドポイント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/88a01ecc-3143-b9ba-195c-34bbcaee172c.png)
![Pasted Graphic 529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/b17ae8ec-1102-8376-cfd9-649d67935d3e.png)
![Pasted Graphic 530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/beccd75e-13bf-cb87-3445-01395ffbda95.png)
![Pasted Graphic 531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/348d24a1-5229-9003-9115-a1af22452fad.png)
![Pasted Graphic 532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/75e00c09-d37c-e9da-e691-969cf165cbac.png)
- ドメインが作成される
![Pasted Graphic 533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/df9881e2-7f47-2f57-8532-2f65bd2c1b50.png)
- 作成したドメインの設定画面（上記）にある OpenSearch Dashboards URL にアクセスする
![Log in to OpenSearch Dashboards.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/5b3ef40e-1950-6819-b932-8cec25ce3997.png)
- ログインはマスターユーザーを登録しておけばできる（他にも方法はありそう）
![セキュリティ設定の編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9be942cf-1bb4-c4f2-3dab-eee742238f51.png)
- ログインした後にOpenSearch Dashboardsが表示される
![Pasted Graphic 538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/4ba68056-3741-12bd-6813-c7498795baaa.png)

### AWS GlueでOpenSearchに接続できるようにする

- OpenSearch用のシークレットを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/97f3da3c-dabc-6688-1f3e-4c4a8869f56b.png)
![シークレットを設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/6f96c4ba-7369-c38c-693e-f865cbf6c0d3.png)
![Pasted Graphic 542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/96492d81-44a3-ab71-5e1f-d4023ac842c3.png)
  - opensearch.net.http.auth.user、opensearch.net.http.auth.passをキーとして作成
  - [参考:OpenSearch サービス接続の設定](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-opensearch-home.html)

- AWS Glueで接続を作成する(Step1)
![Pasted Graphic 543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/e504be9a-b283-e38b-3d41-811e1e2b0472.png)
  - Domain endpointはOpenSearchのダッシュボードより取得
  - Portは443
  - AWS SecretはOpenSearch用に作成済みのシークレット
  - Advanced Settingも必要（これをしないとGlueから繋げなかった。理由は調べていない）
![Pasted Graphic 554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/baef9e2e-eeb7-46c6-7025-16d118e2a73b.png)

- AWS Glueで接続を作成する(Step2)
![Set properties.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/7128a86b-e0d9-64b0-3253-41f82a68af9c.png)

- AWS Glueで接続を作成する(Step3)
![Pasted Graphic 545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/dced380a-8fc7-0689-19f6-9b198752b6f9.png)
![Pasted Graphic 546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/4885896c-bd19-4db3-f4c1-83bc46c48731.png)

### AWS GlueでOpenSearchにデータを入力する

- GlueでデータソースをS3にする
![Pasted Graphic 549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/fc7fb44b-f1ea-25fb-dc01-784e00b88ae3.png)
- GlueでデータターゲットをOpenSearchにする（インデックス名は「Sample」とする）
![Pasted Graphic 550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/18e54603-7464-d062-47f9-62bacff18a24.png)
- Run結果（Job Rundsのリストの一番上が今回のJob）
![Pasted Graphic 557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/bed06670-f815-cf76-0169-1b315a44af2f.png)
- ドメインの情報を表示する画面上どうなっているか
![Pasted Graphic 558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/047d5bdb-92c8-1264-0716-128b931cfdfb.png)
![Pasted Graphic 559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/ba31efec-75db-e725-0d2e-32a3f65e97c6.png)
Glueで指定したインデックス「Sample」ができている
- インデックス「Sample」の内容
![Pasted Graphic 561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/e851583c-2f63-935d-7ed8-7312637b57bc.png)
- OpenSearch Dashboards上はどうなっているか
![Pasted Graphic 562.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/4965f473-a3ee-3ad7-8d45-9f3cbd4fc71c.png)
インデックス「Sample」の内容が確認できる

### OpenSearchでクエリーしてみる

- 全件抽出
```s
GET sample/_search
{
  "query": {
    "match_all": {}
  }
}
```
![Pasted Graphic 564.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/b912da8c-c155-0d85-c124-cf54f20879b8.png)

- 条件指定抽出
```s
GET sample/_search
{
  "query": {
    "match": {
      "COL1":"bbb"
    }
  }
}
```
![Pasted Graphic 565.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/dacb9a27-01bd-ea20-edf4-bcbbd403aec8.png)

### 漫画「はじめの一歩」についてのWikipediaの記載を使ってOpenSearchでクエリーしてみる

- 対象のデータをS3に格納後にGlueへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/5980c019-137b-3538-1f11-111c4935ac5b.png)

- 「一歩」を含むテキストを検索
```s
GET sample/_search
{
  "query": {
    "match_phrase": {
      "COL2": "一歩"
    }
  }
}
```
![Pasted Graphic 569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/a92c1371-815e-d834-7023-d6cd21c2eaf6.png)

「一歩」を含んだ項目の値をスコアと共に出してくれている。
もっといろんなクエリーの仕方がありそうだが、今回ははじめの一歩なのでいったんここまで。

# まとめ

試してみて、OpenSearchの使い方についてはわからないことばかりではあるものの、クイックに導入して利用することができそうなことはわかりました。
自分の思い出し用ではありますが、取っ掛かりとして誰かの参考になれば幸いです。