概要

今回は、ElasticCloudからAmazon Elasticsearch Searvice(Amazon ES)への移行を検証するために手動によるスナップショットの取得手順を確認したのでその記録。
ElasticCloudはElastic社が提供するElasticsearchのマネージドサービス。
サーバーへインストールするタイプと同じで、RESTfulAPIによる手動スナップショットがサポートされている。
なお、30分おきに自動でもスナップショットが取得されており、リストアができる。

ポイント

ElaticCloudのバックエンドはAWSで、スナップショットの取得先として、Amazon S3を使用している。
そのため、ElasticCloudで利用しているリージョンと同じリージョンのS3を自分たちで管理しているアカウント上に作成し、下記権限を与えてあげることでリポジトリ登録ができる。

Snapshot and Restore with Custom Repository

本作業はElaticCloudのES環境で実施したが、Elasic社のドキュメントを見る限りは自分でインストールして管理しているESでも(細かい点は不明だが)基本的には同様のことがおこなえると思われる。

手順

バケットを作成したら、下記IAMポリシーを作成する。

{
  "Statement": [
    {
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分で作成したバケット名",
        "arn:aws:s3:::自分で作成したバケット名/*"
      ]
    }
  ]
}

新規でIAMユーザーを作成して、上記IAMポリシーをアタッチする。
※新規でというのは、作成したIAMユーザーのアクセスキーとシークレットアクセスキーをElasticCloudへ設定する必要があるため。

手動のスナップショット取得

Elasticsearchのスナップショット取得は、スナップショット取得の前にリポジトリ登録が必要である。
このリポジトリというものがなんなのか最初わからなかったが、スナップショットを取得するのに必要なもののようだ。

リポジトリ登録前

上述の通り、ElasticCloudは自動的にスナップショットが取得されている。
そのため、下記を実行するとfound-snapshotsというリポジトリが既に登録されているのがわかる。

curl -XGET "https://エンドポイント/_snapshot/_all?pretty"
{
  "found-snapshots" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "バケットを示す文字列",
      "server_side_encryption" : "true",
      "base_path" : "snapshots/文字列",
      "region" : "リージョン名",
      "compress" : "true"
    }
  },

?pretty は必須ではないが、json形式の結果を整形してくれる。jqコマンドの方が慣れているばそれでも良いと思う。

リポジトリの登録

続いて手動スナップショット用にリポジトリを登録する。
最初に作成したS3バケット名、バケットのリージョン、IAMユーザーのアクセスキーとシークレットアクセキーを用いて、下記でリポジトリ登録を行う。
my-snapshotsの箇所は任意。

curl -XPUT 'https://エンドポイント/_snapshot/my-snapshots' -d '{
  "type": "s3",
  "settings": {
    "bucket": "バケット名",
    "region": "リージョン名",
    "access_key": "アクセスキー",
    "secret_key": "シークレットキー",
    "compress": true
  }
}'

リポジトリの確認

リポジトリ登録がおこなえると、found-snapshotsと並んで任意で指定したリポジトリが確認できる。

curl -XGET "https://エンドポイント/_snapshot/_all?pretty" 
{
  "found-snapshots" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "バケット名",
      "server_side_encryption" : "true",
      "base_path" : "snapshots/文字列",
      "region" : "リージョン名",
      "compress" : "true"
    }
  },
  "my-snapshots" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "バケット名",
      "secret_key" : "シークレットキー",
      "region" : "ap-southeast-1",
      "compress" : "true",
      "access_key" : "アクセスキー"
    }
  }
}

スナップショットの取得前

リポジトリの登録が行えたらスナップショットを取得する。
下記でスナップショットが無いことを確認する。

curl -XGET "https://エンドポイント/_snapshot/my-snapshots/_all?pretty"
{
  "snapshots" : [ ]
}

スナップショットの取得

PUTメソッドでスナップショットを取得する。?wait_for_completion=true を指定することで、スナップ取得完了まで待つ。頭にtimeコマンドなどをいれてあげてスナップショットの取得時間を確認しておくと良さそう。
indiciesを指定することで、特定のインデックスのみのスナップショットを取得することも可能。

curl -XPUT 'https://エンドポイント/_snapshot/my-snapshots/snapshot-201805101630?wait_for_completion=true'

実行後に特にエラーがでなければ上記、スナップショット取得前の確認コマンドで確認出来る。

スナップショットのリストア

_restoreを付与してPUTを実行することで、取得したスナップショットのリストアが出来る。
なお、indiciesでインデックスを指定することで、特定のインデックスのみをリストア可能。

curl -XPOST 'https://エンドポイント/_snapshot/my-snapshots/snapshot-201805181600/_restore' -d '{
  "indices": "*",
  "ignore_unavailable": "true",
  "include_global_state": false
}'

確認

下記でリストアが行えたかが確認できる。

curl -XGET https://エンドポイント/_all?pretty

インデックスの削除

取得したスナップショットのうち、動作確認のために1つだけインデックスをリストアして、その後に全部のインデックスのリストアを試みた所下記のようなエラーが出て終了してしまった。

curl -XPOST 'https://エンドポイント/_snapshot/my-snapshos/snapshot-201805181600/_restore' -d '{
    "indices": "*",
    "ignore_unavailable": "true",
    "include_global_state": false
}'
{"error":{"root_cause":[{"type":"snapshot_restore_exception","reason":"[my-snapshots:snapshot-201805181600] cannot restore index [test-log-2016.11.13] because it's open"}],"type":"snapshot_restore_exception","reason":"[my-snapshots:snapshot-201805181600] cannot restore index [test-log-2016.11.13] because it's open"},"status":500}

どうやらリストアしたデータが衝突しているように見えるので、今回は下記のように削除を実行したら解決した。
※実行環境はテスト環境だったので、DELETE実行時の実施先は注意。

curl -XDELETE https://エンドポイント/_all

以上がS3のカスタムリポジトリへスナップショットを取得して、リストアするまでの手順。
ただし、AmazonESの環境へリストアするには、上記に加えて別途いくつか対応が必要。
それについては長くなるのでまた別途。

今回はElasticsearchのバックアップである、スナップショットの取得とリストアの基本的な手順を書いた。