【OCI クラウド移行ガイド】AWSのOpenSearchからOCI Search with OpenSearchへ移行の検証

2024年8月の内容です。

## OCI Search with OpenSearchって？
Oracle Cloud Infrastructure Search Service with OpenSearch は、OpenSearch に基づいてアプリケーション内検索ソリューションを構築するために使用できるマネージド・サービスです。

ドキュメントはこちら

https://docs.oracle.com/ja-jp/iaas/Content/search-opensearch/home.htm


概要資料はこちら

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

チュートリアルはこちら

https://oracle-japan.github.io/ocitutorials/opensearch/

## 流れ

+ STEP1.【AWS】手動のスナップショット作成
+ STEP2.【OCI】そのスナップショットをOCIのObjectStorageへアップロード
+ STEP3.【OCI】移行先クラスタを作成し、リポジトリを登録
+ STEP4.【OCI】スナップショットをリストア

AWSに関しては、以下の記事を参考に、

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

OCIに関しては、以下の記事を参考に検証を進めていきます。

https://docs.oracle.com/ja-jp/iaas/Content/search-opensearch/Concepts/importingacluster.htm

今回は権限周りに関して、上記のドキュメントに記載されている権限は既に付与されているものとします。特段今回は解説しないのでご承知おきください。

:::note warn
バージョンに注意してください。
AWSとOCIのOpenSearchバージョンが一緒であることを確認してください。（特にOCIは2.11までしかサポートされてません）　※2024/8時点



:::
ちなみに、私はAWSのバージョンが2.15で移行時にエラーを出しました

:::note warn
OCIでクラスタを作成するときは、スナップショットをインポートするソース・クラスタ（今回はAWS）と同じノード構成でクラスタを構成してください。
:::

## 前提
事前にAWSのOpenSearchには、[OCIのチュートリアルであるデータセット](https://oracle-japan.github.io/ocitutorials/opensearch/search-application-for-beginners/#3-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)を入れておき、
スナップショットを取って、OCIでリストアした際にそのデータセットが見れることを確認します。

AmaberさんのデータをOCIのOpenSearchでも見れることがゴールとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/e69ff82a-36fb-b2f6-c8cf-0dde7b469d5e.png)


## STEP1.【AWS】手動のスナップショット作成

こちらの記事を参考に、スナップショット作成しました。

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

必要なポリシーやロールなどの権限周りは、上記の公式サイトを見てもいいですし、
ググるといろんな方の検証記事も出てきます。


+ スナップショット作成

~~~md:入力
PUT /_snapshot/index-repo-s3/snapshot0829
~~~


+ スナップショットの確認

~~~md:入力
GET /_snapshot/index-repo-s3/_all
~~~



### Cloudshellを使って、S3からローカルにダウンロードする。

スナップショットの作成が上手くいくと、予め作成したS3バケットにファイルが吐かれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/142cb685-5c88-75e6-377f-8f655a2e6256.png)

+ Cloudshell上にコピー
```
[cloudshell-user@ip-10-134-17-224 ~]$ aws s3 cp s3://bucket-es-repo-snapshot-0826 ./snapshot20240829 --recursive
```

+ 該当ファイルをzip化
```
[cloudshell-user@ip-10-134-17-224 ~]$ zip snapshot20240829.zip -r snapshot20240829/
```
[アクション]から[ファイルのダウンロード]を押し、該当zipをダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/590151d7-3f46-bc1f-f26d-104de5148fc3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/f2f4ce64-3d28-e42e-69b5-6d78a8705f57.png)


## STEP2.【OCI】そのスナップショットをOCIのObjectStorageへアップロード
### ObjectSroategeにバケットを作成

以下のチュートリアルの「1.コンソール画面の確認とバケットの作成」を参考に実施する

https://oracle-japan.github.io/ocitutorials/beginners/object-storage/

ちなみに私はこんなバケットを今回用の作成しました。
バケット名だけわかりやすく指定して、それ以外はデフォルト値です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/70fa03fc-af36-4074-6f21-4b5a241f23a5.png)


### スナップショットをバケットにアップロードする

+ CloudShellにzipファイルをアップロード

今回はCloudShellを使って、CLIでスナップショットをオブジェクトストレージにアップロードします。

Cloudshellはコンソール画面の右上から出すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/1cd8a1ed-5e26-6a6c-2c27-e7ee952d3e7b.png)

CloudShellの右上の歯車マークからアップロードを選択し、さっきのzipファイルを選択して、アップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/dac67fd7-58a1-4940-2c20-41a470fa6044.png)


+ 解凍
```
ritsuko_to@cloudshell:~ (ap-osaka-1)$ unzip snapshot20240829.zip 
```

+ アップロード
今回はフォルダ構成も含むので、CLIでサクッとアップロードしたいと思います。
ご自身の環境に、以下の3つの箇所は編集してコマンドを打ってください。

