如何解决我的 Amazon OpenSearch Service 集群中的手动快照错误?

上次更新日期:2021 年 9 月 1 日

我想还原我 Amazon OpenSearch Service(Amazon Elasticsearch Service 的后继者)集群的手动快照。但在我尝试注册存储库或访问已注册的存储库时,我遇到了错误。为什么会出现这种情况,我该怎样解决呢?

简短描述

要在 OpenSearch Service 中成功迁移手动快照中的数据,您需要执行以下步骤:

1.    选择要用于存储快照的 Amazon Simple Storage Service (Amazon S3) 存储桶。

2.    将此 Amazon S3 存储桶注册到 OpenSearch Service 源集群。

3.    拍摄 OpenSearch Service 源集群的快照,然后将其存储在您的 Amazon S3 bucket中。

4.    将同一 Amazon S3 存储桶注册到您的目标集群,以确保您可以查看该手动快照。

5.    在 OpenSearch Service 中的目标集群上还原手动快照。

否则,您可能会遇到下列错误中的一种:

  • 403 未授权错误
  • repository_missing_exception
  • concurrent_snapshot_execution_exception
  • snapshot_restore_exception
  • a_w_s_security_token_service_exception
  • 快照状态为“PARTIAL”
  • Amazon S3 Glacier 存储类问题

解决方法

403 未授权错误

如果您在 OpenSearch Service 域上启用了精细访问控制 (FGAC),则可能会在拍摄快照时收到以下错误消息:

{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::012345678912:user/username, backend_roles=[], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::012345678912:user/username, backend_roles=[], requestedTenant=null]"},"status":403}

要解决 403 Unauthorized(403 未授权)错误,请务必在拍摄手动快照时指定 username:password 参数:

curl -XPUT -u username:password123$ 'opensearch-domain-endpoint/_snapshot/snapshot-repository-name/snapshot-name'

注意:您必须是超级用户才能为 OpenSearch Service 域启用精细访问控制。您可以使用超级用户名和密码,也可以将某个 AWS Identity Access Management (IAM) 角色设置为超级用户。在访问您的集群快照时,您需要指定超级用户凭证或 IAM 角色。如果您指定了某个 IAM 角色,该 IAM 角色必须使用 sigv4 对 HTTP 请求进行签名。有关使用精细访问控制和 IAM 角色的更多信息,请参阅创建和管理 Amazon OpenSearch Service 域

您还必须将一个快照存储库注册到您的快照,然后将 manage_snapshots 角色映射到某个 IAM 角色。manage_snapshots 角色必须具有适当的权限 (IAM:PassRole) 以代入该 IAM 角色 (TheSnapshotRole)。有关详细信息,请参阅手动快照先决条件

要将 manage_snapshots 角色映射到某个 IAM 角色,请执行以下步骤:

1.    打开 OpenSearch 控制面板控制台。

2.    以主用户身份登录。

3.    选择 Security(安全性)。

4.    选择 Roles(角色)。

5.    选择 manage_snapshots 作为您的角色。

6.    选择 Mapped users(映射的用户)。

7.    选择 Manage mapping(管理映射)。

8.    在 Users(用户)下,添加您的用户 ARN(例如:“arn:aws:iam::012345678912:user/username”)。

9.    注册手动快照存储库

Repository_missing_exception

在拍摄手动索引快照之前,您必须向 OpenSearch Service 注册一个手动快照存储库。此外还必须设置您的 IAM 角色 (TheSnapshotRole) 以与 Amazon S3 配合使用。

如果您在拍摄手动快照之前没有注册快照存储库,或者使用的存储库名称不正确,则会收到以下错误消息:

{"error":{"root_cause":[{"type":"repository_missing_exception","reason":"[snapshot-repository-name] missing"}],"type":"repository_missing_exception","reason":"[snapshot-repository-name] missing"},"status":404}

要解决此错误,请确保您满足手动快照先决条件。此外,请检查存储库名称中是否存在拼写错误。

Concurrent_snapshot_execution_exception

如果当前正在拍摄某个快照,则在尝试拍摄其他快照时会收到以下错误消息:

