从Amazon OpenSearch Service迁移(以前的Amazon Elasticsearch Service)

这是一份相当技术性的指南,用于从 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。

AWS 变量

在这个过程中有几个变量需要注意。我们建议你复制并粘贴下面的表格至一个笔记文件,以便于为您的迁移填充特定的值。

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用户

  1. 获取AWS ES详情:Get your AWS ES details
  2. 创建AWS S3 bucket:Create an AWS S3 bucket
  3. 创建IAM角色:Create an IAM role
  4. 创建IAM策略:Create an IAM policy
  5. 创建IAM用户:Create an IAM user

第二部分 - 对Elasticsearch数据进行快照

  1. 如果你可以直接访问Elasticsearch集群:
    1. Register a snapshot repository using Postman
    2. Take a snapshot of your data
  2. 如果Elasticsearch集群在你不能访问的VPC中(例如通过VPN):
    1. 配置python AWS SDK:Configure the Python AWS SDK
    2. 手工快照AWS ES:Manually snapshot AWS ES

第三部分 - 将快照恢复到新的部署

  1. 在Elasticsearch Service中创建一个部署:Create a deployment in Elasticsearch Service
  2. 添加secrets至keystore:Add your secrets to the keystore
  3. 在你的新部署中注册快照仓库:Register your snapshot repository in your new deployment
  4. 从你的新快照仓库恢复:Restore from your new snapshot repository
  5. 搜索Elasticsearch Service:Explore Elasticsearch Service

第一部分 - 设置具有S3 bucket访问权限的IAM用户

1. 获取AWS ES详情
你需要关于Amazon OpenSearch Service集群的一些基础信息,以便将其快照至S3。

  1. 在AWS控制台转到Amazon OpenSearch服务。
  2. 在想要快照的集群的域上选择。
  3. 复制 Endpoint URL值至你的笔记文件(变量=ES_ENDPOINT)。就是前面讲到的AWS变量中的一个
  4. 复制 Domain ARN 值至你的笔记文件 (变量=DOMAIN_ARN)。
  5. 注意你的AWS ES集群位于哪个区域(例如,us-east-1)(变量=ES_REGION)。

稍后将使用这些信息。首先在IAM策略中创建,随后想集群发出命令。
2. 创建AWS S3 bucket
你将需要一个S3 bucket来存储快照。
确保你的S3 bucket与你的Amazon Opensearch Service集群位于同一个区域(region)。从那里,你可以恢复到任意区域(region)或云提供商(AWS, GCP, or Azure)中Elastic管理的部署。

  1. 在 AWS控制转到S3服务。
  2. 选择 Create bucket 来创建一个私有S3 bucket。
  3. 选择您的隐私与安全设置。
  4. 复制bucket的名字至你的笔记文件(变量=S3_BUCKET_NAME)。
  5. 复制bucket的区域至你的笔记文件(变量=S3_REGION_NAME)。

3. 创建IAM角色
创建一个角色以委派权限给Amazon OpenSearch服务来创建快照至S3。

  1. 在AWS控制台转到IAM服务。
  2. 打开Roles页面
  3. 选择 Create role
  4. 选择 EC2 作为服务使用的新角色(稍后更改)
  5. 选择 Next: Permissions.
  6. 暂时将角色的策略留空
  7. 选择 Next: Tags.
  8. 选择 Next: Review.
  9. 角色命名为: TheSnapshotRole.
  10. 选择 Create role
  11. 从角色列表中,选择你刚刚创建的角色: TheSnapshotRole.
  12. 打开 Trust relationships tab页
  13. 选择 Edit trust relationship
  14. 复制并粘贴下面的JSON至Policy Document字段,替换掉示例文本:
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Service": "es.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
  }]
}
  1. 选择 Update Trust Policy
  2. 打开 Permissions tab页
  3. 选择 Add inline policy
  4. 打开 JSON tab页
  5. 复制并粘贴下面的JSON,替换掉示例文本
  • 将 S3_BUCKET_NAME 替换为正确的值
{
  "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/*"
      ]
    }
  ]
}
  1. 选择 Review policy.
  2. 策略命名为: TheSnapshotS3Policy.
  3. 选择 Create policy.
  4. 复制 Role ARN 值至你的笔记文件(变量=ROLE_ARN)

IAM角色是创建的內联策略,可以读写你的S3 bucket。
4. 创建IAM策略
创建一个新的IAM策略,该策略具有上一步创建的IAM角色的权限,以注册快照仓库。

  1. 在 AWS控制台转到IAM服务
  2. 打开 Policies 页面
  3. 选择 Create policy
  4. 打开 JSON tab页
  5. 复制并粘贴下面的JSON,替换掉示例文本
    • 将 ROLE_ARN 替换为正确的值
    • 将 DOMAIN_ARN 替换为正确的值
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "ROLE_ARN"
    },
    {
      "Effect": "Allow",
      "Action": "es:ESHttpPut",
      "Resource": "DOMAIN_ARN/*"
    }
  ]
}
  1. 选择 Review policy.
  2. 策略命名为: TheSnapshotPolicy.
  3. 选择 Create policy

