Amazon Elasticsearch Service でのインデックスのスナップショット作成 - Amazon Elasticsearch Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Elasticsearch Service でのインデックスのスナップショット作成

Amazon Elasticsearch Service (Amazon ES) のスナップショットは、クラスターのインデックスと状態のバックアップです。州/地域クラスター設定、ノード情報、インデックス設定、シャードの割り当てなどが含まれます。

Amazon ES スナップショットの形式は次のとおりです。

  • 自動スナップショットクラスターの復元専用です。クラスターのステータスが赤くなった場合や、データが失われた場合に、ドメインを復元するために使用できます。詳細については、「」を参照してください。スナップショットの復元以下の。Amazon ES では、事前設定された Amazon S3 バケットに自動スナップショットが追加料金なしで保存されます。

  • 手動スナップショットはクラスタのリカバリ用ですまたはあるクラスターから別のクラスターにデータを移動するためのものです。手動スナップショットを開始する必要があります。これらのスナップショットは独自の Amazon S3 バケットに保存され、標準の S3 料金が適用されます。セルフマネージド型の Elasticsearch クラスターのスナップショットがある場合、そのスナップショットを使用して Amazon ES ドメインに移行できます。詳細については、「」を参照してください。Amazon Elasticsearch Service への移行

すべての Amazon ES ドメインで自動スナップショットが作成されますが、頻度は次の点で異なります。

  • Elasticsearch 5.3 以降を実行しているドメインの場合、Amazon ES は時間ごとに自動的にスナップショットを作成し、最大 336 個のスナップショットを 14 日間保持します。

  • Elasticsearch 5.1 以前を実行しているドメインの場合、Amazon ES は指定した時刻に毎日自動スナップショットを作成し、最大 14 個のスナップショットを保持し、30 日間以上スナップショットデータを保持しません。

クラスターのステータスが赤に変わると、クラスターの状態は維持されますが、すべての自動スナップショットは失敗します。2 週間以内にこの問題を解決しない場合、クラスター内のデータは永遠に失われます。トラブルシューティングステップについては、「赤のクラスター状態」を参照してください。

Prerequisites

スナップショットを手動で作成するには、IAM および Amazon S3 を使用して作業する必要があります。スナップショットの撮影を試す前に、次の前提条件を満たしていることを確認します。

前提条件 説明
S3 バケット

Amazon ES ドメイン用に手動スナップショットを保存するための S3 バケットを作成します。手順については、以下を参照してください。バケットの作成()Amazon Simple Storage Service 入門ガイド

以下の場所で使用するバケットの名前を覚えておいてください。

  • -ResourceIAM ロールにアタッチされた IAM ポリシーのステートメント

  • スナップショットリポジトリの登録に使用する Python クライアント (この方法を使用する場合)

重要

S3 Glacier ライフサイクルルールをこのバケットに適用しないでください。手動スナップショットでは、S3 Glacier ストレージクラスはサポートされません。

IAM ロール

Amazon ES にアクセス許可を委任する IAM ロールを作成します。手順については、以下を参照してください。IAM ロールの作成 (コンソール)()IAM ユーザーガイド。この章の残りの部分では、このロールを TheSnapshotRole と呼びます。

IAM ポリシーをアタッチする

次のポリシーをにアタッチします。TheSnapshotRoleS3 バケットへのアクセスを許可するには、次のようにします。

