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

上次更新日期:2022 年 5 月 12 日

我想还原我的 Amazon OpenSearch 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 'opensearch-domain-endpoint/_snapshot/snapshot-repository-name/snapshot-name'

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

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

{
    "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'

如果系统已经在拍摄某个快照,请等待当前快照完成拍摄。或者,如果您怀疑快照处于卡滞状态,则检查每小时的快照历史记录。有关更多信息,请参阅为什么我无法删除索引或升级我的 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 S3 Glacier 存储类中,请不要对该存储桶应用 Amazon S3 Glacier 生命周期规则。手动快照不支持 Amazon S3 Glacier 存储类。因此,如果您对该 S3 存储桶应用 Amazon S3 Glacier 生命周期策略,则必须移回任何已经转移的对象。

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