このトピックでは、Amazon Web Services (AWS) ES から Alibaba Cloud Elasticsearch へインデックスデータを移行する方法について説明します。このソリューションでは、スナップショットベースの移行を使用します。AWS S3 に AWS ES データのスナップショットを作成し、そのスナップショットデータを Alibaba Cloud OSS に転送した後、Alibaba Cloud Elasticsearch でインデックスを復元します。
仕組み
この移行は Elasticsearch のスナップショットメカニズムに基づいており、特定のクラウドベンダーに依存しません。移行元の AWS ES クラスターでスナップショットを作成して AWS S3 バケットに保存し、スナップショットデータを Alibaba Cloud OSS に転送した後、移行先の Alibaba Cloud Elasticsearch クラスターで OSS からインデックスを復元します。スナップショットデータのクラウド間転送は、Migration Implementation ツールを使用して実行することもできます。このツールは、Tencent Cloud COS に保存された ES スナップショットデータにも適用されます。復元操作では、ES の 手動バックアップと復元 機能を使用します。
ES スナップショットは、同じバージョンまたはそれ以降のバージョンを実行しているクラスターにのみ復元できます。この制約はパッチバージョンレベルまで適用されます。詳細については、「スナップショットの互換性」をご参照ください。たとえば、移行元の AWS ES クラスターが 7.10.2 を実行していて、移行先の Alibaba Cloud Elasticsearch クラスターで 7.10.0 を選択した場合、復元操作は失敗し、the snapshot was created with Elasticsearch version [7.10.2] which is higher than the version of this node [7.10.0] が返されます。この場合は、7.16.2 など、より新しいバージョンを選択してください。

