【OCI】OpenSearchのAPIからLB経由でデータを登録してみる

# はじめに

今回はOracle Cloud Infrastructure（OCI）のOpenSearchのAPIを使って
LB経由で外部からデータを登録してみたいと思います。

その前にそもそもOpenSearchとはなんなのか？という話ですが、

分散型の検索および分析エンジンで、大量のデータを高速に
検索・可視化・分析するためのプラットフォームです。
主にログやメトリクス（性能指標）、テキストデータの収集・検索・分析に利用されます。
Amazon Elasticsearch Serviceからフォークされたオープンソースプロジェクトとして
開発が進められており、スケーラブルかつ柔軟なデータ解析環境を構築することができます。

■参考
https://speakerdeck.com/oracle4engineer/oci-search-service-with-opensearch-gai-yao

詳細については上記や他サイトを参照して頂くとして
早速本題に入りたいと思います。

今回は下記のようにパブリックサブネットのLBが通信を受けて
バックエンドのOpenSearchにデータを流すというシンプルな構成となります。

■構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/68008be8-36dc-dbfc-c442-28e7714221d8.png)

■事前準備
・ドメインを取得

・SSL証明書を作成（Let's Encryptとかであればフリーで作れます）

・VCN、サブネット、セキュリティリスト作成
　参考: https://oracle-japan.github.io/ocitutorials/beginners/creating-vcn/

今回はセキュリティリストのイングレスに下記を設定しておきます。
5601 (0.0.0.0/0	TCP	All): ダッシュボード用
9200 (0.0.0.0/0	TCP	All): API用

・ポリシーの作成
　参考: https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingpolicies.htm

因みにOpenSearchクラスタを作成する際に以下のようなポリシーを適用するように
促されますので、こちらを登録するようにしてください。

allow [グループ名] to manage vnics in compartment [コンパートメント名]
allow [グループ名] to manage vcns in compartment  [コンパートメント名]
allow [グループ名] to manage subnets in compartment  [コンパートメント名]
allow [グループ名] to use network-security-groups in compartment  [コンパートメント名]
allow [グループ名] to manage opensearch-family in compartment  [コンパートメント名]

・LBの作成
　参考: https://oracle-japan.github.io/ocitutorials/intermediates/using-load-balancer/

予めLBのパブリックIPをDNSのAレコードとして登録し、
取得してあるドメイン名、SSL証明書でSSL通信ができるようにしておきます。

以上が事前準備となります。

◆目次
1.OpenSearchクラスタの作成
2.LBの設定
3.OpenSearchの接続テスト

## 1.OpenSearchクラスタの作成

左上メニュー[Ξ]からデータベースを選択し、OpenSearchの下のクラスタを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/561a8d3f-9b4e-ec61-6fb7-60ee254a3024.png)

名前、コンパートメント、ソフトウェアのバージョンを入力・選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/237e3ed8-8cf7-d7a2-d652-0f436ab59662.png)

ユーザ、パスワードを入力して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/f68713ec-4620-8477-1ba9-b0e1064836cd.png)

ここでは用途に応じてクラスタの種類を選択できますが、
今回は開発を選択し、リソースは適当に設定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/b0d15427-9adf-e8ef-f9d7-a069f3ec1c28.png)

VCN、サブネットを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/fbcd0988-ec70-8151-572c-76611f38716a.png)

最後に設定を確認してクラスタの作成を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/c43ab4cb-9191-2b32-019a-344d7088918e.png)

クラスタの作成が完了して詳細を見てみるとAPIとダッシュボードそれぞれの
プライベートIPが表示されますので、２つともメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/80856bc9-8796-56a7-9ffb-cf7b25f26556.png)

以上でOpenSearchクラスタの作成は終了です。

## 2. LBの設定

ここではOpenSearchに外部からアクセスするためのLB設定をします。
準備段階でDNS、ドメイン、SSL証明書の設定が完了してあると思いますので、
リスナーを登録します。

リスナーはダッシュボード:5601、API:9200の２つを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/cb0c81fa-7412-90b7-039a-f327c2721375.png)