The below error “concurrent_snapshot_execution_exception” means that a snapshot is already in progress
{"error":{"root_cause":[{"type":"concurrent_snapshot_execution_exception","reason":"[snapshot-repository-name:snapshot-name] a snapshot is already running"}],"type":"concurrent_snapshot_execution_exception","reason":"[snapshot-repository-name:snapshot-name] a snapshot is already running"}

要检查是否正在拍摄其他快照,请运行以下命令:

curl -XGET 'opensearch-domain-endpoint/_snapshot/_status'

如果系统已经在拍摄某个快照,请等待当前快照完成拍摄。如果您怀疑快照处于卡滞状态,则检查每小时的快照历史记录。有关更多信息,请参阅为什么我无法删除索引或升级我的 Amazon OpenSearch Service 集群?

Snapshot_restore_exception

如果您尝试将数据从本地集群迁移到 OpenSearch Service 域,则可能会遇到以下异常:

{
  "error": {
    "root_cause": [
      {
        "type": "snapshot_restore_exception",
        "reason": "[manual-snapshot-repo:my-manual-snapshot1/HPOcIJryTj6a6GJvyP79bw] the snapshot was created with Elasticsearch version [6.8.0] which is higher than the version of this node [6.7.0]"
      }
    ],
    "type": "snapshot_restore_exception",
    "reason": "[manual-snapshot-repo:my-manual-snapshot1/HPOcIJryTj6a6GJvyP79bw] the snapshot was created with Elasticsearch version [6.8.0] which is higher than the version of this node [6.7.0]"
  },
  "status": 500
}

如果在现有集群上拍摄的快照运行的 Elasticsearch 版本与 OpenSearch Service 不同,则会收到此错误消息。如果您的集群运行的 Elasticsearch 版本早于 OpenSearch Service,请考虑升级 Elasticsearch 版本。您也可使用 remote reindex(远程重建索引)API 来迁移索引。

a_w_s_security_token_service_exception

如果与您的手动快照关联的 IAM 角色没有为“es.amazonaws.com”建立信任关系,则您会遇到以下异常:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "repository_exception",
        "reason" : "[es_01082021_repo] Could not determine repository generation from root blobs"
      }
    ],
    "type" : "repository_exception",
    "reason" : "[es_01082021_repo] Could not determine repository generation from root blobs",
    "caused_by" : {
      "type" : "i_o_exception",
      "reason" : "Exception when listing blobs by prefix [index-]",
      "caused_by" : {
        "type" : "a_w_s_security_token_service_exception",
        "reason" : "a_w_s_security_token_service_exception: User: arn:aws:sts::332315457451:assumed-role/cp-sts-grant-role/swift-us-west-2-prod-679203657591 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::679203657591:role/ES_Backup_Role (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 36d09b93-d94f-457e-8fa5-b0a50ba436c3)"
      }
    }
  },
  "status" : 500
}

使用 OpenSearch Service 快照时,系统会创建一个内部角色(例如 arn:aws:sts::332315457451:assumed-role/cp-sts-grant-role/swift-us-west-2-prod-679203657591)。此内部角色会代入与手动快照关联的 IAM 角色,然后执行任何必需的操作。

要解决安全令牌异常,请务必指定与手动快照关联的 IAM 角色。如果您没有与手动快照关联的 IAM 角色,则必须创建一个角色。有关详细信息,请参阅手动快照先决条件

此外,请检查与手动快照关联的 IAM 角色的信任关系。该角色的信任关系必须在 Principal 语句中指定 OpenSearch Service,如下所示:

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

快照状态为 PARTIAL

快照会因下列原因进入“PARTIAL”(部分)状态:

如果快照处于“部分”状态,表示无法存储来自某个分片的数据。您仍然可以从部分快照还原数据,但必须使用更早的快照来还原所有缺失的索引。要检查您的集群是否已进入“PARTIAL”(部分)状态,请检查快照历史记录。有关更多信息,请参阅还原快照

Amazon S3 Glacier 存储类问题

如果您要将还原后的快照存储在 Amazon Simple Storage Service Glacier Storage 存储类中,请不要对该存储桶应用 Amazon S3 Glacier 生命周期规则。手动快照不支持 Amazon S3 Glacier 存储类。因此,如果您对该 S3 存储桶应用 Amazon S3 Glacier 生命周期策略,则必须移回任何已经转移的对象。

将对象移回 Amazon S3 标准存储类后,您可以从这些快照还原对象。有关详细信息,请参阅手动快照先决条件