Amazon OpenSearch Serviceについて試してみた

# 背景・目的
最近、OpenSearch Serviceに触る機会が増えてきましたので、基本的な知識の整理と簡単に動作を確認します。

# まとめ
下記に特徴をまとめます。

|特徴|説明|
|:--|:--|
|Amazon OpenSearch Service|AWS クラウドでの OpenSearch クラスターのデプロイ、運用、スケーリングを容易にするマネージドサービス|
|Amazon OpenSearch Serviceによりできること|OpenSearch クラスターのすべてのリソースをプロビジョニングし、クラスターを起動する<BR><BR>障害が発生した OpenSearch サービスノードを自動的に検出して置き換え、セルフマネージドインフラストラクチャに関連するオーバーヘッドを削減する<BR><BR>クラスターを簡単にスケーリングできる|
|OpenSearch|オープンソースの検索および分析エンジン|
|ユースケース|・ログ分析<BR>・リアルタイムアプリケーションモニタリング<BR>・クリックストリーム分析など|
|Amazon OpenSearch Service の料金|下記に対して料金を支払う<BR>・EC2インスタンスの使用時間<BR>・インスタンスにアタッチされたEBSストレージボリュームの累積サイズ<BR>・標準AWS データ転送料金<BR><BR>ただし下記は請求しない<BR>・AZ間のトラフィック<BR>・シャード割当と再調整中のドメイン内のデータ転送<BR>・UltraWarm/Coldノードと、S3間のデータ転送|
|OpenSearch Serverless|OpenSearch クラスターのプロビジョニング、設定、チューニングの運用上の複雑さを排除する|


# 概要
## Amazon OpenSearch Service とは
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/what-is.html


> Amazon OpenSearch Service は、 AWS クラウドでの OpenSearch クラスターのデプロイ、運用、スケーリングを容易にするマネージドサービスです。Amazon OpenSearch Service は、 OpenSearch およびレガシー Elasticsearch OSS (ソフトウェアの最終オープンソースバージョンである 7.10 まで) をサポートしています。クラスターを作成するときに、どの検索エンジンを使用するかのオプションがあります。

- AWS クラウドでの OpenSearch クラスターのデプロイ、運用、スケーリングを容易にするマネージドサービス
- OepnSearch Serviceは、下記をサポートしている
    - OpenSearch
    - Elasticsearch OSS (ソフトウェアの最終オープンソースバージョンである 7.10 まで)

> OpenSearch は、ログ分析、リアルタイムアプリケーションモニタリング、クリックストリーム分析などのユースケース向けの、完全にオープンソースの検索および分析エンジンです。詳細については、 OpenSearch ドキュメントを参照してください。

- 下記のユースケース向け
    - ログ分析
    - リアルタイムアプリケーションモニタリング
    - クリックストリーム分析など
- オープンソースの検索および分析エンジン


> Amazon OpenSearch Service は、 OpenSearch クラスターのすべてのリソースをプロビジョニングし、クラスターを起動します。また、障害が発生した OpenSearch サービスノードを自動的に検出して置き換え、セルフマネージドインフラストラクチャに関連するオーバーヘッドを削減します。また、単一の API コールを使用するか、コンソールで数回クリックするだけで、クラスターを簡単にスケーリングできます。

- OpenSearch クラスターのすべてのリソースをプロビジョニングし、クラスターを起動する
- 障害が発生した OpenSearch サービスノードを自動的に検出して置き換え、セルフマネージドインフラストラクチャに関連するオーバーヘッドを削減する
- クラスターを簡単にスケーリングできる

> OpenSearch サービスの使用を開始するには、クラスター に相当する OpenSearch サービスドメイン OpenSearch を作成します。クラスター内の各 EC2 インスタンスは、1 つの OpenSearch サービスノードとして機能します。

