このトピックでは、Amazon OpenSearch Service から Alibaba Cloud Elasticsearch に Elasticsearch インデックスデータを移行する方法について説明します。
注意事項
このソリューションはクラウド サービス プロバイダー (CSP) に限定されず、Elasticsearch スナップショットメカニズムに依存します。たとえば、Alibaba Cloud が提供するデータオンライン移行サービスを使用して、Amazon OpenSearch Service または Tencent Cloud Object Storage (COS) から Alibaba Cloud Object Storage Service (OSS) にスナップショット内の Elasticsearch データを移行できます。その後、データを宛先クラスタにリストアします。Alibaba Cloud OSS にデータを移行する方法については、「データの移行」をご参照ください。スナップショット内のデータをリストアする方法については、「手動スナップショットの作成と手動スナップショットからのデータのリストア」をご参照ください。
宛先 Elasticsearch クラスタのバージョンは、ソース Elasticsearch オブジェクトと同じかそれ以上である必要があります。バージョンの互換性については、「スナップショットからのデータ復旧のバージョンの互換性」をご参照ください。
背景情報
次の図は、移行の参照アーキテクチャを示しています。
用語
Elasticsearch: さまざまなシナリオ向けに設計された、分散型の RESTful 検索および分析エンジン。Elastic Stack のコアとして、Elasticsearch はデータを一元的に保存し、データを検索および分析します。
Kibana: データを検索および分析するためのビジュアル インターフェイスを提供します。
Amazon OpenSearch Service: 2021 年 9 月に、Amazon Elasticsearch Service は Amazon OpenSearch Service に名前が変更されました。Amazon OpenSearch Service は、使いやすい Elasticsearch API とリアルタイム分析機能を提供するマネージド サービスです。このサービスは、本番ワークロードに必要な可用性、スケーラビリティ、およびセキュリティも提供します。Amazon OpenSearch Service を使用すると、ログ分析、全文検索、アプリケーション監視などのシナリオ向けに Elasticsearch クラスタを簡単にデプロイ、保護、管理、およびスケーリングできます。
Alibaba Cloud Elasticsearch: データ分析や検索などのシナリオ向けに、オープンソースの Elasticsearch をベースに設計されています。オープンソースの Elasticsearch をベースにした Alibaba Cloud Elasticsearch は、エンタープライズクラスのアクセス制御、セキュリティ監視とアラート、自動レポートを提供します。
スナップショットとリストア: 個々のインデックスまたはクラスタ全体のスナップショットを、Amazon Simple Storage Service (Amazon S3) や HDFS などの共有ファイルシステムのようなリモートリポジトリに保存できます。スナップショットを使用してデータをリストアできます。ただし、データは特定のバージョンの Elasticsearch クラスタにのみリストアできます。
Elasticsearch 5.x クラスタで作成されたスナップショットのデータは、Elasticsearch 6.x クラスタにリストアできます。
Elasticsearch 2.x クラスタで作成されたスナップショットのデータは、Elasticsearch 5.x クラスタにリストアできます。
Elasticsearch 1.x クラスタで作成されたスナップショットのデータは、Elasticsearch 2.x クラスタにリストアできます。
移行プラン
Amazon OpenSearch Service ドメインから Alibaba Cloud Elasticsearch クラスタにデータを移行するには、次の手順を実行します。
ベースライン インデックスを作成します。
スナップショットリポジトリを作成し、Amazon S3 バケットに関連付けます。
データを移行するインデックスの最初のスナップショットを作成します。最初のスナップショットは完全スナップショットです。
このスナップショットは S3 バケットに自動的に保存されます。
Alibaba Cloud Object Storage Service (OSS) バケットを作成し、Alibaba Cloud Elasticsearch クラスタにスナップショットリポジトリとして登録します。
ossimport を使用して、完全スナップショットを S3 バケットから OSS バケットに転送します。
完全スナップショットから Alibaba Cloud Elasticsearch クラスタにデータをリストアします。
増分スナップショットを定期的に処理します。
上記の手順を繰り返して、増分スナップショットからデータをリストアします。
最終スナップショットを特定し、サービス スイッチオーバーを実行します。
インデックスデータを変更する可能性のあるサービスを停止します。
Amazon OpenSearch Service ドメインの最終スナップショットを作成します。
最終スナップショットを OSS バケットに転送します。次に、スナップショットから Alibaba Cloud Elasticsearch クラスタにデータをリストアします。
クラスタへのサービス スイッチオーバーを実行し、移行されたデータをクラスタで表示します。
前提条件
次の操作が実行されます。
シンガポール リージョンに Elasticsearch 5.5.2 の Amazon OpenSearch Service ドメインを作成します。
詳細については、「Amazon OpenSearch Service ドメインの作成」をご参照ください。
中国 (杭州) リージョンに Alibaba Cloud Elasticsearch V5.5.3 クラスタを作成します。
詳細については、「Alibaba Cloud Elasticsearch クラスタの作成」をご参照ください。
OSS バケットを作成します。
この例では、OSS バケットは中国 (杭州) リージョンに作成されます。バケットのストレージタイプは標準で、バケットのアクセス制御リスト (ACL) はプライベートです。その他のパラメータにはデフォルト設定が使用されます。詳細については、「バケットの作成」をご参照ください。
データを移行するインデックスを準備します。この例では、
moviesインデックスが使用されます。
Amazon OpenSearch Service ドメインで手動スナップショットを作成するための前提条件
Amazon OpenSearch Service は、ドメイン内のプライマリ インデックス シャードのスナップショットを毎日自動的に作成し、事前に構成された S3 バケットに保存します。これらのスナップショットは、最大 14 日間無料で保持されます。これらのスナップショットを使用して、ドメインにデータをリストアできます。ただし、それらを使用して他のドメインにデータを移行することはできません。別のドメインにデータを移行するには、S3 バケットに保存されている手動スナップショットを使用する必要があります。手動スナップショットには標準の S3 料金が適用されます。
手動スナップショットを作成し、スナップショットからデータをリストアするには、AWS Identity and Access Management (IAM) と S3 を使用する必要があります。スナップショットを作成する前に、次の表にリストされている操作を実行します。
操作 | 説明 |
S3 バケットを作成する | バケットは、Amazon OpenSearch Service ドメインの手動スナップショットを保存するために使用されます。 |
IAM ロールを作成する | ロールは、Amazon OpenSearch Service に権限を付与するために使用されます。ロールの信頼関係を追加する場合は、 |
IAM ポリシーを作成する | このポリシーは、S3 が S3 バケットで実行できる操作を指定します。ポリシーは、Amazon OpenSearch Service に権限を付与するために使用される IAM ロールにアタッチする必要があります。ポリシーの Resource 要素で S3 バケットを指定する必要があります。 |
S3 バケットを作成する
手動スナップショットを保存するには、S3 バケットが必要です。その Amazon リソースネーム (ARN) をメモしておきます。ARN は、次の項目で使用されます。
IAM ロールにアタッチされている IAM ポリシーの Resource 要素
スナップショットリポジトリを登録するために使用される Python クライアント
次のコードは、S3 バケットの ARN を提供します。
arn:aws:s3:::eric-es-index-backupsIAM ロールを作成する
IAM ロールが必要です。その信頼関係の
Service要素で Amazon OpenSearch Service (es.amazonaws.com) が指定されています。例:{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }IAM コンソールで信頼関係の詳細を表示できます。
説明IAM コンソールでロールを作成する場合、[ロールタイプの選択] ドロップダウンリストに Amazon OpenSearch Service は含まれていません。ドロップダウンリストから [amazon EC2] を選択し、プロンプトに従ってロールを作成できます。次に、ロールの信頼関係の
ec2.amazonaws.comをes.amazonaws.comに変更します。IAM ポリシーを作成する
IAM ロールに IAM ポリシーをアタッチする必要があります。ポリシーは、Amazon OpenSearch Service ドメインの手動スナップショットを保存するために使用される S3 バケットを指定します。次のコードは、サンプル ポリシーを示しています。ポリシーでは、
eric-es-index-backupsバケットの ARN が指定されています。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups/*" ] } ] }ポリシーの内容を [ポリシーの編集] セクションにコピーします。

ポリシーが正しいかどうかを確認します。

ポリシーをロールにアタッチします。

手順 1: 手動スナップショットリポジトリを登録する
Amazon OpenSearch Service にスナップショットリポジトリを登録した後にのみ、手動スナップショットを作成できます。手動スナップショットを作成する前に、IAM ロールの信頼関係で指定されたユーザーまたはロールに AWS リクエストに署名します。詳細については、「Amazon OpenSearch Service ドメインで手動スナップショットを作成するための前提条件」をご参照ください。
cURL コマンドは AWS リクエスト署名をサポートしていないため、cURL コマンドを使用してスナップショットリポジトリを登録することはできません。代わりに、サンプル Python クライアント (register_snapshot_repository.py) を使用してスナップショットリポジトリを登録します。
register_snapshot_repository.py ファイルをダウンロードします。
ファイルを修正します。
ファイル内の黄色で強調表示されている値を実際の条件に基づいて変更します。次に、内容を snapshot.py という名前の Python ファイルにコピーします。
次の表は、サンプル Python クライアント ファイルのパラメータについて説明しています。
パラメータ
説明
region
スナップショットリポジトリが作成される AWS リージョン。
host
Amazon OpenSearch Service ドメインのエンドポイント。
aws_access_key_id
IAM 認証情報の ID。
aws_secret_access_key
IAM 認証情報のキー。
path
スナップショットリポジトリのパス。
data
値には、「Amazon OpenSearch Service ドメインで手動スナップショットを作成するための前提条件」で作成した IAM ロールの S3 バケットの名前と ARN が含まれている必要があります。
重要スナップショットリポジトリに対して S3 マネージドキーによるサーバ側暗号化を有効にする場合は、settings JSON 配列に
"server_side_encryption": trueを追加します。S3 バケットが ap-southeast-1 リージョンにある場合は、
"region": "ap-southeast-1"を"endpoint": "s3.amazonaws.com"に置き換えます。
Amazon Web Services Library boto-2.48.0 をインストールします。
上記のサンプル Python クライアントでは、スナップショットリポジトリを登録するコンピュータにバージョン 2.x の boto パッケージをインストールする必要があります。
# wget https://pypi.python.org/packages/66/e7/fe1db6a5ed53831b53b8a6695a8f134a58833cadb5f2740802bc3730ac15/boto-2.48.0.tar.gz#md5=ce4589dd9c1d7f5d347363223ae1b970 # tar zxvf boto-2.48.0.tar.gz # cd boto-2.48.0 # sudo python setup.py installPython クライアントを実行して、スナップショットリポジトリを登録します。
# python snapshot.pyAmazon OpenSearch Service ドメインの Kibana コンソールにログオンします。左側のナビゲーションウィンドウで、[dev Tools] をクリックします。表示されるページの [コンソール] タブで、次のコマンドを実行して登録結果を表示します。
GET _snapshot
手順 2: 最初のスナップショットを作成し、スナップショットからデータをリストアする
Amazon OpenSearch Service ドメインでスナップショットを作成します。
説明次のコマンドは、Kibana コンソールで、または Linux または Mac OS X コマンドライン インターフェイス (CLI) で cURL コマンドを使用して実行できます。
moviesインデックスのsnapshot_movies_1という名前のスナップショットを、eric-snapshot-repositoryスナップショットリポジトリに作成します。PUT _snapshot/eric-snapshot-repository/snapshot_movies_1 { "indices": "movies" }スナップショットのステータスを表示します。
GET _snapshot/eric-snapshot-repository/snapshot_movies_1
S3 コンソールで、スナップショット オブジェクトを表示します。

作成されたスナップショットを S3 バケットから OSS バケットに転送します。
詳細については、「Amazon S3 から Alibaba Cloud OSS にデータを移行する」をご参照ください。
スナップショットが転送されたら、OSS コンソールでスナップショットを表示します。

スナップショットから Alibaba Cloud Elasticsearch クラスタにデータをリストアします。
スナップショットリポジトリを作成します。
Elasticsearch クラスタの Kibana コンソールにログオンします。詳細については、「Kibana コンソールにログオンする」をご参照ください。次に、左側のナビゲーションウィンドウで、[dev Tools] をクリックします。表示されるページの [コンソール] タブで、次のコマンドを実行してスナップショットリポジトリを作成します。スナップショットリポジトリの名前は、Amazon OpenSearch Service に登録されているスナップショットリポジトリの名前と同じである必要があります。
PUT _snapshot/eric-snapshot-repository { "type": "oss", "settings": { "base_path": "my/snapshot/directory" "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com", "access_key_id": "your AccessKeyID", "secret_access_key": "your AccessKeySecret ", "bucket": "eric-oss-aws-es-snapshot-s3", "compress": true } }snapshot_movies_1という名前のスナップショットのステータスを表示します。GET _snapshot/eric-snapshot-repository/snapshot_movies_1
説明スナップショット作成操作の開始時刻と終了時刻をメモしておきます。このレコードは、ossimport を使用して増分スナップショットのデータを移行するときに使用されます。例:
"start_time_in_millis": 1519786844591
"end_time_in_millis": 1519786846236
スナップショットからデータをリストアします。
POST _snapshot/eric-snapshot-repository/snapshot_movies_1/_restore { "indices": "movies" }次のコマンドを実行して、
moviesインデックスの可用性を確認します。GET movies/_recoveryコマンドが正常に実行されると、
moviesインデックスに 3 セットのデータが表示されます。さらに、データは Amazon OpenSearch Service ドメインのデータと同じです。
手順 3: 最終スナップショットを作成し、スナップショットからデータをリストアする
Amazon OpenSearch Service ドメインの
moviesインデックスにデータを挿入します。moviesインデックスには 3 セットのデータが含まれています。さらに 2 セットのデータを挿入します。
GET movies/_countコマンドを実行して、インデックスのデータ量を表示できます。スナップショットを作成します。
次のコマンドを実行して、スナップショットを作成します。詳細については、「Amazon OpenSearch Service ドメインでスナップショットを作成する」をご参照ください。
PUT _snapshot/eric-snapshot-repository/snapshot_movies_2 { "indices": "movies" }スナップショットが作成されたら、次のコマンドを実行してスナップショットのステータスを表示します。
GET _snapshot/eric-snapshot-repository/snapshot_movies_2S3 バケット内のオブジェクトを表示します。

スナップショットを S3 バケットから OSS バケットに転送します。
ossimport を使用してスナップショットを転送できます。S3 バケットには 2 つのスナップショット オブジェクトが保存されます。
isSkipExistFilelocal_job.cfg ファイルの 変数の値を変更して、増分スナップショット オブジェクトを移行できます。isSkipExistFile変数は、データ移行中に既存のオブジェクトをスキップするかどうかを示します。この変数の値はブール値型です。デフォルト値は false です。値を true に設定すると、sizeとLastModifiedTimeの設定に基づいてオブジェクトがスキップされます。値を false に設定すると、既存のオブジェクトは上書きされます。jobTypeがauditに設定されている場合、この変数は無効です。次に、OSS バケット内の増分スナップショット オブジェクトを表示できます。

増分スナップショットからデータをリストアします。
詳細については、「手順 2: 最初のスナップショットを作成し、スナップショットからデータをリストアする」をご参照ください。データをリストアする前に、
moviesインデックスを無効にする必要があります。リストア後、moviesインデックスを有効にできます。moviesインデックスを無効にするPOST /movies/_closemoviesインデックスのステータスを表示するGET movies/_statsスナップショットからデータをリストアする
POST _snapshot/eric-snapshot-repository/snapshot_movies_2/_restore { "indices": "movies" }moviesインデックスを有効にするPOST /movies/_open
スナップショットからデータがリストアされると、Elasticsearch クラスタの
moviesインデックスのドキュメント数は5になります。この数は、Amazon OpenSearch Service ドメインのインデックスの数と同じです。
まとめ
スナップショットとリストア機能を使用して、Amazon OpenSearch Service ドメインから Alibaba Cloud Elasticsearch クラスタにデータを移行できます。この機能では、移行中にリクエストと書き込み操作が行われないように、データを移行するインデックスを無効にする必要があります。
詳細については、以下のトピックをご参照ください。
FAQ
Q: OSS のスナップショットから Alibaba Cloud Elasticsearch クラスタにインデックスデータをリストアすると、エラーが返されるのはなぜですか?
A: OSS のスナップショット オブジェクトの名前がスラッシュ (/) などの特殊文字であることが原因である可能性があります。
OSS のスナップショットから Alibaba Cloud Elasticsearch クラスタにインデックスデータをリストアする場合、OSS のスナップショット オブジェクトの名前を特殊文字にすることはできません。グラフィカル管理ツール ossbrowser を使用して、スナップショット オブジェクトを通常のフォルダに移動できます。