説明
AWS Elasticsearchは、ドメイン内のメインインデックスシャードのスナップショットを毎日自動的に作成し、これらのスナップショットを事前設定されたAWSS3ストレージスペースに保存します。これらのスナップショットは、追加費用なしで14日間保持されます。さらに、これらのスナップショットを使用してドメインを復元することもできますが、これらの自動スナップショットを新しいドメインに移行することはできません。移行する場合は、独自のリポジトリ(S3ストレージスペース)に保存されている手動スナップショットを使用する必要があります。手動スナップショットには、標準のS3料金が請求されます。
したがって、定期的なデータバックアップ、データリカバリ、ES移行などのアクティビティを完了するために、手動のスナップショットを作成する必要があります。この記事では、主に手動スナップショットの作成プロセスとスキームについて説明します〜
ソリューションアーキテクチャ
スナップショットプロセスを構築する
公式文書、あまりよく書かれていません〜
AWSで手動スナップショットを作成するための前提条件
AWSS3ストレージスペースを作成する
ここで作成された名前はai-voice-test-snapshot
、値が後で戦略とスクリプトで使用されることです。
IAMロールを作成する
ここでの役割名はですai-voice-test-es-snapshot
。この値は、後で戦略とスクリプトで使用されます。
IAMコンソールでAWSサービスロールを作成する場合、AWSElasticsearchは[ロールタイプの選択]ドロップダウンリストに含まれません。ただし、次のように、最初にAmazon EC2を選択し、プロンプトに従ってロールの作成を完了してから、ロールの信頼関係でec2.amazonaws.comをes.amazonaws.comに変更できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAMポリシーを作成する
ここで2つの戦略を作成します。内容は次のとおりです〜
- AWSElasticsearchドメインを保存するS3ストレージスペースを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ai-voice-test-snapshot"
]
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ai-voice-test-snapshot/*"
]
}
]
}
- es:ESHttpPut操作に対するロールのアクセス権を指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:Pa***ole",
# 角色 ARN
"Resource": "arn:aws:iam::123456789123:role/ai-voice-test-es-snapshot"
},
{
"Effect": "Allow",
"Action": "es:ESHttpPut",
# ES 域 ARN
"Resource": "arn:aws:es:ap-southeast-1:123456789123:domain/aivoice-test"
}
]
}
スナップショットリポジトリを作成し、スナップショットを生成します
最初に基本的な概念を理解します。ESのスナップショットアーキテクチャには2つの層があります。最初の層はリポジトリで、2番目の層はスナップショット名であるため、URIは次のように大きくなります。
# /_snapshot/repository/snapshot-name
_snapshot/es-snapshot-repo/es-snapshot-20210319
AWS Elasticsearch Serviceの手動スナップショットシステムは、指定したS3バケットにデータを保存します。リポジトリ名はバケットソースに対応します。同じバケットソースに対応するように複数のリポジトリを設定でき、これらの同じソースが表示されます。リポジトリ内のスナップショットは同じものです。これは理解しやすいかもしれませんが、実際の操作ではあまり意味がありません。
スナップショットリポジトリを登録する
必要なパッケージをインストールします。
pip install boto3
pip install requests_aws4auth
コードは現在ai jumper
サーバーの/root/admin-workspace/es-snapshot
パスに配置されており、内容は次のとおりです。
# cat register-repo.py
import boto3
import requests
from requests_aws4auth import AWS4Auth
host = 'https://vpc-aivoice-test-thisisjustatest.ap-southeast-1.es.amazonaws.com/' # include https:// and trailing /
region = 'ap-southeast-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)
# Register repository
path = '_snapshot/es-snapshot-repo' # the Elasticsearch API endpoint
url = host + path
payload = {
"type": "s3",
"settings": {
"bucket": "ai-voice-test-snapshot",
"region": "ap-southeast-1",
"role_arn": "arn:aws:iam::123456789123:role/ai-voice-test-es-snapshot"
}
}
headers = {"Content-Type": "application/json"}
r = requests.put(url, auth=awsauth, json=payload, headers=headers)
print(r.status_code)
print(r.text)
説明:
上記のコードのaccess_key, secret_key
情報は、/root/.aws
ディレクトリ内の2つのファイルから取得されます。これは、操作権限が必要なIAMアカウントです。次のように:
# cat ./config
[default]
region = ap-southeast-1
# cat ./credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxx
上記のスクリプトを実行すると、スナップショットリポジトリのみが登録され、スナップショットはまだ作成されていません。この登録済みリポジトリは、kibana DEV〜で表示できます。
# 注册 snapshot repository
python register-repo.py
スナップショットを作成する
スナップショットを作成するリクエストは次のとおりです。KibanaDevToolsを使用している場合は、ドメイン名を追加する必要はありません。
# 格式:PUT /_snapshot/my-snapshot-repo/snapshot-name
PUT /_snapshot/es-snapshot-repo/es-snapshot-20210319
うまくいけば、S3はスナップショット関連のファイルをゆっくりと使い果たしますが、完了するまでに少し時間がかかります。テスト後、150Gのデータボリュームの実行には約1時間かかります。
スナップショットを確認する
スナップショットビルドステータス情報の表示:
GET /_snapshot/es-snapshot-repo/es-snapshot-20210319
印刷情報は次のとおりです。
その他のコマンド
# 获取所有repositories:
GET /_snapshot/_all?pretty
# 获取某个仓库下的快照信息
GET /_snapshot/es-snapshot-repo/_all?pretty