在 Amazon OpenSearch Service 中建立索引快照 - Amazon OpenSearch Service

在 Amazon OpenSearch Service 中建立索引快照

Amazon OpenSearch Service 中的快照是叢集的索引和狀態的備份。狀態包含叢集設定、節點資訊、索引設定和碎片分配。

OpenSearch Service 快照的形式如下:

  • 自動快照僅適用叢集復原。如果發生紅色叢集狀態或資料遺失,您可以使用它們來還原您的網域。如需詳細資訊,請參閱下面的還原快照。OpenSearch Service 會將自動快照存放在預先設定的 Simple Storage Service (Amazon S3) 儲存貯體,不另外收取費用。

  • 手動快照適用於叢集復原,或者將資料從一個叢集移至另一個叢集。您必須初始化手動快照。這些快照會存放在您自己的 Simple Storage Service (Amazon S3) 儲存貯體中,而且需支付標準 S3 費用。如果您擁有自我管理 OpenSearch 叢集的快照,您可以使用該快照遷移至 OpenSearch Service 網域。如需詳細資訊,請參閱遷移至 Amazon OpenSearch Service

所有 OpenSearch Service 網域都會建立自動快照,但頻率在下列情況下不同:

  • 對於執行 OpenSearch 或 Elasticsearch 5.3 版和更高版本的網域,OpenSearch Service 會每隔 1 小時自動拍攝快照,且最多可保留其中 336 個快照 (連續保留 14 天)。由於每小時快照的增量改進性質,所以中斷較少。在發生網域問題時,它們還提供較新的復原點。

  • 對於執行 Elasticsearch 5.1 版和舊版的網域,OpenSearch Service 會每隔 1 天自動拍攝快照 (在您指定期間),最多可保留其中 14 個快照,且不會保留任何快照資料超過 30 天。

如果您的叢集進入紅色狀態,所有自動快照都會失敗,而叢集狀態會持續存在。如果您未在兩週內修正該問題,則可能會永久遺失叢集中的資料。如需故障診斷步驟,請參閱紅色叢集狀態

先決條件

若要手動建立快照,您必須使用 IAM 和 Simple Storage Service (Amazon S3)。嘗試拍攝快照之前,請先確認符合以下先決條件:

必要條件 描述
S3 儲存貯體

建立 S3 儲存貯體以儲存 OpenSearch Service 網域的手動快照。如需指示說明,請參閱 Amazon Simple Storage Service 使用者指南中的建立儲存貯體

請記住儲存貯體的名稱以在下列位置使用它:

  • 連接至您 IAM 角色的 IAM 政策的 Resource 陳述式

  • 用於註冊快照儲存庫的 Python 用戶端 (如果您使用此方法)

重要

請勿將 S3 Glacier 生命週期規則套用至此儲存貯體。手動快照不支援 S3 Glacier 儲存類別。

IAM role (IAM 角色)

建立 IAM 角色以將許可委派給 OpenSearch Service。如需說明,請參閱 IAM 使用者指南中的建立 IAM 角色 (主控台)。本章其餘各節稱此角色為 TheSnapshotRole

連接 IAM 政策

將下列政策連接至 TheSnapshotRole 以允許存取 S3 儲存貯體:

{ "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/*" ] } ] }

如需有關將政策連接至角色的說明,請參閱 IAM 使用者指南中的新增 IAM 身分許可

編輯信任關係

編輯 TheSnapshotRole 的信任關係,在 Principal 陳述式中指定 OpenSearch Service,如下例所示:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" }] }

建議您使用 aws:SourceAccountaws:SourceArn 條件金鑰,保護自己免受混淆代理人問題的困擾。來源帳戶是網域的擁有者,且來源 ARN 是網域 ARN。您的網域必須位於服務軟體 R20211203 或更高版本上,才能新增這些條件金鑰。

例如,您可以將下列條件區塊新增至信任政策:

"Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name" } }

如需編輯信任關係的說明,請參閱 IAM 使用者指南中的修改角色信任政策

許可

為了註冊快照儲存庫,您需要能夠將 TheSnapshotRole 傳遞至 OpenSearch Service。您也需要存取 es:ESHttpPut 動作。若要授予這兩個許可,請將下列政策連接至其憑證用於簽署請求的 IAM 使用者或角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

如果您的使用者或角色沒有可傳遞 TheSnapshotRoleiam:PassRole 許可,在下一個步驟嘗試註冊儲存庫時,可能會遇到以下常見錯誤:

$ python register-repo.py {"Message":"User: arn:aws:iam::123456789012:user/MyUserAccount is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/TheSnapshotRole"}

註冊手動快照儲存庫

