Amazon OpenSearch serviceのスナップショットの取得方法およびリストア手順のメモ

AWS

本記事では、OpenSearchのドメインでスナップショットを取得し、取得したスナップショットを別ドメインでリストアする手順を説明します。

以降のコマンドは、OpenSearchのドメインエンドポイント (VPC)に接続できるEC2などから実行する想定です。

エンドポイントの設定

export ENDPOINT={OpenSearchのドメインエンドポイント(VPC)}

スナップショットの取得先の確認

下記コマンドを実行し、スナップショット保存先のS3バケットが未指定の場合は「スナップショット取得先のs3バケットが未指定の場合」を実行する

curl -s -X GET "${ENDPOINT}/_snapshot" | jq .

スナップショット取得先のS3バケットが未指定の場合

# 下記を{ドメインエンドポイント (VPC)}に接続できるEC2などから実行する
import boto3
import requests
from requests_aws4auth import AWS4Auth

host = '{ドメインエンドポイント (VPC)}' # include https:// and trailing /
region = '{リージョン}' # e.g. ap-northeast-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/{スナップショット取得先のs3バケット}' # the OpenSearch API endpoint
url = host + path

payload = {
  "type": "s3",
  "settings": {
    "bucket": "{スナップショット取得先のs3バケット}",
    "base_path": "{スナップショット取得先のs3バケット配下のディレクトリパス}",
    "region": "{リージョン}",
    "role_arn": "arn:aws:iam::{AWSアカウントID}:role/xxxx-access-role"
  }
}

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

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

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

スナップショットの取得

# スナップショット取得先
export SNAPSHOT_BUCKET="{上記にて確認したs3バケットを指定}"
# スナップショット名
export BACKUP_FILE="{yyyymmddhhmmss}"
  • 全indexのスナップショットを取得する場合
curl -XPUT "${ENDPOINT}/_snapshot/${SNAPSHOT_BUCKET}/${BACKUP_FILE}?wait_for_completion=false" -H "Content-Type: application/json" -d '{"ignore_unavailable": true, "include_global_state": false, "include_aliases": false}'
  • 一部のスナップショットを取得する場合
curl -XPUT "${ENDPOINT}/_snapshot/${SNAPSHOT_BUCKET}/${BACKUP_FILE}?wait_for_completion=false" -H "Content-Type: application/json" -d '{"indices": ["my_index_1", "my_index_2"], "ignore_unavailable": true, "include_global_state": false, "include_aliases": false}'

スナップショット取得でエラーが出る場合、後述の「スナップショット取得先のリポジトリの削除」を実行し、リポジトリを再登録するとエラーが解消することがある

スナップショット取得状況確認

curl -s -X GET "${ENDPOINT}/_snapshot/${SNAPSHOT_BUCKET}/${BACKUP_FILE}" | jq .

スナップショット取得先のリポジトリの削除

リポジトリの削除は基本必要ない想定だが、何らかの事情で必要になった場合に実行する。

# リポジトリ削除
curl -XDELETE "${ENDPOINT}/_snapshot/my-snapshot"

# スナップショットの取得先の確認
curl -s -X GET "${ENDPOINT}/_snapshot" | jq .

エンドポイントの設定

export ENDPOINT_2={データ移行先のドメインのドメインエンドポイント(VPC)}

スナップショット取得先のS3の登録

前述の通り

スナップショットの取得先の確認

curl -s -X GET "${ENDPOINT_2}/_snapshot" | jq .

スナップショットの一覧の確認

export SNAPSHOT_BUCKET="my-snapshot"
curl "${ENDPOINT_2}/_snapshot/${SNAPSHOT_BUCKET}/_all"

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

export SNAPSHOT_BUCKET="my-snapshot"
export BACKUP_FILE="{yyyymmddhhmmss}"
curl -XPOST "${ENDPOINT_2}/_snapshot/${SNAPSHOT_BUCKET}/${BACKUP_FILE}/_restore" -H "Content-Type: application/json" -d '{
    "indices": "*",
    "ignore_unavailable": true
}'

リストアの進行状況の確認

  • 全情報を表示
curl -X GET "${ENDPOINT_2}/_cat/recovery?v&pretty&human"
  • 一部情報のみ表示
curl -X GET "${ENDPOINT_2}/_cat/recovery?v&h=index,shard,type,stage,files_percent,bytes_percent"

スナップショットのリストア(スナップショットにkibana indexが含まれている場合)

スナップショットにkibana indexが含まれており、kibana indexもリストアするとcannot restore index [.kibana_1] because an open index with same name already exists in the clusterのエラーが出るので"rename_pattern": ".kibana”"rename_replacement": "restored_.kibana”を指定する。

curl -XPOST "${ENDPOINT_2}/_snapshot/${SNAPSHOT_BUCKET}/${BACKUP_FILE}/_restore" -H "Content-Type: application/json" -d '{
    "indices": "*",
    "ignore_unavailable": true,
		"rename_pattern": ".kibana",
    "rename_replacement": "restored_.kibana"
}'

その後、reindex API オペレーションを使用して「restored.kibana」の名前を「.kibana」に戻す。

# reindex restored_.kibana to .kibana
curl -XPOST "${ENDPOINT_2}/_reindex" -H "Content-Type: application/json" -d '{
    "source": {
        "index": "restored_.kibana"
    },
    "dest": {
        "index": ".kibana"
    }
}' 
プロフィール
この記事を書いた人

30代半ばで未経験でプログラマーに転職し、日々奮闘中です
プログラミング、AI、NLP、キャリア関連などで少しでも役に立てる情報を発信していきます

ユウをフォローする
AWSElasticSearchOpenSearch
ユウをフォローする

コメント

タイトルとURLをコピーしました