セルフマネージドのElasticsearchからAWSのElastic Cloudへ移行する方法
ワークロードをオンプレミスからクラウドに移行させるケースが増加しています。これまで長い間、一般的なユーザーはオンプレミスでセルフマネージドのElasticsearchを実行していました。しかし現在は、Amazon Web Services(AWS)、Google Cloud、Microsoft Azureの多数のリージョンで実行できるElasticsearch Service on Elastic Cloud、つまり、マネージドのElasticsearchサービスが、Elastic Stackとソリューション群(エンタープライズサーチ、オブザーバビリティ、セキュリティ)を利用する最適な方法となっています。
Elasticsearchをセルフマネージドからの移行を検討されている方は、Elasticsearch Serviceの導入によって、次の作業をElasticに任せることができます。
- 基盤インフラのプロビジョニングと管理
- Elasticsearchクラスターの作成と管理
- クラスターのスケールアップ&スケールダウン
- アップグレード、パッチ適用、スナップショット取得
一連の作業をElasticに任せることで、その時間と労力を別の課題の解決に振り向けることができます。
本ブログ記事では、「スナップショットを取得し、それをElasticsearch Serviceに復元する」というメソッドで、既存のElasticsearchクラスターをElasticsearch Serviceに移行させる方法を説明します。
クラスターのスナップショットを取得する
セルフマネージドのElasticsearchをElasticsearch Serviceに移行させるにあたってはじめに検討すべき点は、利用するクラウドプロバイダーとリージョンです。一般的にクラウドプロバイダーとリージョンは、既存のデプロイ済みのワークロード、クラウド戦略、その他の広範な要因によって決まります。
本記事では、AWSでElasticsearch Serviceを実行する場合のプロセスを説明します。Google CloudとAzureのプロセスについては、まもなく記事を公開予定です。
さて、Elasticsearchクラスターのデータを別のクラスターに移行する最も簡単な方法は、クラスターのスナップショットを取得し、それを使って新規のElasticsearch Serviceのクラスターに復元する、というものです。
クラスターのスナップショットを取得する方法はいくつかあります。最も簡単なのは、スナップショットの操作を一度だけ実行するという方法です。
仮に既存のElasticsearchが定常的にデータをインジェストしている場合、一度限りのスナップショットを使用するデメリットとして、タイムラグが生じることと、スナップショットの取得から新規のクラスターでの復元までの間のデータが失われるということがあります。このタイムラグを最小化するために望ましい対応が、スナップショットライフサイクルポリシーの作成です。検索のユースケースなど、Elasticsearchクラスターにそれほど頻繁にデータをインジェストしていない場合は、一度限りのスナップショットで十分対応することができます。
ローカルのクラスターのスナップショットを取得する前に、まずローカルのクラスターのスナップショットを格納するAWS S3バケットを設定する必要があります。AWS上のElasticsearch Serviceで新たに実行するクラスターは、この場所からクラスターの状態を復元することになります。
大まかな手順は次の通りです。
- クラウドストレージ(今回はAWS S3バケット)を設定する
- ローカルのスナップショットレポジトリを設定する
- スナップショットポリシーをセットアップする
- Elasticsearch Serviceに新規のクラスターをプロビジョニングする
- Elasticsearch Serviceクラスターのカスタムスナップショットレポジトリを設定する
- ローカルのスナップショットからElasticsearch Serviceクラスターを復元する
クラウドストレージを設定する
- S3バケットを作成します。S3バケットはElasticsearch Serviceクラスターと同じリージョンに作成する必要があります。
- [JSON]タブでS3バケットポリシーを作成して、S3バケットポリシーのJSONを追加します(バケット名には実際の値を入力してください)。
- [Review policy](ポリシーをレビュー)をクリックして、ポリシーの名前を付けます。
- IAMユーザーを作成し、先ほどの手順で作成したS3バケットポリシーを割り当てます。
- [Next: Permissions](次へ:権限)をクリックし、[Attach existing policies directly](既存のポリシーを直接添付)を選択して、前の手順で作成したポリシーを見つけます。
- ポリシーにチェックが入っていることを確認し、[Next:tags](次へ:タグ)をクリックします。 タグの追加はスキップして、[Create User](ユーザーを作成)をクリックします。
- ユーザーのセキュリティ資格情報をダウンロードします。
ローカルのスナップショットレポジトリを設定する
1.S3プラグインをインストールする
Elasticsearchのホームディレクトリからローカルの各Elasticsearchノードで次のコマンドを実行し、オンプレミスのデプロイにElasticsearch S3プラグインをインストールします。
sudo bin/elasticsearch-plugin install repository-s3
このコマンドを実行した後、ノードを再起動する必要があります。
2.S3クライアント権限を設定する
次のコマンドを実行して、オンプレミスのクラスターにS3クライアント権限を設定します。
bin/elasticsearch-keystore add s3.client.default.access_key
bin/elasticsearch-keystore add s3.client.default.secret_key
この手順で、ローカルのクラスターにS3にスナップショットを書き込むために必要な資格情報を持たせることができます。access_keyとsecret_keyは、前の手順で作成したIAMユーザーのものを使用することができます。
スナップショットポリシーをセットアップする
1.ローカルのスナップショットレポジトリを設定する
次のコマンドを[Kibana Dev Tools](Kibana開発ツール)で実行し、ローカルのクラスターにS3スナップショットのレポジトリを設定します。この手順で、ローカルクラスターに対し、どのS3バケットにスナップショットを書き込むか指示することができます。先ほど作成したIAMユーザーは、このS3バケットに対する書き込みと読み取りの権限を持っている必要があります。
PUT _snapshot/{ "type": "s3", "settings": { "bucket": " " } }
2.スナップショットポリシーを作成する
次に、新たに作成したS3バケットで復元するスナップショットの取得元となるローカルクラスターに、スナップショットポリシーを作成します。
[Kibana Dev Tools](Kibana開発ツール)で一度限りのスナップショットを作成することもできます。
PUT /_snapshot// ?wait_for_completion=true { "indices": "*", "ignore_unavailable": true, "include_global_state": false }
[Kibana Dev Tools](Kibana開発ツール)で次のコマンドを実行し、スナップショットが正しく動作することを確認します。
GET _snapshot//_all
Elasticsearch Serviceに新規のクラスターをプロビジョニングする
スナップショットがS3に正しく保存されたら、次はcloud.elastic.coのElasticsearch Serviceで新規のクラスターをプロビジョニングします。この手順で、既存のワークロード、AWSのリージョン、使用するElasticsearchのバージョンを適切に反映するユースケースを選択することができます。
Elasticsearch Serviceコンソールで、クラスターのキーストアの設定を入力します。
この手順で、次の2つの設定を入力する必要があります。
s3.client.default.access_key s3.client.default.secret_key
この手順は、Elasticsearch ServiceクラスターにS3バケットのスナップショットを読み取るための権限を付与するために必要です。いずれの値も、IAMユーザーのセキュリティ資格情報と同一です。
Elasticsearch Serviceクラスターのカスタムスナップショットレポジトリを設定する
次に、Elasticsearch Serviceのクラスターに新規のスナップショットレポジトリを作成します。この手順でElasticsearch Serviceに対し、復元対象のスナップショットが保存されているS3の場所を指定することができます。はじめにKibanaにログインし、[Stack Management](スタック管理)>[Snapshot and Restore](スナップショットと復元)の設定に進みます。その後、[Register a repository](レポジトリを登録)を選択します。
スナップショットを保存しているバケット名を追加します。
レポジトリが適切に設定されていることを確認します。
最後に、Elasticsearch Serviceクラスターから復元対象のスナップショットを選択できることを確認します。
スナップショットからElasticsearch Serviceクラスターを復元する
スナップショットを復元するには、Elasticsearch ServiceコンソールでElasticsearch Serviceクラスターの[API console](APIコンソール)を開き、次の3つのコマンドを実行します。3つのコマンドはいずれもAPIコンソールでPOSTとして実行される点に注意してください。
すべてのインデックスを終了する
*/_close?expand_wildcards=all
復元のフェーズ中に不一致を生じさせないため、このコマンドですべてのインデックスを確実に終了します。
スナップショットを復元する
/_snapshot// /_restore
このコマンドで、スナップショットを復元します。
すべてのインデックスを開く
*/_open?expand_wildcards=all
このコマンドで、すべてのインデックスを開きます。
スナップショットの復元を検証する
すべてのインデックスでスナップショットが復元されていることを検証します。Kibanaを開き、[Dev Tools](開発ツール)で次のコマンドを実行します。
GET _cat/indices
この時点で、Elasticsearch Serviceで実行中の新規のクラスターには、スナップショットを取得したセルフマネージドのクラスターと同じデータが入っているはずです。ここまで来たら、次にBeatsやLogstashなどのインジェストソースを新しいElasticsearch Serviceエンドポイント向けに再設定します。Elasticsearch Serviceエンドポイントは、Elastic Cloudコンソールに表示されています。