注册手动快照存储库 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

注册手动快照存储库

您必须通过 S OpenSearch ervice 注册快照存储库,然后才能拍摄手动索引快照。此一次性操作需要使用允许访问的凭证签发 Amazon 请求TheSnapshotRole,如中所述先决条件

步骤 1:映射 OpenSearch 控制面板中的快照角色(如果使用精细访问控制)

注册存储库时,精细访问控制会引入额外的步骤。即使将 HTTP 基本身份验证用于所有其他目的,也需要将 manage_snapshots 角色映射到具有传递 TheSnapshotRoleiam:PassRole 权限的 IAM 角色。

  1. 导航到 S OpenSearch ervice 域的 OpenSearch 控制面板插件。您可以在S OpenSearch ervice 控制台域控制面板上找到控制面板端点。

  2. 从主菜单中选择安全角色,然后选择 manage_snapshots 角色。

  3. 选择映射的用户管理映射

  4. 添加具有传递 TheSnapshotRole 权限的角色的 ARN。将角色置 ARNs 于 “后端角色” 下。

    arn:aws:iam::123456789123:role/role-name
  5. 选择映射并确认在映射的用户下显示的用户或角色。

第 2 步:注册存储库

以下快照选项卡演示如何注册快照目录。有关在迁移到新域后加密手动快照和注册快照的特定选项,请参阅相关选项卡。

Snapshots

要注册快照存储库,请将 PUT 请求发送到S OpenSearch ervice 域终端。您可以使用 curl示例 Python 客户端Postman 或某种其他方式发送已签名请求以注册快照存储库。请注意,不能在控制 OpenSearch 面板控制台中使用 PUT 请求注册存储库。

请求的格式如下:

PUT domain-endpoint/_snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "amzn-s3-demo-bucket", "base_path": "my/snapshot/directory", "region": "region", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } }
注意

存储库名称不能以“cs-”开头。此外,您不应该从多个域写入同一个存储库。应该只有一个域具有对存储库的写入权限。

如果域位于某个 Virtual Private Cloud(VPC)中,则必须将您的电脑连接到该 VPC,请求才能成功注册快照存储库。访问 VPC 因网络配置而异,但很可能包括连接到 VPN 或企业网络。要检查您是否可以访问S OpenSearch ervice 域,请在 Web 浏览器https://your-vpc-domain.region.es.amazonaws.com中导航到并验证您是否收到默认的 JSON 响应。

如果 Amazon S3 存储桶与您的 OpenSearch域 Amazon Web Services 区域 不在同一中,请将参数"endpoint": "s3.amazonaws.com"添加到该请求。

Encrypted snapshots

您目前无法使用 Amazon Key Management Service (KMS) 密钥对手动快照进行加密,但您可以使用服务器端加密 (SSE) 对它们进行保护。

要为您用作快照存储库的存储桶启用使用 S3 托管密钥的 SSE,请将 "server_side_encryption": true 添加到 PUT 请求 "settings" 数据块。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 Amazon S3 托管式密钥服务器端加密(SSE-S3)

您也可以使用 Amazon KMS 密钥对您用作快照存储库的 S3 存储桶进行服务器端加密。如果您使用此方法,请务必为用于加密 S3 存储桶的 Amazon KMS 密钥提供TheSnapshotRole权限。有关更多信息,请参阅Amazon KMS中的密钥策略

Domain migration

注册快照存储库是一次性操作。但要从一个域迁移到另一个域,您必须在旧域和新域中注册相同的快照存储库。存储库名称是任意的。

迁移到新域或使用多个域注册同一存储库时,请考虑以下准则:

  • 在新域中注册存储库时,将 "readonly": true 添加到"settings" PUT 请求数据库。此设置可防止您意外覆盖旧域中的数据。应该只有一个域具有对存储库的写入权限。

  • 如果您要将数据迁移到不同 Amazon Web Services 区域中的域(例如,从位于 us-east-2 的旧域和存储桶迁移到 us-west-2 中的新域),请将 "region": "region" 替换为 PUT 语句中的 "endpoint": "s3.amazonaws.com",然后重试请求。

使用示例 Python 客户端

Python 客户端比简单的 HTTP 请求更容易自动化,并且具有更好的可重用性。如果您选择使用此方法注册快照存储库,请将下面的示例 Python 代码保存为 Python 文件,如 register-repo.py。客户端需要 适用于 Python (Boto3) 的 Amazon SDKrequestsrequests-aws4auth 程序包。客户端包含其他快照操作的带注释示例。

更新示例代码中的以下变量:hostregionpathpayload

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # domain endpoint 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-name' # the OpenSearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "amzn-s3-demo-bucket", "base_path": "my/snapshot/directory", "region": "us-west-1", "role_arn": "arn:aws:iam::123456789012:role/snapshot-role" } } 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-name/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 indexes except Dashboards and fine-grained access control) # # path = '/_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security,-.opendistro-*", # "include_global_state": False # } # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text) # # # Restore snapshot (one index) # # path = '/_snapshot/my-snapshot-repo-name/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)