- 使用を開始するには、OpenSearch サービスドメイン OpenSearch を作成する
- クラスター内の各 EC2 インスタンスは、1 つの OpenSearch サービスノードとして機能する

### Amazon OpenSearch Service の機能

下記の機能が含まれている

|カテゴリ |機能|
|:--|:--|
|スケール|費用効率の高い Graviton インスタンスを含む、インスタンスタイプと呼ばれる、CPU、メモリ、ストレージ容量の多数の設定|
||最大 3 PB のアタッチ済みストレージ|
||読み取り専用データ用の費用対効果UltraWarmの高いコールドストレージ|
|セキュリティ|AWS Identity and Access Management (IAM) アクセスコントロール|
||Amazon VPC および VPC セキュリティグループと簡単に統合|
||保管中のデータの暗号化と node-to-node 暗号化|
||OpenSearch Dashboards の Amazon Cognito 、HTTP 基本、または SAML 認証|
||インデックスレベル、ドキュメントレベル、フィールドレベルのセキュリティ|
||監査ログ|
||Dashboards マルチテナンシー|
|安定性|リージョンおよびアベイラビリティーゾーンと呼ばれる、リソース用の複数の地理的場所|
||マルチ AZ と呼ばれる、同じ AWS リージョン内の 2 つまたは 3 つのアベイラビリティーゾーンにまたがるノード割り当て|
||クラスター管理タスクをオフロードする専用マスターノード|
||OpenSearch サービスドメインをバックアップおよび復元するための自動スナップショット|
|柔軟性|ビジネスインテリジェンス (BI) アプリケーションとの統合のための SQL サポート|
||検索結果を改善するためのカスタムパッケージ|
|人気のあるサービスとの統合|OpenSearch Dashboards を使用したデータの視覚化|
||OpenSearch サービスドメインメトリクスのモニタリングとアラームの設定 CloudWatch のための Amazon との統合|
||OpenSearch サービスドメイン AWS CloudTrail への設定 API コールを監査するための との統合|
||ストリーミングデータを OpenSearch サービスにロードするための Amazon S3、Amazon Kinesis 、および Amazon DynamoDB との統合|
||データが特定のしきい値を超えたときの Amazon SNS からのアラート|

### Amazon OpenSearch サーバーレス
> Amazon OpenSearch Serverless は、Amazon OpenSearch Service のオンデマンド、自動スケーリング、サーバーレス設定です。Serverless は、 OpenSearch クラスターのプロビジョニング、設定、チューニングの運用上の複雑さを排除します。詳細については、「Amazon OpenSearch Serverless」を参照してください。

- OpenSearch Serverlessは、OpenSearch クラスターのプロビジョニング、設定、チューニングの運用上の複雑さを排除する

### Amazon OpenSearch Service の料金
> OpenSearch サービスについては、EC2 インスタンスの使用時間ごと、およびインスタンスにアタッチされた EBS ストレージボリュームの累積サイズに対して料金を支払います。標準 AWS データ転送料金も適用されます。

> ただし、いくつかの注意すべきデータ転送の例外があります。ドメインが複数のアベイラビリティーゾーン を使用している場合、 OpenSearch サービスはアベイラビリティーゾーン間のトラフィックに対して課金しません。シャードの割り当てと再調整中に、ドメイン内で重大なデータ転送が発生します。 OpenSearch サービスは、このトラフィックを計測も請求もしません。同様に、 OpenSearch サービスは UltraWarm/cold ノードと Amazon S3 間のデータ転送には課金しません。

- 下記に対して料金を支払う
    - EC2インスタンスの使用時間ごと
    - インスタンスにアタッチされたEBSストレージボリュームの累積サイズ
    - 標準AWS データ転送料金
- ただし下記は請求しない
    - AZ間のトラフィック
    - シャード割当と再調整中のドメイン内のデータ転送
    - UltraWarm/Coldノードと、S3間のデータ転送

