如何解决我的 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 标准存储类后,您可以从这些快照还原对象。有关更多信息,请参阅手动快照先决条件。