

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

# 注册手动快照存储库
<a name="managedomains-snapshot-registerdirectory"></a>

您需要先向 S OpenSearch ervice 注册快照存储库，然后才能手动拍摄索引快照。此一次性操作要求您使用允许访问的凭据签署 AWS 请求`TheSnapshotRole`，如中所述[先决条件](managedomains-snapshots.md#managedomains-snapshot-prerequisites)。

## 步骤 1：在 OpenSearch 仪表板中映射快照角色（如果使用精细的访问控制）
<a name="managedomains-snapshot-fgac"></a>

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

1. 导航到您的 OpenSearch 服务域的 OpenSearch 仪表板插件。您可以在 OpenSearch 服务控制台的域控制面板上找到控制面板终端节点。

1. 从主菜单中选择**安全**、**角色**，然后选择 **manage\$1snapshots** 角色。

1. 选择**映射的用户**、**管理映射**。

1. 添加具有传递 `TheSnapshotRole` 权限的角色的 ARN。将角色置 ARNs 于**后端角色**下。

   ```
   arn:aws:iam::123456789123:role/role-name
   ```

1. 选择**映射**并确认在**映射的用户**下显示的用户或角色。

## 第 2 步：注册存储库
<a name="managedomains-snapshot-register"></a>

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

------
#### [ Snapshots ]

要注册快照存储库，请向 OpenSearch 服务域端点发送 PUT 请求。您可以使用 [curl](https://curl.se/docs/manpage.html#--aws-sigv4)、[示例 Python 客户端](#managedomains-snapshot-client-python)、[Postman](https://www.getpostman.com/) 或某种其他方式发送已签名请求以注册快照存储库。请注意，您不能在控制 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 或企业网络。要检查您是否可以访问 OpenSearch 服务域，请在 Web 浏览器`https://your-vpc-domain.region.es.amazonaws.com`中导航到并验证您是否收到了默认 JSON 响应。

当您的 Amazon S3 存储桶位于 AWS 区域 其他 OpenSearch域中时，请将参数`"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 托管式密钥服务器端加密（SSE-S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

或者，您可以使用 AWS KMS 密钥对用作快照存储库的 S3 存储桶进行服务器端加密。如果您使用这种方法，请确保为用于加密 S3 存储桶的 AWS KMS 密钥提供`TheSnapshotRole`权限。有关更多信息，请参阅[AWS KMS中的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

------
#### [ Domain migration ]

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

迁移到新域或使用多个域注册同一存储库时，请考虑以下准则：
+ 在新域中注册存储库时，将 `"readonly": true` 添加到`"settings"` PUT 请求数据库。此设置可防止您意外覆盖旧域中的数据。应该只有一个域具有对存储库的写入权限。
+ 如果您要将数据迁移到不同 AWS 区域中的域（例如，从位于 us-east-2 的旧域和存储桶迁移到 us-west-2 中的新域），请将 `"region": "region"` 替换为 PUT 语句中的 `"endpoint": "s3.amazonaws.com"`，然后重试请求。

------

### 使用示例 Python 客户端
<a name="managedomains-snapshot-client-python"></a>

Python 客户端比简单的 HTTP 请求更容易自动化，并且具有更好的可重用性。如果您选择使用此方法注册快照存储库，请将下面的示例 Python 代码保存为 Python 文件，如 `register-repo.py`。客户端需要 [适用于 Python (Boto3) 的 AWS SDK](https://aws.amazon.com/sdk-for-python/)、[requests](http://docs.python-requests.org/) 和 [requests-aws4auth](https://pypi.python.org/pypi/requests-aws4auth) 程序包。客户端包含其他快照操作的带注释示例。

更新示例代码中的以下变量：`host`、`region`、`path` 和 `payload`。

```
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)
```