您需要先使用 OpenSearch Service 來註冊快照儲存庫,才能手動拍攝索引快照。此一次性操作需要您使用可用於存取 TheSnapshotRole 的憑證來簽署 AWS 請求,如 先決條件 中所述。

步驟 1:映射 OpenSearch Dashboards 中的快照角色 (如果使用精細存取控制)

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

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

  2. 從主選單中選擇 Security (安全性)、Roles (角色),然後選取 manage_snapshots 角色。

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

  4. 新增擁有許可能夠傳遞 TheSnapshotRole 之使用者或角色的網域 ARN。將使用者 ARN 放在 Users (使用者) 下,角色 ARN 放在 Backend roles (後端角色) 下。

    arn:aws:iam::123456789123:user/user-name
    arn:aws:iam::123456789123:role/role-name
  5. 選擇 Map (映射),並確認使用者或角色顯示在 Mapped users (已映射的使用者) 中。

步驟 2:註冊儲存庫

若要註冊快照儲存庫,請將 PUT 請求傳送到 OpenSearch Service 網域端點。您不可使用 curl 執行這項操作,因為它不支援 AWS 請求簽名。反而,您應使用範例 Python 用戶端Postman 或其他方式傳送已簽署的請求,以註冊快照儲存庫。

請求採用下列格式:

PUT domain-endpoint/_snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "s3-bucket-name", "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 回應。

加密快照儲存庫

您目前無法使用 AWS Key Management Service (KMS) 金鑰來加密手動快照,但您可以使用伺服器端加密 (SSE) 來保護它們。

若要針對您用作快照儲存庫的儲存貯體啟用具有 S3 管理金鑰的 SSE,可將 "server_side_encryption": true 新增至 PUT 請求的 "settings" 區塊。如需詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南中的使用具有 Simple Storage Service (Amazon S3) 管理的加密金鑰的伺服器端加密保護資料

或者,可以使用您用作快照儲存庫的 S3 儲存貯體上的伺服器端加密的 AWS KMS 金鑰。如果您使用這種方法,請確認對用於加密 S3 儲存貯體的 AWS KMS 金鑰提供 TheSnapshotRole 許可。如需詳細資訊,請參閱 AWS KMS 中的金鑰政策

將資料遷移至不同網域

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

因為其他原因,遷移至新網域或註冊具有多個網域的相同儲存庫時,請考慮下列準則:

  • 在新網域上註冊儲存庫時,請將 "readonly": true 新增至 PUT 請求的 "settings" 區塊。此設定可防止您意外地從舊網域中覆寫資料。

  • 如果您正在將資料遷移到不同區域的網域 (例如,從位於 us-east-2 的舊網域和儲存貯體遷移至 us-west-2 中的新網域),則在傳送 PUT 請求時可能會看到此 500 錯誤:

    The bucket is in this region: us-east-2. Please use this region to retry the request.

    如果您遇到此錯誤,請嘗試在 PUT 陳述式中將 "region": "us-east-2" 取代為 "endpoint": "s3.amazonaws.com",然後重試請求。

使用 Python 用戶端範例

Python 用戶端比簡單的 HTTP 請求更容易自動化,並且具有更好的可重複使用性。如果您選擇使用此方法來註冊快照儲存庫,請將下列範例 Python 程式碼儲存為 Python 檔案,例如 register-repo.py。用戶端需要 AWS SDK for Python (Boto3)請求requests-aws4auth 套件。用戶端包含其他快照操作的註解範例。

提示

以 Java 為基礎的程式碼範例,請參閱簽署 HTTP 請求

更新範本程式碼中的下列變數:hostregionpath 以及 payload

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # include https:// and trailing / 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", "region": "us-west-1", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } } 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", # "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)

手動拍攝快照

快照不是即時的。它們需要一些時間才能完成,並不確切代表叢集在各個時間點的狀態。當快照仍在進行中,您還是可以對文件編製索引並對叢集發出其他請求,但新文件以及對現有文件的更新一般不包括在快照中。快照包含當 OpenSearch 啟動快照時既已存在的主要碎片。視快照執行緒集區的大小而定,快照中可能附有相距些許時間差的不同碎片。

快照儲存與效能

OpenSearch 快照是增量式的,這表示它們只會存放自從上次成功快照之後有所變更的資料。這種增量性質表示頻率高和頻率低的快照之間的磁碟用量差異通常很小。換言之,每小時拍攝快照長達一週 (總共 168 個快照),可能不會比在週末拍攝單一快照使用更多的磁碟空間。此外,您拍攝快照的頻率越高,完成快照所需的時間越少。例如,每日快照可能需要 20-30 分鐘才能完成,而每小時快照可能在幾分鐘內即可完成。有些 OpenSearch 使用者建立快照的頻率高達半小時一次。

建立快照

