尝试升级(迁移)[AWS] Amazon Elasticsearch Service的版本
计划中的事项
- AWS Elasticsearch 服务域名:版本5.x
查看公式文件
读取官方文档时,请注意以下关键事项(引自上述官方文档):切换至另一个Elasticsearch版本。
重要
バージョン 6.0 で作成されたインデックスでは、複数のマッピングタイプがサポートされなくなりました。バージョン 5.x で作成されたインデックスでは引き続き、6.0 クラスターに復元する際に複数のマッピングタイプがサポートされます。
Amazon Kinesis Firehose や Amazon CloudWatch Logs などのサービスを使用して Amazon ES にデータをストリーミングする場合は、移行前にこれらのサービスが Elasticsearch 6.0 をサポートしていることを確認します。
AWS Lambda を使用する場合は、コードによって作成されるマッピングタイプがインデックスごとに 1 種類のみであることを確認します。
如果要将版本5.x升级(迁移)到版本6.x,请注意有多个映射类型不再受支持。
让我们实际尝试更新版本
在这里需要注意的是,已经存在的域名无法进行升级。需要建立一个新的域名,并从原域名的手动快照中恢复。当然,在迁移完成后,如果不删除原域名,将会产生域名使用费。
所以,我要更改标题。
尝试实际迁移版本
要做的事情 zuò de
-
- 手动获取原始域名的快照
-
- 创建目标域名
-
- 将目标域名的.kibana从版本5.x更改为版本6.x
-
- 将原始域名的快照还原到目标域名(不包括.kibana)
- 如果原始域名不再需要,则删除(建议不要立即删除,但会产生费用)
Amazon Elasticsearch Serviceは自動スナップショットを毎日とっています
自動スナップショットは構成済みのAmazon S3 バケットに14日間保存されます(非課金対象
自動スナップショットはスナップショットの元となったドメイン内からしか読みこむことが出来ません
そのため、移行するときは `手動スナップショット` が必須となります
手动获取原始域名的快照
使用亚马逊Elasticsearch服务的索引快照。
在上述的公式文档中引用的前提条件。
S3:亚马逊的简易存储服务。
为了保存Amazon Elasticsearch Service域的手动快照,做好准备工作。
arn:aws:s3:::es-index-backups
我是IAM角色
将Amazon Elasticsearch Service指定为”Service”: “es.amazonaws.com”。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::123456789012:role/TheServiceRole"
}
}
我是IAM权限
{
"Version":"2012-10-17",
"Statement":[
{
"Action":[
"s3:ListBucket"
],
"Effect":"Allow",
"Resource":[
"arn:aws:s3:::es-index-backups"
]
},
{
"Action":[
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect":"Allow",
"Resource":[
"arn:aws:s3:::es-index-backups/*"
]
}
]
}
手动注册快照存储库
创建下面的Python文件,并手动将快照存储库注册
import boto3
import requests
from requests_aws4auth import AWS4Auth
host = '' # include https:// and trailing /
region = '' # 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/my-snapshot-repo' # the Elasticsearch API endpoint
url = host + path
payload = {
"type": "s3",
"settings": {
"bucket": "s3-bucket-name",
"region": "",
"role_arn": "arn:aws:iam::123456789012:role/TheServiceRole"
}
}
headers = {"Content-Type": "application/json"}
r = requests.put(url, auth=awsauth, json=payload, headers=headers)
print(r.status_code)
print(r.text)
# # TAKE SNAPSHOT
#
# path = '_snapshot/my-snapshot-repo/my-snapshot'
# url = host + path
#
# r = requests.put(url, auth=awsauth)
#
# print(r.text)
#
# # DELETE INDEX
#
# path = 'my-index'
# url = host + path
#
# r = requests.delete(url, auth=awsauth)
#
# print(r.text)
#
# # RESTORE SNAPSHOT (ALL INDICES)
#
# path = '_snapshot/my-snapshot-repo/my-snapshot/_restore'
# url = host + path
#
# r = requests.post(url, auth=awsauth)
#
# print(r.text)
#
# # RESTORE SNAPSHOT (ONE INDEX)
#
# path = '_snapshot/my-snapshot-repo/my-snapshot/_restore'
# url = host + path
#
# payload = {"indices": "my-index"}
#
# headers = {"Content-Type": "application/json"}
#
# r = requests.post(url, auth=awsauth, json=payload, headers=headers)
#
# print(r.text)
确认已在Amazon Elasticsearch Service上注册的S3快照目录。
使用curl命令向elasticsearch域终端发送GET请求,请求的路径为'{repository}/_all?pretty’。
例:
elasticsearch-domain-endpoint: https://search-xxx.es.amazonaws.com
repository: /_snapshot/backups
$ curl -XGET 'https://search-xxx.es.amazonaws.com/_snapshot/backups/_all?pretty'
実行結果: スナップショットが一件も登録されていない
{
"snapshots" : [ ]
}
手动创建快照
$ curl -XPUT '{elasticsearch-domain-endpoint}/{repository}/{snapshot-name}'
请确保后续的工作都已经正确完成。
$ curl -XGET '{elasticsearch-domain-endpoint}/{repository}/_all?pretty'
2. 创建一个迁移目标域
将移行前域名中的.kiban从版本5.x更改为版本6.x。
4. 将原始域快照恢复到目标域(除.kibana以外)。
当然可以,指定迁移目标域名
恢复以下所有索引
$ curl -XPOST '{elasticsearch-domain-endpoint}/{repository}/{snapshot-name}/_restore'
以下选项可还原任意索引:
1. 通过下面的方法可以恢复任意索引:
$ curl -XPOST '{elasticsearch-domain-endpoint}/{repository}/{snapshot-name}/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'
印象
真是相当麻烦呢