

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 註冊手動快照儲存庫
<a name="managedomains-snapshot-registerdirectory"></a>

您需要先使用 OpenSearch Service 來註冊快照儲存庫，才能手動拍攝索引快照。此一次性操作要求您使用允許存取 的登入資料來簽署 AWS 請求`TheSnapshotRole`，如中所述[先決條件](managedomains-snapshots.md#managedomains-snapshot-prerequisites)。

## 步驟 1：映射 OpenSearch Dashboards 中的快照角色 (如果使用精細存取控制)
<a name="managedomains-snapshot-fgac"></a>

精細存取控制會在註冊儲存庫時進行額外的步驟。即使您將 HTTP 基本身分驗證用於所有其他目的，您也需要將 `manage_snapshots` 角色映射至擁有 `iam:PassRole` 許可能夠傳遞 `TheSnapshotRole` 的 IAM 角色。

1. 導覽至 OpenSearch Service 網域的 OpenSearch Dashboards 外掛程式。您可以在 OpenSearch Service 主控台的網域儀表板上找到 Dashboards 端點。

1. 從主選單中選擇 **Security** (安全性)、**Roles** (角色)，然後選取 **manage\$1snapshots** 角色。

1. 選擇 **Mapped users** (已映射的使用者)、**Manage mapping** (管理映射)。

1. 新增擁有許可傳遞 `TheSnapshotRole` 之角色的 ARN。將角色 ARN 放在 **Backend roles** (後端角色) 下。

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

1. 選擇 **Map** (映射)，並確認使用者或角色顯示在 **Mapped users** (已映射的使用者) 中。

## 步驟 2：註冊儲存庫
<a name="managedomains-snapshot-register"></a>

下列**快照**索引標籤示範如何註冊快照目錄。如需在遷移至新網域後加密手動快照和註冊快照的特定選項，請參閱相關索引標籤。

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

若要註冊快照儲存庫，請將 PUT 請求傳送到 OpenSearch Service 網域端點。您可以使用 [curl](https://curl.se/docs/manpage.html#--aws-sigv4)、[範例 Python 用戶端](#managedomains-snapshot-client-python)、[Postman](https://www.getpostman.com/) 或其他方法傳送已簽署的請求來註冊快照儲存庫。請注意，您無法在 OpenSearch Dashboards 主控台中使用 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 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-managed金鑰開啟 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)。

或者，您可以在用作快照儲存庫的 S3 儲存貯體上使用 AWS KMS 金鑰進行伺服器端加密。如果您使用此方法，請務必提供用於加密 S3 儲存貯體之 AWS KMS 金鑰的`TheSnapshotRole`許可。如需詳細資訊，請參閱 [AWS KMS中的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

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

註冊快照儲存庫是一次性操作。但要從一個網域遷移到另一個網域，必須在舊網域和新網域上註冊相同的快照儲存庫。儲存庫名稱是任意的。

遷移至新網域或註冊具有多個網域的相同儲存庫時，請考慮下列準則：
+ 在新網域上註冊儲存庫時，請將 `"readonly": true` 新增至 PUT 請求的 `"settings"` 區塊。此設定可防止您意外地從舊網域中覆寫資料。只有一個網域應具有儲存庫的寫入存取權。
+ 如果您要將資料遷移至不同 中的網域 （例如，從位於 us-east-2 的舊網域和儲存貯體遷移至 us-west-2 中的新網域） AWS 區域，請在 PUT 陳述式`"endpoint": "s3.amazonaws.com"`中將 取代`"region": "region"`為 ，然後重試請求。

------

### 使用 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/)、[請求](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)
```