{ "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::s3-bucket-name" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::s3-bucket-name/*" ] } ] }

ロールにポリシーをアタッチする手順については、IAM ID アクセス許可の追加()IAM ユーザーガイド

信頼関係を編集する

の信頼関係を編集するTheSnapshotRoleをクリックして、Amazon ES をPrincipalステートメントを、次の例で示します。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" }] }

信頼関係を編集する手順については、ロールの信頼ポリシーの変更()IAM ユーザーガイド

アクセス許可

スナップショットリポジトリを登録するには、TheSnapshotRoleAmazon ES にアップロードします。さらに、es:ESHttpPut アクションへのアクセスも必要です。これらの両方のアクセス権限を付与するには、リクエストの署名に使用するロールに次のポリシーを追加します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

ロールにiam:PassRole渡すアクセス許可TheSnapshotRole次のステップでリポジトリを登録しようとすると、以下の一般的なエラーが発生することがあります。

$ python register-repo.py {"Message":"User: arn:aws:iam::123456789012:user/MyUserAccount is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/TheSnapshotRole"}

手動スナップショットリポジトリの登録

手動インデックススナップショットを撮る前に、Amazon ES を使用してスナップショットレポジトリを登録する必要があります。この 1 回限りのオペレーションでは、「TheSnapshotRole」で説明されているように、Prerequisites へのアクセスが許可された認証情報を使用して AWS リクエストを署名する必要があります。

ステップ 1: manage_snapshots ロールのマッピング (きめ細かなアクセスコントロールを使用している場合)

きめ細かなアクセスコントロールにより、リポジトリの登録時に追加の手順が導入されます。HTTP 基本認証を他のすべての目的で使用する場合でも、manage_snapshotsロールを IAM ロールに追加し、iam:PassRole渡すアクセス許可TheSnapshotRole

  1. Amazon ES ドメインの Kibana プラグインに移動します。Amazon ES コンソールのドメインダッシュボードで Kibana エンドポイントを見つけます。

  2. メインメニューから [] を選択します。セキュリティし、ロール

  3. 「」を検索して選択します。manage_snapshotsロール。

  4. [] に移動します。マッピングされたユーザータブをクリックし、マッピングの管理

  5. []バックエンドの役割を渡す権限を持つロールのドメイン ARN を追加します。TheSnapshotRole。ARN の形式は次のとおりです。

    arn:aws:iam::123456789123:role/role-name
  6. Selectマップをクリックし、ロールがマッピングされたユーザー

ステップ 2: リポジトリの登録

スナップショットリポジトリを登録するには、Amazon ES ドメインエンドポイントに PUT リクエストを送信します。あなたは使用することはできません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" } }

ドメインが仮想プライベートクラウド (VPC) に存在する場合は、リクエストが正常にスナップショットレポジトリに登録するようにお使いのコンピューターが VPC に接続されていることが必要です。VPC へのアクセスはネットワーク構成によって異なりますが、VPN あるいは社内ネットワークへの接続を含む場合がよくあります。Amazon ES ドメインにアクセスできることを確認するには、https://your-vpc-domain.region.es.amazonaws.comウェブブラウザで、デフォルトの JSON 応答を受信していることを確認します。

スナップショットのリポジトリの暗号化

現時点では、Key Management Service (KMS) マスターキーを使用して手動スナップショットを暗号化することはできませんが、サーバー側の暗号化 (SSE) を使用して保護することはできます。

スナップショットリポジトリとして使用しているバケットに対して S3 で管理されたキーによる SSE を有効にするには、"server_side_encryption": true"settings"PUTリクエストのブロックを返します。詳細については、「」を参照してください。Amazon S3 で管理された暗号化キーによるサーバー側の暗号化()Amazon Simple Storage Service ユーザーガイド

または、スナップショットリポジトリとして使用する S3 バケットで、サーバー側の暗号化にカスタマーマスターキー (CMK) を使用することもできます。

別のドメインへのデータの移行

スナップショットリポジトリの登録は、1 回限りの操作です。ただし、1 つのドメインから別のドメインに移行するには、古いドメインと新しいドメインで同じスナップショットレポジトリを登録する必要があります。リポジトリ名は任意です。

新しいドメインに移行する場合や、別の理由で同じリポジトリを複数のドメインに登録する場合は、次のガイドラインを考慮してください。

  • 新しいドメインにリポジトリを登録するときは、"readonly": true"settings"PUTリクエストのブロックを返します。この設定により、古いドメインのデータが誤って上書きされるのを防ぐことができます。

  • 別のリージョンのドメインにデータを移行する場合(たとえば、us-east-2 にある古いドメインとバケットから us-west-2 の新しいドメインへ)、PUT リクエストを送信するときに次の 500 エラーが表示される場合があります。

    The bucket is in this region: us-east-2. Please use this region to retry the request.

    このエラーが発生した場合は、"region": "us-east-2""endpoint": "s3.amazonaws.com"PUTステートメントで、リクエストを再試行します。

サンプル Python クライアントの使用

Pythonクライアントは、単純なHTTPリクエストよりも自動化が容易で、再利用性が向上します。この方法を使用してスナップショットレポジトリを登録するようにお使いの場合は、次のサンプルの Python コードを、register-repo.py。クライアントには、AWS SDK for Python (Boto3),リクエストおよびリクエスト-aws4authパッケージ化する。クライアントには、他のスナップショットオペレーションのコメントアウトされた例が含まれています。

ヒント

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 ユーザーもいます。

スナップショットを作成する

スナップショットを作成する際、次の情報を指定します。

  • スナップショットリポジトリの名前

  • スナップショットの名前

この章の例では、わかりやすく簡潔にするために、一般的な HTTP クライアントである curl を使用します。ただし、アクセスポリシーが IAM ユーザーまたはロールを指定する場合、スナップショットリクエストに署名する必要があります。サンプル Python クライアントのコメントアウトされた例を使用して、curl コマンドが使用するのと同じエンドポイントに対し、署名された HTTP リクエストを行う必要があります。

手動スナップショットを作成するには、次の手順を実行します。

  1. 現在進行中のスナップショットは取得できません。確認するには、以下のコマンドを実行します。

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot/_status'
  2. 次のコマンドを実行して、手動シェイプショットを作成します。

    curl -XPUT 'elasticsearch-domain-endpoint/_snapshot/repository-name/snapshot-name'
注記

Amazon ES ドメインのサイズが大きくなると、スナップショットの撮影に必要な時間は長くなります。長時間実行しているスナップショット操作の場合は、エラーが発生することがあります。504 GATEWAY_TIMEOUT。 通常、このエラーは無視して、操作が正常に完了するのを待ってかまいません。次のコマンドを実行して、ドメインのすべてのスナップショットの状態を確認します。

curl -XGET 'elasticsearch-domain-endpoint/_snapshot/repository-name/_all?pretty'

スナップショットの復元

警告

インデックスエイリアスを使用する場合は、インデックスを削除する前に、エイリアスへの書き込みリクエストを中止するか、別のインデックスにエイリアスを切り替えます。書き込みリクエストを中止すると、次のシナリオの回避に有効です。

  1. インデックスを削除すると、そのエイリアスも削除される。

  2. 削除したばかりのエイリアスに対する障害のある書き込みリクエストにより、エイリアスと同じ名前で新しいインデックスが作成される。

  3. 新しいインデックスとの命名の競合により、エイリアスを使用できなくなる。

エイリアスを別のインデックスに切り替えた場合は、スナップショットから復元するときに "include_aliases": false を指定します。

スナップショットを復元するには、次の手順を実行します。

  1. 復元するスナップショットを特定します。すべてのスナップショットレポジトリを表示するには、次のコマンドを実行します。

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot?pretty'

    リポジトリを識別した後、次のコマンドを実行してすべてのスナップショットを表示します。

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot/repository-name/_all?pretty'
    注記

    ほとんどの自動スナップショットは、cs-automated リポジトリに保存されます。ドメインで暗号化された保管時のデータはcs-automated-encrepository. 検索する手動スナップショットレポジトリが表示されない場合は、登録内容をドメインに追加します。

  2. (任意) クラスター上のインデックスとスナップショット内のインデックスの間に名前の競合がある場合は、Amazon ES ドメイン内の 1 つ以上のインデックスを削除するか、名前を変更します。インデックスのスナップショットを復元する際に、復元先の Elasticsearch クラスターに同じ名前のインデックスが既にある場合は、復元できません。

    インデックスの名前の競合がある場合は、次のオプションがあります。

    次のコマンドは、ドメイン内の既存のインデックスをすべて削除します。

    curl -XDELETE 'elasticsearch-domain-endpoint/_all'

    ただし、すべてのインデックスを復元する予定がない場合には、1 つのインデックスを削除するだけです。

    curl -XDELETE 'elasticsearch-domain-endpoint/index-name'
  3. スナップショットを復元するには、次のコマンドを実行します。

    curl -XPOST 'elasticsearch-domain-endpoint/_snapshot/repository-name/snapshot-name/_restore'

    Kibana ときめ細かなアクセス制御インデックスに対する特別なアクセス許可により、特に自動スナップショットから復元しようとする場合は、すべてのインデックスを復元しようとすると失敗することがあります。次の例では、 1 つのインデックスである my-index2020-snapshot から cs-automated スナップショットレポジトリで復元します。

    curl -XPOST 'elasticsearch-domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'

    または、すべてのインデックスを復元することもできます例外Kibana ときめ細かなアクセス制御インデックス:

    curl -XPOST 'elasticsearch-domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "-.kibana*,-.opendistro_security"}' -H 'Content-Type: application/json'
注記

関連するインデックスに対してすべてのプライマリシャードを使用できなかった場合、スナップショットの statePARTIAL になっている可能性があります。この値は、1 つ以上のシャードからのデータが正常に保存されていないことを示します。部分スナップショットからの復元も可能ですが、不足しているインデックスの復元に古いスナップショットの使用が必要になる場合もあります。

手動スナップショットの削除

手動スナップショットを削除するには、次のコマンドを実行します。

DELETE _snapshot/repository-name/snapshot-name

インデックスステート管理によるスナップショットの自動化

インデックス状態管理 (ISM)snapshot操作を使用して、経過時間、サイズ、ドキュメント数の変化に基づいてインデックスのスナップショットを自動的にトリガーできます。使用した ISM ポリシーの例については、snapshot操作の詳細については、サンプルポリシー

スナップショットのキュレーターの使用

インデックスやスナップショットの管理には Curator などのツールが便利です。pip を使用して Curator をインストールします。

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 でのデータの更新」を参照してください。