移行は 4 つのフェーズで構成され、このトピックの 4 つのステップに 1 対 1 で対応します。
-
リソースの準備:移行元の AWS ドメイン、AWS S3 バケット、IAM ロールとポリシー、および移行先の Alibaba Cloud Elasticsearch クラスターと OSS バケット。
-
AWS ES で S3 バケットを指すスナップショットリポジトリの登録。
-
最初のフルスナップショットの移行:スナップショットを作成し、OSS に転送し、Alibaba Cloud Elasticsearch で OSS リポジトリを登録後、インデックスを復元します。
-
増分スナップショットの移行と切り替え:移行元クラスターへの書き込みを停止し、増分スナップショットを作成し、OSS に転送し、スナップショットを復元してドキュメント数を確認後、サービス トラフィックを切り替えます。
ステップ1:移行リソースの準備
ご自身の AWS S3 バケットに保存されている手動スナップショットのみ移行できます。AWS が毎日自動的に作成するスナップショットは 14 日間保持され、別のドメインへの移行はできず、現在のドメインの復元にのみ使用できます。手動スナップショットには、AWS S3 の標準料金が適用されます。移行を開始する前に、次の準備を完了してください。
移行元 AWS リソースの準備
-
AWS ドメインを作成します。Amazon OpenSearch Service では、7.1.0.0 などの初期の Elasticsearch バージョンは廃止されています。コンソールで現在利用可能なバージョンのいずれかを使用してください。このトピックでは、Elasticsearch 7.10.2 を例として使用します。任意のリージョンを使用できます。このトピックでは us-east-1 を使用します。詳細については、「Amazon OpenSearch Service ドメインの作成と管理」をご参照ください。
説明ドメインで、きめ細かなアクセス制御が有効になっており、マスターユーザーのタイプが IAM である場合、またはドメインのアクセスポリシーが IAM プリンシパルのみを許可している場合 (たとえば、
es:ESHttp*がアカウントのルートユーザーにのみ付与されている場合など)、ブラウザーからドメインの Kibana コンソールにログオンできません。リクエストは 403 エラーUser: anonymous is not authorized to perform: es:ESHttpGetを返します。この場合は、このトピックのすべての AWS 側のコマンドを、AWS Signature Version 4 (SigV4) で署名されたリクエストとして実行してください。たとえば、ステップ2で説明されている Python クライアントを再利用します。 -
手動スナップショットを保存する AWS S3 バケットを作成し、バケットの Amazon リソースネーム (ARN) を記録してください。ARN は、IAM ポリシーの Resource ステートメントと、スナップショットリポジトリを登録する Python クライアントの 2 か所で使用されます。
次の例は ARN を示しています。
arn:aws:s3:::eric-es-index-backups -
AWS ES で移行するインデックスを準備します。このトピックでは、
moviesという名前のインデックスを使用します。
IAM ロールと IAM ポリシーの作成
IAM ロールは AWS ES に S3 バケットへのアクセスを許可し、IAM ポリシーはロールが実行できるアクションを制限します。両方を作成し、ポリシーをロールにアタッチする必要があります。
-
AWS ES に権限を付与する IAM ロールを作成します。このロールは、スナップショットリポジトリを登録する際に必要であり、このロールを引き受ける権限を持つ IAM ユーザーのみがリポジトリを登録できます。
ロールの信頼関係の
Serviceステートメントは、次の例に示すようにes.amazonaws.comに設定する必要があります。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }IAM コンソールで、左側のナビゲーションペインで [ロール] を選択し、対象のロールを見つけ、[信頼関係] タブをクリックし、次に [信頼関係の編集] をクリックして信頼ポリシーを表示および編集します。
説明IAM コンソールで AWS サービスのロールを作成する際、[ロールタイプの選択] ドロップダウンリストに AWS ES は表示されません。[AWS EC2] を選択してロールを作成し、
ec2.amazonaws.comをes.amazonaws.comに変更します。 -
IAM ポリシーを作成し、先ほどの IAM ロールにアタッチして、ロールが S3 バケットで実行できるアクションを制限します。
ポリシーの Resource ステートメントでは、スナップショットを保存する S3 バケットの ARN を指定する必要があります。次の例では、
eric-es-index-backupsバケットを指定しています。{ "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/*" ] } ] }ポリシーの作成後、IAM コンソールで、左側のナビゲーションペインで [ポリシー] を選択し、ポリシー名をクリックして詳細ページを開き、[権限] タブの JSON ビューでポリシーの内容が前述の例と一致することを確認します。[ポリシーの概要] は、ポリシーが S3 への限定:一覧表示、読み取り、書き込みアクセスを許可することを示します。
次に、左側のナビゲーションペインで[ロール]をクリックし、対象のロールを選択して、[権限]タブでポリシーがアタッチされていることを確認します。
移行先 Alibaba Cloud リソースの準備
-
中国 (杭州) リージョンで Alibaba Cloud Elasticsearch クラスターを作成します。クラスターのバージョンは、移行元の AWS ES クラスターの正確なパッチバージョン以降である必要があります。移行元クラスターが 7.10.2 を実行している場合は、7.16.2 を選択してください。詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
-
AWS S3 から転送されるスナップショットデータを受信する OSS バケットを作成します。このトピックで使用するバケットは、中国 (杭州) リージョンにあり、Standard ストレージクラスとプライベート ACL を使用し、その他すべてのパラメーターはデフォルト値を保持します。詳細については、「バケットの作成」をご参照ください。
ステップ2:AWS ES でのスナップショットリポジトリの登録
手動スナップショットは、AWS ES で S3 バケットを指すスナップショットリポジトリを登録した後にのみ作成できます。登録リクエストは、「ステップ1:移行リソースの準備」で作成した IAM ロールの信頼関係で指定されているユーザーまたはロールが、AWS Signature Version 4 (SigV4) で署名する必要があります。curl コマンドは AWS リクエスト署名をサポートしていないため、次の Python クライアントを使用してリポジトリを登録します。
登録スクリプトの準備
-
register_snapshot_repository.py ファイルをダウンロードします。
-
スクリプト内のコメントでマークされているパラメーター値を変更し、スクリプトを snapshot.py として保存してください。
次の表にパラメーターを示します。
パラメーター
説明
region
スナップショットリポジトリが作成される AWS リージョン。
host
AWS ES ドメインのエンドポイント。
aws_access_key_id
IAM 認証情報の ID。
aws_secret_access_key
IAM 認証情報のキー。
service
署名に使用される AWS サービス識別子。Elasticsearch バージョンを含む Amazon OpenSearch Service の場合、値は常に
esです。url
スナップショットリポジトリを登録するリクエスト URL。
https://{host}/_snapshot/{repository-name}の形式です。リポジトリ名は、スナップショットの作成と復元時に使用する名前と同じである必要があります。payload
「ステップ1:移行リソースの準備」で IAM ロール用に作成した S3 バケットの名前と ARN を含める必要があります。
重要-
設定に
"base_path": "<custom-prefix>"を追加して、このクラスターのスナップショットファイルが指定されたプレフィックス配下に保存され、同じ S3 バケット内の他のクラスターのスナップショットとパスを共有しないようにすることを推奨します。詳細については、FAQ セクションのリポジトリの一意性の説明をご参照ください。プレフィックスを記録してください。Alibaba Cloud Elasticsearch で OSS リポジトリを登録する際に指定するbase_path値は、OSS 内のスナップショットデータの実際のプレフィックスと一致させる必要があります。 -
スナップショットリポジトリに対して S3 管理キーを使用したサーバー側の暗号化を有効にするには、設定 JSON に
"server_side_encryption": trueを追加します。 -
S3 バケットが ap-southeast-1 リージョンにある場合は、
"endpoint": "s3.amazonaws.com"を使用し、"region": "ap-southeast-1"は使用しないでください。
-
依存関係のインストールと登録の実行
-
サンプル Python クライアントが必要とする依存関係をインストールします。
サンプル Python クライアントは、requests を使用してリクエストを送信し、requests-aws4auth を使用してリクエストに署名します。Python 3 環境で、登録を実行するマシンに両方の依存関係をインストールしてください。
pip install requests requests_aws4auth -
Python クライアントを実行して、スナップショットリポジトリを登録します。登録が成功すると、HTTP ステータスコード 200 と
{"acknowledged" : true}が返されます。python snapshot.py
登録結果の確認
-
AWS ES ドメインの Kibana コンソールにログオンし、[Dev Tools] > [Console] ページで次のコマンドを実行して結果を表示します。 ドメインできめ細かなアクセスコントロールが有効になっている場合、またはアクセスポリシーで IAM プリンシパルのみが許可されていて Kibana にログオンできない場合は、同じコマンドを署名付きリクエストとして実行します。 たとえば、前述の Python クライアントを再利用して、リクエストメソッドを GET に変更します。
GET _snapshotレスポンスには、登録されたスナップショットリポジトリの設定が返されます。システムが自動的に作成するリポジトリの名前は
cs-automatedです。ドメインで保管時の暗号化が有効になっている場合、リポジトリの名前はcs-automated-encです。{ "eric-snapshot-repository": { "type": "s3", "settings": { "bucket": "eric-es-index-backups", "base_path": "eric-aws", "region": "us-east-1", "role_arn": "arn:aws:iam::xxx:role/eric-iam-role-es" } }, "cs-automated-enc": { "type": "s3" } }
ステップ3:最初のフルスナップショットの移行
このステップでは、移行元クラスター上の既存のすべてのデータを移行先クラスターへ移行します。AWS ES でフルスナップショットを作成し、スナップショットデータを Alibaba Cloud OSS へ転送してから、Alibaba Cloud Elasticsearch で OSS リポジトリを登録してインデックスを復元します。
AWS ES でのフルスナップショットの作成
AWS ES ドメインの Kibana コンソールの [Dev Tools] ページで、次の AWS 側のコマンドを実行します。ブラウザからドメインの Kibana コンソールにログオンできない場合は、SigV4 で署名されたリクエストとして同じコマンドを実行します。
-
eric-snapshot-repositoryリポジトリに、moviesインデックスのスナップショットとしてsnapshot_movies_1を作成します。PUT _snapshot/eric-snapshot-repository/snapshot_movies_1 { "indices": "movies" } -
スナップショットのステータスを確認します。
stateがSUCCESSの場合、スナップショットの作成が完了しています。GET _snapshot/eric-snapshot-repository/snapshot_movies_1{ "snapshots": [ { "snapshot": "snapshot_movies_1", "uuid": "BlgKLvgoSpSgwBnbD4hIWg", "version_id": 7100299, "version": "7.10.2", "indices": [ "movies" ], "data_streams": [], "include_global_state": true, "state": "SUCCESS", "start_time": "2018-02-28T03:00:44.591Z", "start_time_in_millis": 1519786844591, "end_time": "2018-02-28T03:00:46.236Z", "end_time_in_millis": 1519786846236, "duration_in_millis": 1645, "failures": [], "shards": { "total": 5, "failed": 0, "successful": 5 } } ] } -
AWS S3 コンソールで、スナップショットファイルが生成されていることを確認してください。
スナップショットの作成後、S3 バケット eric-es-index-backups には、生成されたスナップショットファイル (
indicesフォルダー、index-0、index.latest、meta-BlgKLvgoSpSgwBnbD4hIWg.dat、およびsnap-BlgKLvgoSpSgwBnbD4hIWg.dat) が格納されます。
スナップショットデータの Alibaba Cloud OSS への転送
スナップショットデータを AWS S3 から Alibaba Cloud OSS へ転送します。詳細については、「Amazon S3 から OSS へアプリケーションを移行する」をご参照ください。
転送が完了したら、OSS コンソールでスナップショットデータが配置されていることを確認してください。
OSS バケットには、次のスナップショットファイルが格納されています:indices/ (フォルダー)、index-0、index.latest、meta-BlgKLvgoSpSgwBnbD4hIWg.dat、および snap-BlgKLvgoSpSgwBnbD4hIWg.dat。
Alibaba Cloud Elasticsearch での OSS スナップショットリポジトリの登録
-
スナップショットリポジトリを作成します。
Elasticsearch スナップショットの移行時には、各 Elasticsearch クラスターが専用のスナップショットリポジトリまたはパスを使用するようにする必要があります。複数のクラスターが同じリポジトリを共有すると、データの復元が失敗したり、データが失われたりする可能性があります。
移行先の Alibaba Cloud Elasticsearch クラスターの Kibana コンソールにログイン (Kibana コンソールへのログイン) し、[Dev Tools] > [Console] ページで次のコマンドを実行して、同じ名前のスナップショットリポジトリを作成します。
base_pathの値は、データが OSS に転送された後のスナップショットデータの実際のプレフィックスと同じである必要があります。 AWS 側のリポジトリでbase_pathが設定されておらず、かつスナップショットファイルがバケットのルートディレクトリにある場合は、こちらでもbase_pathを設定しないでください。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レスポンスの
stateがSUCCESSの場合、Alibaba Cloud Elasticsearch は OSS リポジトリからスナップショットを読み取れることを意味します。snapshot_missing_exceptionが返される場合は、base_pathが OSS 内のスナップショットデータの実際のプレフィックスと一致しているか確認してください。説明このスナップショットの開始時刻と終了時刻を記録してください。これらの値は、増分スナップショットデータを移行する際に必要になります。例:
-
"start_time_in_millis": 1519786844591
-
"end_time_in_millis": 1519786846236
-
インデックスの復元とデータの確認
Alibaba Cloud Elasticsearch クラスターの Kibana コンソールで次のコマンドを実行して、スナップショットを復元します。
POST _snapshot/eric-snapshot-repository/snapshot_movies_1/_restore
{
"indices": "movies"
}
次のコマンドを実行して、movies インデックスの可用性を確認します。
GET movies/_recovery
復元が完了すると、movies インデックス内のドキュメント数は、移行元の AWS ES ドメインの数と同じになります。
Alibaba Cloud Elasticsearch クラスターの Kibana コンソールでデータを検証するには、[Discover] ページで [movies] インデックスを選択します。この例では、復元後にソースクラスターと同じ 3 つのドキュメント (The Manchurian Candidate、Mars Attacks!、U.S. Marshals) が返されます。
Step 4: Migrate incremental snapshots and switch over
After the first full snapshot is migrated, the data that is written to the source cluster in the meantime must be caught up by using incremental snapshots. Before the formal switchover, stop all services that can modify the indexes on the source cluster, and then perform this step to ensure that the last incremental snapshot contains all data. The following example writes 2 more documents to the source cluster.
Create an incremental snapshot in AWS ES
-
Write incremental data to the
moviesindex in AWS ES.In this example, 2 documents are written. After the write operation, the
moviesindex contains 5 documents whose_idvalues are 1 to 5. RunGET movies/_countto check the current number of documents, which is used for comparison with the destination cluster. -
Create the incremental snapshot.
Run the following command to manually create a snapshot. For more information, see Create a full snapshot in AWS ES.
PUT _snapshot/eric-snapshot-repository/snapshot_movies_2 { "indices": "movies" }After the snapshot is created, run the following command to check the snapshot status.
GET _snapshot/eric-snapshot-repository/snapshot_movies_2View the new snapshot files in the AWS S3 console.
The S3 bucket lists all files of the snapshot repository. The new files that correspond to
snapshot_movies_2aresnap-CWhlF7ShQZaKQlJasPE70A.dat,index.latest,index-1, andmeta-CWhlF7ShQZaKQlJasPE70A.dat.
Transfer the incremental snapshot data to Alibaba Cloud OSS
Transfer the incremental snapshot data from AWS S3 to Alibaba Cloud OSS by using ossimport. The S3 bucket already contains the files of the first snapshot. We recommend that you set isSkipExistFile to true in the local_job.cfg configuration file to transfer only the new snapshot files.
isSkipExistFile is a boolean parameter. The default value false indicates that existing objects are overwritten. If the value is true, the objects that are already migrated are skipped based on the size and LastModifiedTime values of the objects. This parameter does not take effect when jobType is audit.
After the transfer is complete, the new snapshot files appear in OSS.
After the incremental files are transferred to OSS, Alibaba Cloud Elasticsearch continues to use the cached repository content. As a result, GET _snapshot/eric-snapshot-repository/_all may still return only the first snapshot. In the Kibana console of the Alibaba Cloud Elasticsearch cluster, register the OSS repository that has the same name again: run DELETE _snapshot/eric-snapshot-repository first, and then re-create the repository by using the PUT command described in Step 3. Confirm that the new snapshot is visible, and then restore the incremental snapshot.
The new files are index-1, index.latest, meta-CWhIF7ShQZaKQUasPE70A.dat, and snap-CWhIF7ShQZaKQUasPE70A.dat.
Restore the incremental snapshot and switch service traffic
The commands that restore the incremental snapshot are the same as the commands in Step 3: Migrate the first full snapshot. However, you must close the movies index before the restoration and reopen the movies index after the restoration.
-
Close the
moviesindex.POST /movies/_close -
Check the status of the
moviesindex and confirm that the state has changed toclose. You cannot useGET movies/_statsto query a closed index because the request returnsindex_closed_exception. Run the following command instead.GET _cat/indices/movies?v -
Restore the incremental snapshot.
POST _snapshot/eric-snapshot-repository/snapshot_movies_2/_restore { "indices": "movies" } -
Open the
moviesindex.POST /movies/_open
After the restoration is complete, run GET movies/_count to verify the number of documents. In this example, the destination cluster returns 5, which is the same as the source AWS ES cluster. You can then switch service traffic to the Alibaba Cloud Elasticsearch cluster.
よくある質問
なぜリポジトリの一意性が必要なのですか?
ソースクラスターと宛先クラスターを含む複数の Elasticsearch クラスターが、同時に同じスナップショットリポジトリを使用する場合、以下の問題が発生します。
-
Metadata conflicts: Multiple clusters operating on the same repository can overwrite or corrupt metadata files, preventing snapshots from being correctly identified.
-
Data overwrites: Snapshots from different clusters may overwrite each other's data files, causing data loss or corruption.
-
Restoration failures: Elasticsearch cannot determine which data belongs to which cluster, causing restore operations to fail or restore incorrect data.
したがって、各 Elasticsearch クラスターに専用のスナップショットリポジトリを使用するか、base_path を使用して同じバケット内のパスを分離してください。複数のクラスターが同じリポジトリにアクセスする必要がある場合は、1 つのクラスターにのみ書き込み権限を付与し、他のクラスターではリポジトリを "readonly": true で登録して、読み取り専用モードでアタッチするようにします。
Alibaba Cloud Elasticsearch で OSS のスナップショットからインデックスデータを復元する際に、エラーが発生するのはなぜですか?
原因として、スナップショットデータの OSS パスに、スラッシュ (/) で終わる空のディレクトリ名やその他の特殊文字が含まれていることが考えられます。 たとえば、OSS コンソールに「/」という名前の異常な階層が表示されます。
Alibaba Cloud Elasticsearch は、スナップショットファイルのパスに含まれるこのような文字をサポートしていません。この問題を解決するには、ossbrowser を使用して OSS スナップショットデータを通常の名前のフォルダーに移動します。