2024年8月の内容です。
OCI Search with OpenSearchって?
Oracle Cloud Infrastructure Search Service with OpenSearch は、OpenSearch に基づいてアプリケーション内検索ソリューションを構築するために使用できるマネージド・サービスです。
ドキュメントはこちら
概要資料はこちら
チュートリアルはこちら
流れ
- STEP1.【AWS】手動のスナップショット作成
- STEP2.【OCI】そのスナップショットをOCIのObjectStorageへアップロード
- STEP3.【OCI】移行先クラスタを作成し、リポジトリを登録
- STEP4.【OCI】スナップショットをリストア
AWSに関しては、以下の記事を参考に、
OCIに関しては、以下の記事を参考に検証を進めていきます。
今回は権限周りに関して、上記のドキュメントに記載されている権限は既に付与されているものとします。特段今回は解説しないのでご承知おきください。
バージョンに注意してください。
AWSとOCIのOpenSearchバージョンが一緒であることを確認してください。(特にOCIは2.11までしかサポートされてません) ※2024/8時点
ちなみに、私はAWSのバージョンが2.15で移行時にエラーを出しました
OCIでクラスタを作成するときは、スナップショットをインポートするソース・クラスタ(今回はAWS)と同じノード構成でクラスタを構成してください。
前提
事前にAWSのOpenSearchには、OCIのチュートリアルであるデータセットを入れておき、
スナップショットを取って、OCIでリストアした際にそのデータセットが見れることを確認します。
AmaberさんのデータをOCIのOpenSearchでも見れることがゴールとします。
STEP1.【AWS】手動のスナップショット作成
こちらの記事を参考に、スナップショット作成しました。
必要なポリシーやロールなどの権限周りは、上記の公式サイトを見てもいいですし、
ググるといろんな方の検証記事も出てきます。
- スナップショット作成
PUT /_snapshot/index-repo-s3/snapshot0829
- スナップショットの確認
GET /_snapshot/index-repo-s3/_all
Cloudshellを使って、S3からローカルにダウンロードする。
スナップショットの作成が上手くいくと、予め作成したS3バケットにファイルが吐かれました。
- 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をダウンロードする
STEP2.【OCI】そのスナップショットをOCIのObjectStorageへアップロード
ObjectSroategeにバケットを作成
以下のチュートリアルの「1.コンソール画面の確認とバケットの作成」を参考に実施する
ちなみに私はこんなバケットを今回用の作成しました。
バケット名だけわかりやすく指定して、それ以外はデフォルト値です。
スナップショットをバケットにアップロードする
- CloudShellにzipファイルをアップロード
今回はCloudShellを使って、CLIでスナップショットをオブジェクトストレージにアップロードします。
Cloudshellはコンソール画面の右上から出すことができます。
CloudShellの右上の歯車マークからアップロードを選択し、さっきのzipファイルを選択して、アップロードします。
- 解凍
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にフォルダが吐かれます。
STEP3.【OCI】移行先クラスタを作成し、リポジトリを登録
OCIでOpenSearchのクラスタを作成
具体的な作成手順は、以下のチュートリアルがとても参考になります。
上記のサイトの「2.クラスタへの接続」までを実施して、
OpenSearchのダッシュボードへアクセスの確認をしておきます。
リポジトリの登録
以下のようにレポジトリを登録します。<>はご自身の環境に応じて修正下さい
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
をどこで確認すればいいかは、
以下に解説しているので、気になる方は▶をクリックしてご確認下さい。
objectstorage_endpoint
オブジェクトストレージのエンドポイントは個々の環境によって変わるのではなく、リージョン単位で変わります。
以下のリンクの「オブジェクト・ストレージおよびアーカイブ・ストレージApi」の「オブジェクト・ストレージAPI」にリージョン毎のエンドポイントが書いてあります。
ちなみに東京リージョンであれば、https://objectstorage.ap-tokyo-1.oraclecloud.com
になります。
https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/apiref.htm
実行結果
STEP4.【OCI】スナップショットをリストア
このドキュメントを参考に、リストアをします。
個人的に、考え無しにドキュメントのひな形を使った結果、
注意点としては"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
repository_name
先ほどの手順でOCI上で作成したリポジトリ名です。
snapshot_name
AWSでスナップショット作成する際に、指定した名前です。
index_name_to_include と index_name_to_exclude
リストア先に同じindex名が存在するとリストア出来ない為、 リストアしたいindexとリストアから除きたいindex名を指定できます。実行結果
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"
}
}
}
出てきました!!!
正直ここらへんの記事は1つにまとまっていることがなく、
いろんな記事を参考に検証してみて、今回1つにまとめてみました。
(個人的には権限周りの設定が足りなく苦労しました。)
不備などあれば、ご連絡下さい。