概要
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)
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)
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)
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)
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部分を変更すれば利用できます)
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)
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)
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)
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 ドメインのアップグレード