Amazon Elasticsearch Service でバージョン 2.3 から 5.1 へ移行する

Elasticsearch Service

こんにちは、藤本です。

先日 Amazon Elasticsearch Service に Elasticsearch 5.1 が追加される嬉しいリリースがありました。私も早速試してみて、ブログをエントリしました。

既存ユーザーが気になるのはアップグレードの方法だと思いますので調べてみました。と言っても、以下のドキュメントを読み砕いて試しただけです。

概要

まず、Amazon Elasticsearch Service はアップグレード機能を提供していません。Amazon Elasticsearch Service の設定変更からバージョンを選び直せるわけではありません。バージョン 5.1 の新規 Elasticsearch クラスタを起動し、スナップショットからデータを移行することとなります。

基本的には 1.5 → 2.3 と同様です。下記ブログと変わりません。

いくつか注意点があります。

  • 1.5 → 5.1 はスナップショットに互換性がない
    • 1.5 をご利用の場合、一度、2.3 へ移行した上で、5.1 へ移行する必要があります。
  • マイグレーションプラグインは提供されない
    • 1.5 → 2.3 はマイグレーションによる問題点をチェックしてくれるプラグインが提供されましたが、2.3 → 5.1 は提供されません。
    • 1.5 → 2.3 に比べれば 2.3 → 5.1 のバージョン移行による影響(互換性がないインデックス設定や、)は少ない。ですが、非推奨になっている API などもありますので、ドキュメントはご確認ください。

移行してみる

移行は以下の流れで実施します。

  1. バージョン2.3のドメインからSnapshot取得
  2. バージョン5.1のドメイン作成
  3. バージョン5.1のドメインにデータリストア
  4. アプリケーションテスト
  5. (オプション)バージョン2.3のドメイン削除

1. バージョン2.3のドメインからSnapshot取得

Working with Manual Index Snapshots (AWS CLI) の手順に従って、S3へSnapshotを取得します。Amazon ESは毎日自動でSnapshotを取得していますが、自動Snapshotに関してはユーザーが利用できないため、手動でS3へSnapshotを取得する必要があります。

IAM Role作成

AmazonESがS3へアクセスできるようにIAM Roleを作成します。

Trusted Relationship
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Permissions (Inline Policy)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<BUCKET_NAME>"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<BUCKET_NAME>/*"
            ]
        }
    ]
}

Snapshotリポジトリ作成

AWSリクエスト署名なしのSnapshotリポジトリ作成APIはサポートされていません。以前のエントリの方法やドキュメントに記載のスクリプトで署名つきAPIを発行します。

# python

>>> from botocore.awsrequest import AWSRequest
>>> from botocore.auth import SigV4Auth
>>> from botocore.endpoint import BotocoreHTTPSession
>>> from botocore.credentials import Credentials

>>> url='http://search-es2-xxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/_snapshot/migration'
>>> data='{"type": "s3","settings": {"bucket": "es-snapshot-xxxxxxxxx","region": "ap-northeast-1","role_arn": "arn:aws:iam::xxxxxxxxxx:role/essnapshot"}}'

>>> credentials = Credentials("<AWS_ACCESS_KEY_ID>", "<AWS_SECRET_ACCESS_KEY>", "<AWS_SESSION_TOKEN>")
>>> request = AWSRequest(method='POST', url=url, data=data)
>>> SigV4Auth(credentials, 'es', "<REGION>").add_auth(request)
>>> BotocoreHTTPSession().send(request.prepare())
<Response [200]>

Snapshot取得

Snapshotを取得します。

# curl -XPUT "http://search-es2-xxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/_snapshot/migration/20170202"
{"accepted": true}

Snapshotリポジトリに登録したS3バケット内にSnapshotファイル群が生成されています。

# aws s3 ls s3://es-snapshot-xxxxxxxxx
                           PRE indices/
2017-02-02 21:07:41         37 index
2017-02-02 21:07:40        108 meta-20170202.dat
2017-02-02 21:07:41        189 snap-20170202.dat

2. バージョン 5.1 のドメイン作成

移行先となるバージョン 5.1 のAmazon ESドメインを作成します。ドメイン作成手順はAmazon Elasticsearch Service で Elasticsearch 5.1 の利用が可能となりましたをご参照ください。

3. バージョン 5.1 のドメインにデータリストア

Snapshot取得時同様、バージョン 5.1 のドメインにSnapshotリポジトリを登録します。手順は上と同じです。

次にSnapshotからリストアします。

# curl -XPOST "http://search-es5-xxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/_snapshot/migration/20170202/_restore"
{"accepted": true}

今回はbankというドキュメント数1000件のインデックスを移行しました。

# curl -XGET "http://search-es5-*************.ap-northeast-1.es.amazonaws.com/_cat/indices"
yellow open .kibana 2aKlXVeQT9iLr3prkciNVw 1 1    1 0   3.1kb   3.1kb
yellow open bank    6VPMv2k2QmGgwpyafE2e-g 1 1 1000 0 388.4kb 388.4kb

正常にデータが移行されました。

4. アプリケーションテスト

一通りアプリケーションテスト行ってください。

こちらで悩むのが Elasticsearch on EC2 は Deprecation Logging を実装しており、非推奨となっている設定やAPIを送るとログに記録してくれます。

例えばfiltered Query
# curl -XGET "http://localhost:9200/bank/_search" -d'
{
  "query": {
    "filtered": {
      "query": {
        "match": { "age": 30 }
      }
    }
  }
}'
:
# tail /var/log/elasticsearch/elasticsearch_deprecation.log
[2016-08-15 06:50:51,941][DEBUG][deprecation.index.query  ] The [filtered] query is deprecated, please use a [bool] query instead with a [must] clause for the query part and a [filter] clause for the filter part.

Amazon ESのドメインはAWSマネージドサービスのため、ログを確認することができません。そういった意味でもアプリケーションテストは念入りに行うべきでしょう。

まとめ

いかがでしたでしょうか?

Amazon ES の 5.1 へはアップグレードではなく、データ移行という形で移行することができます。それでも手順はスナップショット⇛リストアだけです。

またデータ移行しても、元のElasticsearchドメインは残るので切り戻しも容易に行うことができます。従量課金ということで検証コストが安価なのも嬉しいところです。

2.3 をご利用中の方も、1.5 をご利用中の方も、まずは検証環境などで 5.1 への移行を試してみてはいかがでしょうか?