创建了一个 IAM 策略,允许 IAM 角色与 Amazon OpenSearch Service 域对话。
5. 创建IAM用户
创建IAM用户并赋给它访问你私有S3 bucket的权限。如果你已经有了一个IAM用户,只需要将下面的IAM策略附给它即可。

  1. 在AWS控制台,转到 IAM服务。
  2. 打开 Users 页面
  3. 选择 Add user.
  4. 用户命名为: TheSnapshotUser.
  5. 对于访问类型, 选择 Programmatic access.
  6. 选择 Next: Permissions.
  7. 选择 Attach existing policies directly.
  8. 在搜索字段上通过输入 TheSnapshot 过滤策略
  9. 选择 TheSnapshotPolicy 策略旁边的复选框
  10. 选择 Next: Tags.
  11. 选择 Next: Review.
  12. 选择 Create user.
  13. 复制 Access key ID 值到你的笔记文件(变量=ACCESS_KEY).
  14. Secret access key 下面, 选择 Show.
  15. 复制 Secret access key 值到你的笔记文件(变量=SECRET_KEY).
  16. 选择 Close.
  17. 从列表中,选择你创建的用户: TheSnapshotUser
  18. 选择 Add inline policy.
  19. 打开 JSON tab页
  20. 复制并粘贴下面的JSON,替换掉示例文本
  • 将 S3_BUCKET_NAME 替换为正确的值
{
  "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/*"
      ]
    }
  ]
}
  1. 选择 Review policy.
  2. 策略命名为: TheSnapshotUserS3Policy.
  3. 选择 Create policy.

你的AWS S3 bucket已设置好,以及访问它的IAM角色,策略与用户

第二部分 - 拍摄Elasticsearch数据的快照

拍摄一个快照记录Amazon OpenSearch服务索引的最新状态。

根据你Amazon OpenSearch服务的配置选择要使用的说明。如果你的集群可以直接访问,按照步骤 1a 和 1b操作。如果你的集群在你不能直接访问的VPC中,按照步骤 2a 和 2b

1a. 使用Postman注册一个快照仓库
运行手工快照之前,你需要在部署中注册一个快照仓库。这需要发送一个已签名的请求到AWS ES域。
如果可以直接访问你的Amazon OpenSearch服务的集群,通过调用Elasticsearch快照API手工执行快照请求。Postman是一个管理与运行API请求的好工具。这里使用它来简化我们AWS API请求的签名。

  1. 创建一个新的Postman请求
  2. Authorization tab页下TYPE下拉菜单中选择 AWS Signature
  3. 输入你的 ACCESS_KEY, SECRET_KEY, AWS_REGION, 并使用 es 作为服务名称。将 Session Token 字段留空。
  4. 在**Body **tab页下选择 raw 并设置格式化为 JSON。添加下面的payload,替换这些值: S3_REGION_NAME, S3_BUCKET_NAME, ROLE_ARN, ES_ENDPOINT, and SNAPSHOT_REPO:
{
        "type": "s3",
        "settings": {
                "region": S3_REGION_NAME,
                "bucket": S3_BUCKET_NAME,
                "role_arn": ROLE_ARN
        }
}
  1. 设置请求类型为PUT 并输入:
https://ES_ENDPOINT/_snapshot/SNAPSHOT_REPO

where:

  • ES_ENDPOINT 是Elasticsearch endpoint URL
  • SNAPSHOT_REPO 是你为新仓库选择的一个名称
  1. 选择 Send

你的S3 bucket快照仓库已创建
1b. 拍摄数据快照
拍摄你当前ES数据的快照,并将它存放入新注册的仓库。

  1. 使用Postman, 创建一个新请求。
  2. Authorization tab下的TYPE下拉菜单中选择 AWS Signature
  3. 输入你的 ACCESS_KEY, SECRET_KEY, AWS_REGION, 并使用 es 作为服务名称。将Session Token 字段留空。
  4. 设置请求类型为 PUT 并输入:
https://ES_ENDPOINT/_snapshot/SNAPSHOT_REPO/SNAPSHOT_NAME

where:

  • ES_ENDPOINT 是 Elasticsearch endpoint URL.
  • SNAPSHOT_REPO 是你已注册的仓库的名称。
  • SNAPSHOT_NAME 要创建的快照名称。实际的快照名称必须是小写。

拍摄快照所需的时间取决于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中

  1. 导航到你新部署的 Security 页面
  2. 找到 Elasticsearch keystore 并选择 Add settings.
  3. Type 设置为 Single string, 添加下面的keys与他们的值:
    • s3.client.default.access_key
    • s3.client.default.secret_key

3. 在新部署中注册快照仓库
要执行此步骤你的部署必须是Elastic Stack版本7.2或更高版本。如果你使用的是更早的部署版本,请查看我们关于使用AWS配置快照仓库的更详细的说明 configuring a snapshot repository using AWS。

  1. 在Elasticsearch服务中相同的部署中,打开 Kibana 并转到 Management > Snapshot and Restore.
  2. Repositories tab页选择 Register a repository
  3. 为你的仓库提供一个名称并选择类型 AWS S3
  4. 提供下面的配置:
    • Client: default
    • Bucket: YOUR_S3_BUCKET_NAME
  5. 添加你想要配置的任何其他配置
  6. 选择 Register
  7. 选择 Verify 确认你的配置是正确的以及部署可以连接到你的仓库

4. 从新快照仓库恢复
还是在Kibana的 Snapshot and Restore 页面:

  1. 打开 Snapshots tab页面
  2. 检索你之前创建的快照
  3. 选择 Restore
  4. 选择想要恢复的索引
  5. 配置任何其他相关的设置
  6. 选择 Restore snapshot 开始处理

从快照恢复所需的时间因你的数据大小而有所不同
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

你可能感兴趣的:(elasticsearch,大数据,搜索引擎,aws)