建立快照時可以指定以下資訊:

  • 快照儲存庫的名稱

  • 快照的名稱

為了方便和簡潔,本章中的範例使用 Curl 這個常見的 HTTP 用戶端。但是,如果您的存取政策指定 IAM 使用者或角色,您必須註冊您的快照請求。您可以使用範例 Python 用戶端中的註解範例,對於 Curl 命令使用的相同端點提出已簽署 HTTP 請求。

若要建立手動快照,請執行下列步驟:

  1. 如果快照正在進行中,您就無法取得快照。若要檢查,請執行下列命令:

    curl -XGET 'domain-endpoint/_snapshot/_status'
  2. 執行以下命令來手動拍攝快照:

    curl -XPUT 'domain-endpoint/_snapshot/repository-name/snapshot-name'
注意

拍攝快照所需的時間隨著 OpenSearch Service 網域的大小而增加。長時間執行的快照操作有時會發生以下錯誤:504 GATEWAY_TIMEOUT。一般而言,您可以忽略這些錯誤,並等待操作成功完成。執行下列命令來驗證您網域的所有快照狀態:

curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'

還原快照

警告

如果您使用索引別名,請先停止寫入請求至別名,或交換別名到另一個索引,然後再刪除其索引。停止寫入請求有助於避免以下情況:

  1. 刪除索引也會刪除它的別名。

  2. 錯誤的寫入請求至現已刪除的別名,會使用和別名相同的名稱建立新索引。

  3. 因與新索引有命名衝突之故,您不可再使用別名。

當您從快照還原,如果您交換別名到另一個索引,此時請指定"include_aliases": false

若要還原快照,請執行下列步驟:

  1. 找到您要還原的快照。若要查看所有快照儲存庫,請執行下列命令:

    curl -XGET 'domain-endpoint/_snapshot?pretty'

    在識別儲存庫後,請執行下列命令以查看所有快照:

    curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'
    注意

    大多數自動快照存放在 cs-automated 儲存庫中。如果您的網域加密靜態資料,會將它們存放在 cs-automated-enc 儲存庫中。如果未看到您尋找的手動快照儲存庫,請確定您已將它註冊到網域。

  2. (選用) 如果叢集上的索引與快照中的索引存在命名衝突,可以刪除或重新命名 OpenSearch Service 網域中的一個或多個索引。您無法將索引的快照還原到已經包含具相同名稱之索引的 OpenSearch 叢集。

    如果您有索引命名衝突,則具有下列選項:

    下列命令會刪除網域中的所有現有索引:

    curl -XDELETE 'domain-endpoint/_all'

    但是,如果您不打算還原所有索引,您只可以刪除一個索引:

    curl -XDELETE 'domain-endpoint/index-name'
  3. 若要還原快照,請執行以下命令:

    curl -XPOST 'domain-endpoint/_snapshot/repository-name/snapshot-name/_restore'

    由於 OpenSearch Dashboards 的特殊許可和精細存取控制索引,嘗試還原所有索引可能會失敗,尤其是當您嘗試從自動快照還原時。以下範例只從 my-index 快照儲存庫中的 2020-snapshot 還原一個索引 cs-automated

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'

    或者,您可能想要還原所有索引,Dashboards 和精細存取控制索引除外

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "-.kibana*,-.opendistro*"}' -H 'Content-Type: application/json'
注意

如果不是所有涉及的索引都有主要碎片,快照可能一個 statePARTIAL。此值表示至少一個碎片的資料未成功儲存。您仍然可以從部分快照還原,但您可能需要使用舊版的快照來還原任何遺失的索引。

刪除手動快照

若要刪除手動快照,請執行以下命令:

DELETE _snapshot/repository-name/snapshot-name

使用索引狀態管理自動化快照

您可以使用索引狀態管理 (ISM) snapshot 操作,根據索引的使用期限、大小或文件數量的變化,自動觸發索引快照。如需使用 snapshot 操作的範例 ISM 政策,請參閱範例政策

使用 Curator 進行快照

如果 ISM 不適用於索引和快照管理,您可以改用 Curator。其提供進階篩選功能,可協助簡化複雜叢集的管理任務。使用 pip 安裝 Curator。

pip install elasticsearch-curator

您可以使用 Curator 做為命令列界面 (CLI) 或 Python API。如果您使用 Python API,則必須使用版本 7.13.4 或更早版本的舊版 elasticsearch-py 用戶端。不支援 opensearch-py 用戶端。

如果您使用 CLI,在命令列匯出您的登入資料,並且設定 curator.yml,如下所示:

client: hosts: search-my-domain.us-west-1.es.amazonaws.com port: 443 use_ssl: True aws_region: us-west-1 aws_sign_request: True ssl_no_validate: False timeout: 60 logging: loglevel: INFO