注册手动快照存储库 - 亚马逊 OpenSearch 服务

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

注册手动快照存储库

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

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

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

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

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

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

  4. 添加具有传递 TheSnapshotRole 权限的角色的 ARN。将角色 ARN 置于 Backend roles(后端角色)下。

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

第 2 步:注册存储库

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

Snapshots

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

此请求采用以下形式:

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

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

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

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

Encrypted snapshots

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

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

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

Domain migration

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

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

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

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

使用示例 Python 客户端

Python 客户端比简单的 HTTP 请求更容易自动化,并且具有更好的可重用性。如果您选择使用此方法注册快照存储库,请将下面的示例 Python 代码保存为 Python 文件,如 register-repo.py。客户端需要 AWS SDK for Python (Boto3)requestsrequests-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": "s3-bucket-name", "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)