0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Elasticsearch snapshot利用アップグレード

Last updated at Posted at 2025-08-14

概要

AWS Elasticsearch2.3のサポート終了にしたがい、バージョンアップの方法を調査していました。その内容をまとめたものとなります。

AWS Elasticsearch2.3からバージョンアップするためには、まず5.1にアップグレードする必要があります。

ただし、そのときは2.3のドメインから直接アップグレードできません。
5.1のドメインを作成して、そこにsnapshotをリストアする方法となります。

サポートされているアップグレードパス

この記事では、AWS Elasticsearch2.3から5.1に手動snapshotをリストアしてアップグレードする方法を記載します。

また、手動snapshotを取得する場合や、そのsnapshotを別ドメインにリストアする場合も同様の手順となります。

前提

  • AWS Elasticsearch2.3のドメイン(データあり)が存在
  • Elasticsearch2.3および新規作成のElasticsearch5.1にアクセスするためのEC2(linux)が存在している(そのEC2にはSSM等でアクセス可能)

手順

Elasticsearch5.1のドメイン作成

アップグレード先となるElasticsearch5.1のドメインを先に作成しておきます。

AWSコンソールから「サービス」→「Amazon OpenSearch Service」を選びます。「ダッシュボード」を選んで、「ドメイン作成」からドメインを作成します。

テスト環境だったので、以下設定で作成します。

  • バージョン: 5.1
  • スタンバイは無効
  • 1-az
  • インスタンスタイプは最小
  • アクセスコントロールは設定しない
  • ネットワークはパブリック・アクセス
  • アクセスポリシーはアクセスするEC2インスタンスのIPアドレス(Public)を設定

作成には数十分程度の時間がかかります。お茶でも飲みながら休憩します。

作成後、ドメインのエンドポイントとARNをメモしておきます。

Elastcsearch2.3のバックアップ

S3バケット作成

snapshotを保管するためのレポジトリとしてS3バケットを用意します。

AWSコンソールから「サービス」→「S3」を選びます。「汎用バケット」を選んで、「バケット作成」からバケットを作成します。

パブリックアクセスはブロックの設定としてください。

またACLも無効にしています。

作成後、バケットのARNはメモしておきます。

IAM設定

EC2からElasticsearchのsnapshotを取得し、S3へ書き込むためのIAMを作成します。

Elasticesearch用のサービスロール(es-snapshot-role)の作成

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

上記のロールにこのポリシー(es-e3-policy)を付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "S3のバケットARN"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "S3バケットARN/*"
            ]
        }
    ]
}

作業用EC2のポリシーを作成(Elasticsearchアクセス用)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "S3アクセス用ロール(es-snapshot-role)ARN"
        },
        {
            "Effect": "Allow",
            "Action": "es:ESHttpPut",
            "Resource": "Elasticsearch2.3ドメインのARN/*"
        },
        {
            "Effect": "Allow",
            "Action": "es:ESHttpPut",
            "Resource": "Elasticsearch5.1ドメインのARN/*"
        }
    ]
}

対象EC2の許可ポリシーに作成したポリシーをアタッチします。

python準備

EC2にpythonが入っていない場合、インストールします。

確認したEC2はRHEL8.10となります。

(python v2でも動いたことは確認しました)

sudo rpm install python2 -y

pythonモジュールを導入します。

sudo python2  -m pip install boto3
sudo python2  -m pip install requests
sudo python2  -m pip install requests_aws4auth

sudo python2 -m pip list

リポジトリ登録

作成したS3バケットをsnapshotのリポジトリとして登録します。

リポジトリ登録用のpythonスクリプト(register-repo.py)

register-repo.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

host = 'Elasticsearch2.3ドメインのURL/' # domain "/"を忘れないこと
import boto3
endpoint
region = 'us-east-1' # 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)
import boto3

# Register repository

path = '/_snapshot/snapshotのレポジトリの名称' # the OpenSearch API endpoint
url = host + path

payload = {
  "type": "s3",
  "settings": {
  "bucket": "S3バケット名",
  "base_path": "バケットの取得path",  
  "region": "対象リージョン",
  "role_arn": "S3アクセス用のロールのARN"
  }
}

headers = {"Content-Type": "application/json"}

r = requests.put(url, auth=awsauth, json=payload, headers=headers)

print(r.status_code)
print(r.text)

リポジトリ登録実行

python2 ./register-repo.py

リポジトリ確認用のpythonスクリプト(check-repo.py)

check-repo.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1' # 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)
host = 'Elasticsearch2.3ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

リポジトリ登録の確認

python2 ./check-repo.py

登録バケット名や設定したbase_path等が表示されることを確認する。