# 実践
下記のドキュメントを基に、ドメインの作成、データアップロード、ドキュメント検索を実施します。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/gsg.html

## ステップ 1: Amazon OpenSearch Service ドメインを作成する

1. AWSにサインインし、OpenSearch Serviceに移動します
1. 「マネージド型クラスター」を選択し、「ドメインの作成」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0b67ab0e-a67d-094e-c601-7f7b926e1ec8.png" width=300 />

1. 下記を入力します
    - ドメイン名：movies
    - ドメインの作成方法：標準作成
    - テンプレート：開発/テスト
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2f43f710-12d8-144d-9482-f37cdf771bdb.png)
    - デプロイオプション：スタンバイが有効のドメイン
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5b58d3be-cfb6-4681-c6b8-9de067f2d9b9.png)
    - エンジンオプション：最新
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/55a5e592-a8fa-01b0-145b-cfe473c7cae3.png)
    - ※下記は無視します（スキップします）
        - データノード
        - ウォームデータストレージ
        - コールドデータストレージ
        - 専用マスタノード
        - スナップショットの設定
        - カスタムエンドポイント
    - ネットワーク：パブリックアクセス
        - ※簡易的なチュートリアルのため
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/26cf48a9-4f01-2fc5-e9d8-0b81e628b83a.png)
    - きめ細やかなアクセスコントロールの有効化：チェック
    - マスターユーザー：マスターユーザーの作成
        - マスターユーザー名
        - マスターパスワード
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5673aec7-17fd-4cd7-0ebc-2a78472d1b3b.png)
    - ※ SAML認証、JWT、Cognito認証は無視します
1. 「作成」ボタンをクリックします
1. 15分〜20分くらいで作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/63b995a3-dfd1-e0e5-8401-d53b25f1e813.png)

## ステップ 2: インデックス作成のために Amazon OpenSearch Service にデータをアップロードする


1. 下記のコマンドでドキュメントをアップロードします
    ```bash
    $ curl -XPUT -u 'XXXX:YYYY' 'https://search-movies-XXXXXXXX.aos.ap-northeast-1.on.aws/movies/_doc/1' -d '{"director": "Burton, Tim", "genre": ["Comedy","Sci-Fi"], "year": 1996, "actor": ["Jack Nicholson","Pierce Brosnan","Sarah Jessica Parker"], "title": "Mars Attacks!"}' -H 'Content-Type: application/json'
    {"_index":"movies","_id":"1","_version":2,"result":"updated","_shards":{"total":3,"successful":3,"failed":0},"_seq_no":1,"_primary_term":1}
    $
    ```

## ステップ 3: Amazon OpenSearch Service でドキュメントを検索する
1. 下記のコマンドを実行し、「mars」という単語を検索します
    ```json
    $ curl -XGET -u 'XXXX:YYYY' 'https://search-movies-XXXXXXXX.aos.ap-northeast-1.on.aws/movies/_search?q=mars&pretty=true'
    {
      "took" : 925,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 0.2876821,
        "hits" : [
          {
            "_index" : "movies",
            "_id" : "1",
            "_score" : 0.2876821,
            "_source" : {
              "director" : "Burton, Tim",
              "genre" : [
                "Comedy",
                "Sci-Fi"
              ],
              "year" : 1996,
              "actor" : [
                "Jack Nicholson",
                "Pierce Brosnan",
                "Sarah Jessica Parker"
              ],
              "title" : "Mars Attacks!"
            }
          }
        ]
      }
    }
    $
    ```

## ステップ 4: Amazon OpenSearch Service ドメインを削除する
1. ドメイン「movies」を選択し、「削除」ボタンをクリックします

# 考察
今回は、OpenSearchの基本と、ドメインの作成〜データのPut、検索まで試しました。
次回以降は、機能の特徴を踏まえた動作を確認していきます。

# 参考
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/what-is.html

https://aws.amazon.com/jp/opensearch-service/pricing/