バックエンドセットも同様に２つ作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/6da8ead1-0e2a-c66f-bdf5-f702e511814c.png)

リスナー:5601（ダッシュボード）のバックエンドセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/29f7f5fb-cfc2-3e7f-c342-742388119d8b.png)

リスナー:9200（API）のバックエンドセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/4d55166c-611f-6095-ac2e-f48d008b9590.png)

■注意点
ここで気をつけたいのが、OpenSearchはHTTPS通信しか許可していないため、
バックエンドセットもSSLを有効にします。

流れとしては下記のようなイメージとなります。
[ダッシュボード] - https → リスナー:5601 → https バックエンドセット:5601
[API] - https → リスナー:9200 → https バックエンドセット:9200

上記のことからSSL証明書はリスナーとバックエンドセットの両方に必要となります。

以上でLBの設定は終了です。

## 3. OpenSearchの接続テスト

設定が完了したら早速OpenSearchの接続テストをしてみます。
下記でアクセスします。
https://[FQDN]:5601/app/login?

OpenSearchクラスタを作成した時のユーザID、パスワードを使ってログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/02957632-d053-fcd0-c6c5-bd8317f24af8.png)

左上メニュー[Ξ]からDashboards Managementを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/24d972c0-e3f3-3324-232f-71555313f5cf.png)

Index patternsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/77c3b540-db01-539f-24f2-92b0d03e8859.png)

Create index patternを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/21d5e862-5b54-1168-e2cc-625f28cd65f0.png)

Index pattern nameに「index_test*」と入れてNext stepを選択 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/157f5f0e-e6d7-a33a-8017-72c75d32da1f.png)

そのままCreate index patternを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/cf547977-71fd-a84d-daa2-90d9df525f88.png)

これでインデックスパターンが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ccce24c1-e0f2-b96a-e224-d94c16eccbeb.png)

(今回はPostmanを使っていますが、APIツールであればなんでも構いません）
AuthorizationタブのAuth TypeをBasci Authを選択し、
Username、Passwordを入力します。
※こちらはOpenSearchで設定したものと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/f39d08bc-a97c-a391-a6cd-8684d4b5a9e1.png)

Bodyタブに移って下記を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/6b250fc3-7976-aaf0-98e0-e707e40e122d.png)

Sendボタンを実行すると結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ea6b03d8-862a-e12e-7af9-7cb5de71361e.png)

データ登録のリクエストサンプル
```
Method: POST
Endpoint: https://[FQDN]:9200/index_test001/_doc
Body:
{
  "field1": "index_test",
  "field2": "data01"
}
```

データ登録のレスポンスサンプル
```
{
    "_index": "index_test001",
    "_id": "trdFCJQBSUgzHqe6OF6b",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}
```

因みに戻り値の_idを使ってGETしてみると登録したデータを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/aa4dd91b-346b-b479-0be4-2f4f1f04cdae.png)

データ参照のリクエストサンプル
```
Method: GET
Endpoint: https://[FQDN]:9200/index_test001/_doc/t7dHCJQBSUgzHqe61l6D
```

データ参照のレスポンスサンプル
```
{
    "_index": "index_test001",
    "_id": "t7dHCJQBSUgzHqe61l6D",
    "_version": 1,
    "_seq_no": 3,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "field1": "index_test",
        "field2": "data01"
    }
}
```

最後にダッシュボードから登録されたデータを確認してみます。
左上メニュー[Ξ]からDiscoverを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/6e7ba752-6793-1c34-aa26-6f88948949c1.png)

左上検索項目から「index_test*」で絞り込んで見ると
APIで登録したデータ一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/5bbc607b-c76b-20d0-c50c-eff47bad66db.png)

虫眼鏡のアイコンをクリックすると登録されたデータが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/d10e0e12-3847-0bb9-a691-07fac8075ce1.png)

以上でOpenSearchの接続テストは終了です。

## おわり
OpenSearchはあまり外側からアクセスさせることは多くないかと思いますが、
APIを使ってデータ登録、確認をすることが比較的簡単にできます。