这是一份相当技术性的指南,用于从 Amazon OpenSearch Service(以前称为 Amazon Elasticsearch Service、Amazon ES 或 AWS ES)迁移到 Elastic Cloud 上的 Elasticsearch Service。这些步骤可能需要一些编程经验。Amazon OpenSearch Service集群通常配置到一个具有私有IP地址的私有云(VPC)中。他们也可以位于一个面向公域的端点上。为了保证本指南的通用性,我们描述了如何在任意场景下迁移您的数据。请注意,这些步骤假设你的Amazon OpenSearch Service域运行的Elasticsearch OSS版本。
在你继续执行迁移你的Amazon OpenSearch Service数据的步骤之前,需要注意以下几点。
了解此过程的IAM安全步骤很重要。首先,为了快照一个AWS ES集群到S3,你的AWS ES集群需要写入私有S3 bucket的权限。这需要具有这些权限的角色与策略。其次,你需要将IAM策略附加到一个IAM用户。如有必要,创建一个新用户。使用IAM用户连接到你的AWS ES集群,随后你的Elastic-managed(托管)部署可以使用同样的认证从你的S3 bucket读取快照。
想要了解更多的IAM角色,策略,与用户设置,请查看AWS文档: Creating index snapshots in Amazon OpenSearch Service
在这个过程中,你将在你的AWS Elasticsearch集群上运行一个手工快照请求。如果你可以直接访问你的ES集群,请使用Postman客户端来运行该请求。如果你的ES集群是一个内部虚拟私有云(VPC),请使用Python AWS SDK。关于每个工具的详细信息将在第二部分中提供Part 2。
在这个过程中有几个变量需要注意。我们建议你复制并粘贴下面的表格至一个笔记文件,以便于为您的迁移填充特定的值。
Description | Variable | Value |
---|---|---|
AWS ES Domain ARN | DOMAIN_ARN | - |
AWS ES Endpoint URL | ES_ENDPOINT | - |
AWS ES Region | ES_REGION | - |
AWS S3 Bucket Name | S3_BUCKET_NAME | - |
AWS S3 Region | S3_REGION_NAME | - |
AWS IAM Role ARN | ROLE_ARN | - |
AWS IAM Access Key ID | ACCESS_KEY | - |
AWS IAM Secret Access Key | SECRET_KEY | - |
AWS ES Snapshot Repository | SNAPSHOT_REPO | - |
AWS ES Snapshot Name | SNAPSHOT_NAME | - |
你可以修改SNAPSHOT_REPO 和 SNAPSHOT_NAME的值,或使用这些示例中提供的值,即:my-snapshot-repo 和 my-snapshot。
从AWS迁移涉及3个主要任务。
第一部分
设置AWS (IAM:Identity and Access Management)身份与访问管理用户,可访问AWS S3存储bucket。
第二部分
拍摄现有Elasticsearch数据快照。如果你不能在Elasticsearch实例上执行命令,因为它在一个你不能访问的VPC中,你将需要运行一个轻量级客户端在你VPC内的主机上。
第三部分
在Elasticsearch Service上设置部署,并将快照数据恢复到一个新Elasticsearch集群。
如果你已经将Amazon OpenSearch Service集群手工快照到S3,请跳至本指南的第三步
第一部分 - 设置一个具有S3 bucket访问权限的IAM用户
第二部分 - 对Elasticsearch数据进行快照
第三部分 - 将快照恢复到新的部署
1. 获取AWS ES详情
你需要关于Amazon OpenSearch Service集群的一些基础信息,以便将其快照至S3。
稍后将使用这些信息。首先在IAM策略中创建,随后想集群发出命令。
2. 创建AWS S3 bucket
你将需要一个S3 bucket来存储快照。
确保你的S3 bucket与你的Amazon Opensearch Service集群位于同一个区域(region)。从那里,你可以恢复到任意区域(region)或云提供商(AWS, GCP, or Azure)中Elastic管理的部署。
3. 创建IAM角色
创建一个角色以委派权限给Amazon OpenSearch服务来创建快照至S3。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}]
}
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::S3_BUCKET_NAME"
]
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::S3_BUCKET_NAME/*"
]
}
]
}
IAM角色是创建的內联策略,可以读写你的S3 bucket。
4. 创建IAM策略
创建一个新的IAM策略,该策略具有上一步创建的IAM角色的权限,以注册快照仓库。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "ROLE_ARN"
},
{
"Effect": "Allow",
"Action": "es:ESHttpPut",
"Resource": "DOMAIN_ARN/*"
}
]
}
创建了一个 IAM 策略,允许 IAM 角色与 Amazon OpenSearch Service 域对话。
5. 创建IAM用户
创建IAM用户并赋给它访问你私有S3 bucket的权限。如果你已经有了一个IAM用户,只需要将下面的IAM策略附给它即可。
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::S3_BUCKET_NAME"
]
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::S3_BUCKET_NAME/*"
]
}
]
}
你的AWS S3 bucket已设置好,以及访问它的IAM角色,策略与用户
拍摄一个快照记录Amazon OpenSearch服务索引的最新状态。
根据你Amazon OpenSearch服务的配置选择要使用的说明。如果你的集群可以直接访问,按照步骤 1a 和 1b操作。如果你的集群在你不能直接访问的VPC中,按照步骤 2a 和 2b
1a. 使用Postman注册一个快照仓库
运行手工快照之前,你需要在部署中注册一个快照仓库。这需要发送一个已签名的请求到AWS ES域。
如果可以直接访问你的Amazon OpenSearch服务的集群,通过调用Elasticsearch快照API手工执行快照请求。Postman是一个管理与运行API请求的好工具。这里使用它来简化我们AWS API请求的签名。
{
"type": "s3",
"settings": {
"region": S3_REGION_NAME,
"bucket": S3_BUCKET_NAME,
"role_arn": ROLE_ARN
}
}
https://ES_ENDPOINT/_snapshot/SNAPSHOT_REPO
where:
你的S3 bucket快照仓库已创建
1b. 拍摄数据快照
拍摄你当前ES数据的快照,并将它存放入新注册的仓库。
https://ES_ENDPOINT/_snapshot/SNAPSHOT_REPO/SNAPSHOT_NAME
where:
拍摄快照所需的时间取决于AWS ES域的大小。根据AWS文档,持续时间长的快照操作有时会显示一个 504 GATEWAY_TIMEOUT。该文档推荐你忽略这个错误,并等待快照的成功完成。
通过调用检查你快照的状态:
GET https://ES_ENDPOINT/_snapshot/SNAPSHOT_REPO/SNAPSHOT_NAME?pretty
成功拍摄快照后,请跳至第三部分 Part 3。
2a. 配置 Python AWS SDK
在运行手工快照之前,你需要在部署中注册一个快照仓库。这需要发送一个已签名的请求到你的Amazon OpenSearch服务集群。
如果Elasticsearch集群是在一个VPC中你不能直接访问,你需要访问主机(例如:EC2),该主机在你的VPC内并执行后面的脚本。在这些步骤与案例中我们使用Python AWS SDK,但是你可以使用任何语言的AWS SDK(例如,Java, Ruby, Go, or others)。
使用Python’s包安装器PIP(pip3)安装Python AWS SDK。如果遇到困难,请参阅 Python installation documentation.
安装 pip3
要在 Red Hat 及衍生产品 上安装 pip3 ,请使用yum:
$ sudo yum -y install python3-pip
一些 Fedora 发行版以不同的方式标记 pip3 包:
$ sudo yum -y install python36-pip
如果之前的 Python 包安装命令都不起作用, 请搜索正确的包名称:
yum search pip
在 Debian 衍生版本上,如 Ubuntu, 使用 apt-get:
sudo apt-get -y install python3-pip
安装 Python AWS SDK
在 pip3 安装之后, 可以安装名为 boto3 的Python AWS SDK:
$ pip3 install --user boto3 requests_aws4auth
Collecting boto3
...
Successfully installed boto3-1.9.106 requests-aws4auth-0.9 ...
注意,如果你指定了–user 标志,则不需要 root 访问
创建 ~/.aws 目录来保存你的ASW凭证。执行下面的命令来创建目录:
$ mkdir ~/.aws
使用你喜欢的编辑器创建一个名为 credentials 文件。
$ nano ~/.aws/credentials
复制并粘贴下面的内容到文件,使用实际值替换 ACCESS_KEY 与 SECRET_KEY :
[default]
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY
输入 Control + X 退出nano,并按照提示保存文件。
2b. 手工快照 AWS ES
使用Python脚本运行一个快速的测试来列出AWS ES集群中的索引。这确保你的AWS凭证有效并且可以访问集群。
使用你喜欢的编辑器创建一个名为 indices.py 的文件
$ nano indices.py
复制并粘贴下面的内容,将 ES_ENDPOINT and ES_REGION 替换为你的值:
import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Listing Indices from AWS ES ...")
req = requests.get(host + '/_cat/indices?v', auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)
输入 Control + X 退出nano,并按照提示保存文件。
执行Python脚本。
$ python3 indices.py
你的输出应该看起来与下面类似:
Listing Indices from AWS ES ...
HTTP Response Code: 200
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open testindex yME2BphgR3Gt1ln6n03nHQ 5 1 1 0 4.4kb 4.4kb
使用你喜欢的编辑器创建一个名为 register.py 的文件
$ nano register.py
复制并粘贴下面的内容,将 ES_ENDPOINT, ES_REGION, SNAPSHOT_REPO, SNAPSHOT_NAME, S3_REGION_NAME, S3_BUCKET_NAME, 和 ROLE_ARN 替换为你的值:
import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
s3_region_name = 'S3_REGION_NAME'
s3_bucket_name = 'S3_BUCKET_NAME'
role_arn = 'ROLE_ARN'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
headers = {"Content-Type": "application/json"}
payload = {
"type": "s3",
"settings": {
"region": s3_region_name,
"bucket": s3_bucket_name,
"role_arn": role_arn
}
}
print("Registering Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name
req = requests.put(url, auth=auth, json=payload, headers=headers)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)
输入 Control + X 退出nano,并按照提示保存文件。
运行Python脚本。
$ python3 register.py
你的输入应该看起来与下面类似:
Registering Snapshot with AWS ES ...
HTTP Response Code: 200
{"acknowledged":true}
使用你喜欢的编辑器创建一个名为 snapshot.py 的文件。
$ nano snapshot.py
复制并粘贴下面的内容,将 ES_ENDPOINT, ES_REGION, SNAPSHOT_REPO, 和 SNAPSHOT_NAME 替换为你的值:
import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Starting Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name + '/' + snapshot_name
req = requests.put(url, auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)
输入 Control + X 退出nano,并按照提示保存文件。
运行Python脚本:
$ python3 snapshot.py
你的输出将看起来跟下面类似:
Starting Snapshot with AWS ES ...
HTTP Response Code: 200
{"accepted":true}
拍摄快照所需的时间取决于AWS ES域的大小。根据AWS文档,持续时间较长的快照操作有时会显示 504 GATEWAY_TIMEOUT 。该文档建议你忽略此错误并等待快照成功完成。
最后,检查快照的状态。创建一个名为 status.py 的文件。
$ nano status.py
复制并粘贴下面的内容,将 ES_ENDPOINT, ES_REGION, SNAPSHOT_REPO, and SNAPSHOT_NAME 替换为你的值:
import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Getting Status of Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name + '/' + snapshot_name + '?pretty'
req = requests.get(url, auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)
输入 Control + X 退出nano,并按照提示保存文件。
运行Python脚本。
$ python3 status.py
你的输出应该看起来与下面类似:
Getting Status of Snapshot with AWS ES ...
HTTP Response Code: 200
{
"snapshots" : [ {
"snapshot" : "my-snapshot",
"uuid" : "ClYKt5g8QFO6r3kTCEzjqw",
"version_id" : 6040299,
"version" : "6.4.2",
"indices" : [ "testindex" ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2019-03-03T14:46:04.094Z",
"start_time_in_millis" : 1551624364094,
"end_time" : "2019-03-03T14:46:04.847Z",
"end_time_in_millis" : 1551624364847,
"duration_in_millis" : 753,
"failures" : [ ],
"shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
}
} ]
}
如果你看到 “state”:“SUCCESS” ,那么你已经成功拍摄了一个快照至S3,并已经为第三部分做好了准备!
1. 在Elasticsearch服务中创建部署
导航至 Elastic Cloud 并注册一个账户以获得14天免费试用的访问权限。在你登录后,按照说明在AWS,Google Cloud,或者Microsoft Azure中创建一个部署。
关于说明的详细信息与所有选项的描述,请查看 Create your deployment 。
2. 添加你的 secrets 至 keystore
在你部署好以后,保存你的 ACCESS_KEY 与 SECRET_KEY 到 Keystore中
3. 在新部署中注册快照仓库
要执行此步骤你的部署必须是Elastic Stack版本7.2或更高版本。如果你使用的是更早的部署版本,请查看我们关于使用AWS配置快照仓库的更详细的说明 configuring a snapshot repository using AWS。
4. 从新快照仓库恢复
还是在Kibana的 Snapshot and Restore 页面:
从快照恢复所需的时间因你的数据大小而有所不同
5. 探索 Elasticsearch 服务
现在你已经启动并运行了自己的数据,通过尝试探索最新版本的Elastic Stack的强大功能:SIEM, Lens, Machine Learning, APM, Maps, Index Lifecycle Management, Snapshot Lifecycle Management, Logs, Metrics, Monitoring, Canvas, Uptime等等!
https://www.elastic.co/guide/en/cloud/current/ec-migrate-from-aws.html