snapshot取得

作成したS3バケットのリポジトリにElasticsearchのsnapshotを作成します。

snapshot取得用pythonスクリプト(get-snapshot.py)

get-snapshot.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1' # 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)
host = 'Elasticsearch2.3ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/レポジトリ名/snapshotのエンドポイント名 # the Elasticsearch API endpoint(ex _snapshot/gw8080ss/gw8080ss-1)
url = host + path

r = requests.put(url, auth=awsauth)

print(r.text)

snapshotを取得

python2 ./get-snapshot.py

{"accepted":true}の出力を確認します。

snapshotが取得できているか確認します。

snapshot確認用pythonスクリプト(check-snapshot.py)

check-snapshot.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

import boto3
region = 'us-east-1' # 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)
host = 'Elasticsearch2.3ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

snapshot取得の確認

python2 ./check-snapshot.py

対象snapshot出力のなかに、"state" : "SUCCESS"があることを確認します。

または、AWSコンソールの対象S3バケット内にファイルができていることを確認してください。

Elasticsearch5.1へのリストア

Elasticsearch2.3のsnapshotを5.1の新規作成ドメインにリストアします。

まず2.3のsnapshotを取得したリポジトリを5.1にも登録します。その後、5.1にsnapshotをリストアしていきます。

リポジトリ登録

最初に作成した移行先Elasticsearch5.1のドメインに、2.3のsnapshotを取得したリポジトリを登録します。

リポジトリ登録用のpythonスクリプト(register-repo-es51.py)の作成

Elasticsearch2.3のリポジトリ登録用スクリプト(register-repo.py)のhost部分を変更します。
(このあとのスクリプトは基本host部分を変更すれば利用できます)

register-repo-es51.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

host = 'Elasticsearch5.1ドメインのURL/' # domain "/"を忘れないこと
import boto3
endpoint
region = 'us-east-1' # 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)
import boto3

# Register repository

path = '/_snapshot/snapshotのレポジトリの名称' # the OpenSearch API endpoint
url = host + path

payload = {
  "type": "s3",
  "settings": {
      "bucket": "S3バケット名",
      "base_path": "バケットの取得path",  
      "readonly" : "true",
      "region": "us-east-1",
      "role_arn": "S3アクセス用のロールのARN"
  }
}

headers = {"Content-Type": "application/json"}

r = requests.put(url, auth=awsauth, json=payload, headers=headers)

print(r.status_code)
print(r.text)

リポジトリ登録

python2 ./register-repo-es51.py

リポジトリ登録の確認用pythonスクリプト(check-repo-es51.py)

check-repo-es51.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1' # 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)
host = 'Elasticsearch5.1ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

リポジトリ登録の確認

python2 ./check-repo-es51.py

Elasticsearch2.3ドメインに登録したのと同様の結果が表示されます。

リストア

snapshotの確認スクリプトの作成(check-snapshot-es51.py)

check-snapshot-es51.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

import boto3
region = 'us-east-1' # 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)
host = 'Elasticsearch5.1ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

snapshotが見えていることを確認します。

python2 ./check-snapshot-es51.py

Elasticsearch2.3のsnapshot取得確認と同様のものが見えていることを確認します。

snapshotリストア用のpythonスクリプトの作成(snapshot-restore.py)

snapshot-restore.py
import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1' # 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)
host = 'Elasticsearch5.1ドメインのURL/' # domain "/"を忘れないこと

path = '_snapshot/レポジトリ名/snapshotのエンドポイント名 # the Elasticsearch API endpoint(ex _snapshot/gw8080ss/gw8080ss-1)
url = host + path

r = requests.post(url, auth=awsauth)

print(r.text)

リストアの実行

python2 ./snapshot-restore.py

{"accepted":true}が表示されることを確認します。

実際にリストアされているか、インデックスをみて確認します。

curl –XGET Elasticsearch5.1のエンドポイントURL/_cat/indices?pretty

もしくはAWSのコンソールのAWS Opensearchの対象ドメインのインデックスタブで確認してください。

以上でElasticsearch2.3→5.1へのsnapshotを利用したアップグレード作業は完了です。必要に応じて、リポジトリ登録は削除してください。

追記

AWS Elasticsearch5.1からのアップグレードは、AWSコンソールから作業可能です。ただし、Elasticsearch5.xから6、6からOpensearchへのアップグレードでは大きなmapping変更があるため、そちらの対応が必要になる可能性があります。

Amazon OpenSearch Service ドメインのアップグレード

参考

スナップショットを使用してデータを移行する

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

AWS Opensearch(Elasticsearch) サポート期間

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?