```
oci os object bulk-upload -bn <バケット名> -ns <ネームスペース> --src-dir <アップロードしたいフォルダ名>     
```

ここにドキュメントも置いておくので、コマンドで困ったらこちらもご確認下さい。
https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.47.0/oci_cli_docs/cmdref/os/object/bulk-upload.html



上手くいくと、該当のObjectStorageにフォルダが吐かれます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/06bfc3df-ef82-1f45-3531-8c3ca1c7b910.png)




## STEP3.【OCI】移行先クラスタを作成し、リポジトリを登録
### OCIでOpenSearchのクラスタを作成

具体的な作成手順は、以下のチュートリアルがとても参考になります。

https://oracle-japan.github.io/ocitutorials/opensearch/search-application-for-beginners/

上記のサイトの「2.クラスタへの接続」までを実施して、
OpenSearchのダッシュボードへアクセスの確認をしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/e310b048-57f8-6962-a4c9-31224043045d.png)

### リポジトリの登録

以下のようにレポジトリを登録します。<>はご自身の環境に応じて修正下さい

```
PUT _snapshot/<repository_name>　※レポジトリ名を指定
{
   "type": "oci",
      "settings": {
      "client": "default",
      "endpoint": "<objectstorage_endpoint>", ※ご自身のオブジェクト・ストレージ・バケットのエンドポイントに修正
      "bucket": "<bucket_name>",　※作成したオブジェクトストレージのバケット名に修正
      "namespace": "<namespace>",　※作成したバケットのオブジェクト・ストレージ・ネームスペース。
      "authType": "RESOURCE_PRINCIPAL",
      "bucket_compartment_id": "<bucket_compartment_OCID>",　※バケットが配置されているコンパートメントのOCID。
      "forceBucketCreation": true
   }
}
```

`objectstorage_endpoint`や`bucket_name`や`namespace`や`bucket_compartment_OCID`をどこで確認すればいいかは、
以下に解説しているので、気になる方は▶をクリックしてご確認下さい。

<details><summary>objectstorage_endpoint</summary>


オブジェクトストレージのエンドポイントは個々の環境によって変わるのではなく、リージョン単位で変わります。
以下のリンクの「オブジェクト・ストレージおよびアーカイブ・ストレージApi」の「オブジェクト・ストレージAPI」にリージョン毎のエンドポイントが書いてあります。
ちなみに東京リージョンであれば、`https://objectstorage.ap-tokyo-1.oraclecloud.com`になります。

https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/apiref.htm


</details>
<details><summary>bucket_name</summary>
これです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/9ac8b552-4a79-065f-5a65-093ea83e22e1.png)

</details>


</details>
<details><summary>namespace</summary>
これです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/668d1646-acb8-e41d-47df-05691afe6205.png)

</details>

</details>
<details><summary>bucket_compartment_OCID</summary>
これです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/067df410-7ac0-4fdb-fbbc-af4f195913cf.png)

</details>


### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/16f6053a-c521-e897-b115-174478e383a2.png)






## STEP4.【OCI】スナップショットをリストア

https://docs.oracle.com/ja-jp/iaas/Content/search-opensearch/Concepts/importingacluster.htm#importingacluster__restore

このドキュメントを参考に、リストアをします。
個人的に、考え無しにドキュメントのひな形を使った結果、
注意点としては`"rename_replacement": "restored_$1",`と書いてるので、
リストアしたインデックスには先頭に`restored_`が付くことです。

```
POST _snapshot/<repository_name>/<snapshot_name>/_restore
{
    "indices": "<index_name_to_include>,-<index_name_to_exclude>",
    "ignore_unavailable": true,
    "include_global_state": false,
    "rename_pattern": "(.+)",
    "rename_replacement": "restored_$1",
    "include_aliases": true
```

<details><summary>repository_name</summary>


先ほどの手順でOCI上で作成したリポジトリ名です。

</details>

<details><summary>snapshot_name</summary>


AWSでスナップショット作成する際に、指定した名前です。

</details>

<details><summary>index_name_to_include　と　index_name_to_exclude</summary>
リストア先に同じindex名が存在するとリストア出来ない為、
リストアしたいindexとリストアから除きたいindex名を指定できます。

</details>


### 実行結果


```
POST _snapshot/index-repo-oci/snapshot0829/_restore
{
    "indices": "account",
    "ignore_unavailable": true,
    "include_global_state": false,
    "rename_pattern": "(.+)",
    "rename_replacement": "restored_$1",
    "include_aliases": true
}
```



### 確認

試しに検索してみます。
```
GET restored_accounts/_search
{
  "query": {
    "match": {
      "firstname": "Amber"
    }
  }
}
```

出てきました！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490789/d5d2124e-0308-e264-14f9-069f765a5371.png)


正直ここらへんの記事は１つにまとまっていることがなく、
いろんな記事を参考に検証してみて、今回１つにまとめてみました。
（個人的には権限周りの設定が足りなく苦労しました。）

不備などあれば、ご連絡下さい。