「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
Amazon Elasticsearch Service インデックススナップショットの使用
スナップショットはクラスターの指数と状態のバックアップです。状態には、クラスター設定、ノード情報、インデックス設定、シャードの割り当てなどが含まれます。
Amazon Elasticsearch Service のスナップショットには、自動化と手動の 2 つの形式があります。
-
自動スナップショットは、クラスターの復元専用です。これらを使用して、赤のクラスター状態、またはその他のデータ損失が発生した場合にドメインを復元できます。Amazon ES は、追加料金なしで自動スナップショットを事前に設定された Amazon S3 バケットに保存します。
-
手動スナップショットは、クラスターの復元、またはクラスター間でのデータの移行に使用します。名前が示すように、手動スナップショットを開始する必要があります。これらのスナップショットは独自の Amazon S3 バケットに保存され、標準の S3 料金が適用されます。セルフマネージド型の Elasticsearch クラスターのスナップショットがある場合、そのスナップショットを使用して Amazon ES ドメインに移行することもできます。
すべての Amazon ES ドメインで自動スナップショットが作成されますが、頻度は異なります。
-
Elasticsearch 5.3 以降を実行しているドメインの場合、Amazon ES は 1 時間ごとに自動的にスナップショットを作成し、最大 336 個のスナップショットを 14 日間保持します。
-
Elasticsearch 5.1 以前を実行しているドメインでは、Amazon ES は 1 日ごとに自動でスナップショットを作成し (指定する時刻に)、14 個のスナップショットを 30 日間保持します。
クラスターのステータスが赤に変わると、 Amazon ES は自動スナップショットの作成を停止します。2 週間以内にこの問題を解決しない場合、クラスターのデータは永遠に失われます。トラブルシューティングステップについては、「赤のクラスター状態」を参照してください。
手動スナップショット前提条件
スナップショットを手動で作成するには、IAM および Amazon S3 を使用して作業する必要があります。スナップショットの撮影を試す前に、次の前提条件を満たしていることを確認します。
前提条件 | 説明 |
---|---|
S3 バケット |
Amazon ES ドメインの手動スナップショットを保存します。バケットの名前を書き留めておきます。これは 2 つの場所で必要になります。
詳細については、http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html の「Amazon Simple Storage Service 入門ガイドバケットの作成」を参照してください。 ライフサイクルルールをこのバケットに適用しないS3 Glacierでください。手動スナップショットは、S3 Glacier ストレージクラスをサポートしていません。 |
IAM ロール |
Amazon Elasticsearch Service に権限を委任します。この章の残りの部分では、このロールを 次の例にあるように、ロールの信頼関係は
ロールには、次のポリシーがアタッチされている必要があります。
詳細については、https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console の「IAM ID アクセス許可の追加IAM ユーザーガイド」を参照してください。 |
アクセス許可 |
スナップショットリポジトリを登録するには、
|
手動スナップショットレポジトリの登録
手動インデックススナップショットを撮る前に、Amazon Elasticsearch Service を使用してスナップショットレポジトリを登録する必要があります。この
1 回限りのオペレーションでは、「TheSnapshotRole
」で説明されているように、手動スナップショット前提条件 へのアクセスが許可された認証情報を使用して AWS リクエストを署名する必要があります。
curl
は AWS リクエスト署名をサポートしていないため、これを使用してこのオペレーションを実行することはできません。代わりに、サンプル Python クライアント、Postman
PUT
elasticsearch-domain-endpoint
/_snapshot/my-snapshot-repo-name
{ "type": "s3", "settings": { "bucket": "s3-bucket-name
", "region": "region
", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole
" } }
スナップショットのディレクトを登録する操作は 1 回限りですが、1 つのドメインから別のドメインに移行するには、古いドメインと新しいドメインで同じスナップショットレポジトリを登録する必要があります。リポジトリ名は任意です。
-
新しいドメインに移行する場合 (または、複数のドメインで同じリポジトリを登録する場合は、新しいドメインでリポジトリを登録するときに
"readonly": true
を"settings"
に追加します。この設定により、古いドメインのデータを誤って上書きすることを回避できます。 -
スナップショットリポジトリの S3 で管理されたキーによるサーバー側の暗号化を有効にするには、
"server_side_encryption": true
を"settings"
に追加します。
ドメインが VPC に存在する場合は、リクエストが正常にスナップショットレポジトリに登録するようにお使いのコンピューターが VPC に接続されていることが必要です。VPC
へのアクセスはネットワーク構成によって異なりますが、VPN あるいは社内ネットワークへの接続を含む場合がよくあります。Amazon ES ドメインにアクセスできるかを確認するには、ウェブブラウザで
https://
を開き、デフォルトの JSON 応答を受信していることを確認します。
your-vpc-domain
.region
.es.amazonaws.com
きめ細かなアクセスコントロールを使用する場合は、追加の手順について「手動スナップショット」を参照してください。
Python クライアントのサンプリング
次のサンプルの Python コードを、register-repo.py
などの Python ファイルとして保存します。 クライアントでは、AWS SDK for Python (Boto3)、
Java ベースのコードサンプルは、「HTTP リクエストの署名」で入手できます。
次の変数を更新する必要があります。host
、region
、path
、および payload
。
import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # include https:// and trailing / region = '' # e.g. us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Register repository path = '_snapshot/
my-snapshot-repo-name
' # the Elasticsearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "s3-bucket-name
", "region": "us-west-1
", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole
" } } headers = {"Content-Type": "application/json"} r = requests.put(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text) # # Take snapshot # # path = '_snapshot/my-snapshot-repo/my-snapshot' # url = host + path # # r = requests.put(url, auth=awsauth) # # print(r.text) # # # Delete index # # path = 'my-index' # url = host + path # # r = requests.delete(url, auth=awsauth) # # print(r.text) # # # Restore snapshot (all indices except Kibana and fine-grained access control) # # path = '_snapshot/my-snapshot-repo/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security", # "include_global_state": False # } # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text) # # # Restore snapshot (one index) # # path = '_snapshot/my-snapshot-repo/my-snapshot/_restore' # url = host + path # # payload = {"indices": "my-index"} # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text)
手動スナップショットの作成
スナップショットは瞬時に取得されません。完了するまでには時間がかかり、クラスターの完全なポイントインタイムビューを表すわけではありません。スナップショットが進行中の間も、ドキュメントのインデックス作成や、クラスターへの他のリクエストを行うことはできますが、新しいドキュメント (および既存のドキュメントの更新) は一般的にスナップショットに含まれません。スナップショットには、Elasticsearch によってスナップショットが開始された際に存在したプライマリシャードが含まれます。スナップショットのスレッドプールのサイズによっては、わずかな時間の違いで、スナップショットにさまざまなシャードが含まれることがあります。
Elasticsearch スナップショットは増分です。つまり、最後にスナップショットが取得されてから変更されたデータのみ保存されます。増分のみ保存されるため、スナップショットの取得頻度が高い場合でも低い場合でも、ディスク使用量を最小限に抑えることができます。つまり、スナップショットを 1 時間ごとに 1 週間 (合計 168 個) 取得すると、週末に 1 つのスナップショットを取得する場合よりも、使用するディスク容量は少なくなる場合があります。また、スナップショットの取得頻度が高くなるほど、完了までにかかる時間は短くなります。中には、30 分ごとにスナップショットを取得している Elasticsearch ユーザーもいます。
スナップショットを作成する際、2 つの情報を指定します。
-
スナップショットリポジトリの名前
-
スナップショットの名前
この章の例では、わかりやすく簡潔にするために、一般的な HTTP クライアントである curl
スナップショットを手動で撮影するには
-
現在進行中のスナップショットは取得できません。確認するには、以下のコマンドを実行します。
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/_status' -
次のコマンドを実行して、手動でスナップショットを撮ります。
curl -XPUT '
elasticsearch-domain-endpoint
/_snapshot/repository
/snapshot-name
'
Amazon ES ドメインの容量が大きくなると、スナップショットの撮影に必要な時間は長くなります。長時間実行しているスナップショット操作では、次のエラーが発生する場合があります。504
GATEWAY_TIMEOUT
。 通常、これらのエラーは無視して、オペレーションが正常に完了するのを待つことができます。次のコマンドを使用して、ドメインのすべてのスナップショットの状態を確認します。
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/repository
/_all?pretty'
スナップショットの復元
インデックスのエイリアスを使用する場合は、インデックスを削除する前に、エイリアスへの書き込みリクエストを中止します (または別のインデックスにエイリアスを切り替えます)。書き込みリクエストを中止すると、次のシナリオの回避に有効です。
-
インデックスを削除すると、そのエイリアスも削除される。
-
削除したばかりのエイリアスに対する障害のある書き込みリクエストにより、エイリアスと同じ名前で新しいインデックスが作成される。
-
新しいインデックスとの命名の競合により、エイリアスを使用できなくなる。
エイリアスを別のインデックスに切り替えた場合は、スナップショットから復元するときに "include_aliases": false
を指定します。
スナップショットを復元するには
-
復元するスナップショットを特定します。すべてのスナップショットレポジトリを表示するには、次のコマンドを実行します。
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot?pretty'リポジトリを識別した後、次のコマンドを実行してすべてのスナップショットを表示します。
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/repository
/_all?pretty'注記 ほとんどの自動スナップショットは、
cs-automated
リポジトリに保存されます。ドメインで暗号化された保管時のデータはcs-automated-enc
リポジトリに保存されます。検索する手動スナップショットレポジトリが表示されない場合は、ドメインにその登録をしたことを確認します。 -
(任意) Amazon ES ドメイン内の 1 つ以上のインデックスを削除するか、名前を変更します。クラスター上のインデックスとスナップショット内のインデックスの間に名前の競合がない場合は、このステップを実行する必要はありません。インデックスのスナップショットを復元する際に、復元先の Elasticsearch クラスターに同じ名前のインデックスが既にある場合は、復元できません。
-
同じ Amazon ES ドメインにあるインデックスを削除して、スナップショットを復元する。
-
スナップショットから復元する際、インデックスの名前を変更し、その後インデックスを再生成します。
-
別の Amazon ES ドメインにスナップショットを復元します (手動スナップショットでのみ可能)。
次の例では、ドメインの既存のインデックスをすべて削除する方法について説明しています。
curl -XDELETE '
elasticsearch-domain-endpoint
/_all'すべてのインデックスを復元する予定がない場合には、1 つのみを削除することもできます。
curl -XDELETE '
elasticsearch-domain-endpoint
/index-name
' -
-
スナップショットを復元するには、次のコマンドを実行します。
curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/repository
/snapshot
/_restore'Kibana ときめ細かなアクセス制御インデックスに対する特別なアクセス許可により、特に自動スナップショットから復元しようとする場合は、すべてのインデックスを復元しようとすると失敗することがあります。次の例では、 1 つのインデックスである
my-index
を2017-snapshot
からcs-automated
スナップショットレポジトリで復元します。curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/cs-automated/2017-snapshot/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'または、Kibana ときめ細かなアクセス制御インデックスを除くすべてのインデックスを復元することもできます。
curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/cs-automated/2017-snapshot/_restore' -d '{"indices": "-.kibana*,-.opendistro_security"}' -H 'Content-Type: application/json'
関連するインデックスに対してすべてのプライマリシャードを使用できなかった場合、スナップショットの state
が PARTIAL
になっている可能性があります。 この値は、少なくとも 1 つのシャードからのデータが正しく保存されていないことを示します。部分スナップショットからの復元も可能ですが、不足しているインデックスの復元に古いスナップショットの使用が必要になる場合もあります。
手動スナップショットの削除
手動スナップショットを削除するには、以下のリクエストを送信します。
DELETE _snapshot/
repository
/snapshot
スナップショットのキュレーターの使用
インデックスやスナップショットの管理には Curator などのツールが便利です。pip
pip install elasticsearch-curator
Curator では、複雑なクラスターでの管理を簡素化するのに役立つ、高度なフィルター機能が提供されます。Amazon ES は Elasticsearch バージョン
5.1 以降で実行されているドメインでの Curator をサポートしています。Curator はコマンドラインインターフェース (CLI) または Python
API として使用できます。CLI を使用する場合は、コマンドラインで認証情報をエクスポートして curator.yml
を次のように設定します。
client: hosts: search-
my-domain
.us-west-1
.es.amazonaws.com port: 443 use_ssl: True aws_region:us-west-1
aws_sign_request: True ssl_no_validate: False timeout: 60 logging: loglevel: INFO
Python API を使用する Lambda 関数の例については、「Curator を使用した Amazon Elasticsearch Service でのデータの更新」を参照してください。