对复制进行问题排查 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对复制进行问题排查

本节列出了 Amazon S3 复制的问题排查提示以及有关 S3 批量复制错误的信息。

S3 复制问题排查提示

如果在您配置复制之后,对象副本未出现在目标桶中,请使用以下问题排查提示确定并修复问题。

  • 大多数对象会在 15 分钟内复制。Amazon S3 复制对象所需的时间取决于多个因素,包括源和目标区域对,以及对象的大小。对于大型对象,复制可能需要几个小时。要想了解复制时间,您可以使用 S3 Replication Time Control(S3 RTC)

    如果要复制的对象较大,请稍候片刻,然后再检查它是否出现在目标桶中。还可以检查源对象的复制状态。如果对象复制状态为 PENDING,表示 Amazon S3 尚未完成复制。如果对象复制状态为 FAILED,请检查对源桶设置的复制配置。此外,要在复制期间接收有关失败的信息,您可以设置 Amazon S3 事件通知来接收复制失败事件。有关更多信息,请参阅使用 Amazon S3 事件通知接收复制失败事件

  • 您可以调用 HeadObject API 操作来检查对象的复制状态。HeadObject API 操作返回对象的 PENDINGCOMPLETEDFAILED 复制状态。在对 HeadObject API 调用的响应中,复制状态将在 x-amz-replication-status 元素中返回。

    注意

    要运行 HeadObject,您必须对您请求的对象拥有读取权限。HEAD 请求与 GET 请求具有相同的选项,无需执行 GET 操作。例如,要使用 Amazon Command Line Interface(Amazon CLI)运行 HeadObject 请求,可以运行以下命令。将 user input placeholders 替换为您自己的信息。

    aws s3api head-object --bucket my-bucket --key index.html
  • HeadObject 返回具有 FAILED 复制状态的对象后,您可以使用 S3 批量复制来复制这些失败的对象。或者,您可以将失败的对象重新上传到源桶,这将启动新对象的复制。

  • 在源桶上的复制配置中,验证以下几点:

    • 目标存储桶的 Amazon 资源名称 (ARN) 是否正确。

    • 键名前缀是否正确。例如,如果将配置设置为复制具有前缀 Tax 的对象,则仅复制具有 Tax/document1Tax/document2 等键名的对象。不会复制具有键名 document3 的对象。

    • 复制规则的状态为 Enabled

  • 在复制配置中验证没有在任何桶上暂停版本控制。源桶和目标桶必须均已启用版本控制。

  • 如果将复制规则设置为将对象所有权更改为目标桶拥有者,则用于复制的 Amazon Identity and Access Management(IAM)角色必须具有 s3:ObjectOwnerOverrideToBucketOwner 权限。此权限是对资源(在本例中为目标桶)授予的。例如,以下 Resource 语句显示如何授予对目标桶的这一权限:

    { "Effect":"Allow", "Action":[ "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource":"arn:aws:s3:::DestinationBucket/*" }
  • 如果目标桶由另一个账户拥有,则目标桶的拥有者还必须通过目标桶策略向源桶拥有者授予 s3:ObjectOwnerOverrideToBucketOwner 权限。要使用以下示例桶策略,请将 user input placeholders 替换为您自己的信息:

    { "Version": "2012-10-17", "Id": "Policy1644945280205", "Statement": [ { "Sid": "Stmt1644945277847", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789101:role/s3-replication-role" }, "Action": [ "s3:ReplicateObject", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::DestinationBucket/*" } ] }
    注意

    如果目标桶的对象所有权设置包括强制桶拥有者,则无需在复制规则中将此设置更新为将对象所有权更改为目标桶拥有者。原定设置情况下,对象所有权将发生变化。有关更改副本所有权的更多信息,请参阅更改副本所有权

  • 如果您要在跨账户方案(即源桶和目标桶由不同的 Amazon Web Services 账户拥有)中设置复制配置,则目标桶无法配置为申请方付款桶。有关更多信息,请参阅使用申请方付款存储桶进行存储传输和使用

  • 如果桶的源对象使用 Amazon Key Management Service(Amazon KMS)密钥进行加密,则必须将复制规则配置为包含 Amazon KMS 加密的对象。确保在 Amazon S3 控制台中的加密设置下选择复制使用 Amazon KMS 加密的对象。然后,选择用于加密目标对象的 Amazon KMS 密钥。

    注意

    如果目标桶位于其他账户中,请指定目标账户拥有的 Amazon KMS 客户自主管理型密钥。不要使用原定设置的 Amazon S3 托管式密钥(aws/s3)。使用原定设置密钥会使用由源账户拥有的 Amazon S3 托管式密钥加密对象,从而防止与其他账户共享对象。因此,目标账户将无法访问目标桶中的对象。

    要使用属于目标账户的 Amazon KMS 密钥加密目标对象,目标账户必须在 KMS 密钥策略中向复制角色授予 kms:GenerateDataKeykms:Encrypt 权限。要在 KMS 密钥策略中使用以下示例语句,请将 user input placeholders 替换为您自己的信息:

    { "Sid": "AllowS3ReplicationSourceRoleToUseTheKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789101:role/s3-replication-role" }, "Action": ["kms:GenerateDataKey", "kms:Encrypt"], "Resource": "*" }

    如果您在 Amazon KMS 密钥策略中的 Resource 语句中使用星号(*),则该策略将使用 KMS 密钥的权限仅授予复制角色。该策略不允许复制角色提升其权限。

    原定设置情况下,KMS 密钥策略向根用户授予对密钥的完全权限。这些权限可以委派给同一账户中的其他用户。除非源 KMS 密钥策略中具有 Deny 语句,否则,使用 IAM policy 向复制角色授予对源 KMS 密钥的权限就足够了。

    注意

    将访问限制到特定 CIDR 范围、VPC 端点或 S3 接入点的 KMS 密钥策略可能会导致复制失败。

    如果源或目标 KMS 密钥根据加密上下文授予权限,请确认对于桶开启了 Amazon S3 桶密钥。如果桶已开启了 S3 桶密钥,则加密上下文必须是桶级资源,如下所示:

    "kms:EncryptionContext:arn:aws:arn": [ "arn:aws:s3:::SOURCE_BUCKET_NAME" ] "kms:EncryptionContext:arn:aws:arn": [ "arn:aws:s3:::DESTINATION_BUCKET_NAME" ]

    除了 KMS 密钥策略授予的权限外,源账户还必须向复制角色的 IAM policy 添加以下最低权限:

    { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "SourceKmsKeyArn" ] }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": [ "DestinationKmsKeyArn" ] }

    有关如何复制使用 Amazon KMS 加密的对象的更多信息,请参阅复制加密的对象

  • 如果目标桶由另一个 Amazon Web Services 账户拥有,请验证桶拥有者是否对目标桶设置了允许源桶拥有者复制对象的桶策略。有关示例,请参阅当源存储桶和目标存储桶由不同账户拥有时配置复制

  • 如果在验证权限后您的对象仍无法复制,请检查以下位置是否存在任何显式 Deny 语句:

    • 源或目标桶策略中的 Deny 语句。如果桶策略拒绝针对以下任一操作访问复制角色,则复制将失败:

      源桶:

      "s3:GetReplicationConfiguration", "s3:ListBucket", "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging"

      目标桶:

      "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags"
    • 附加到 IAM 角色的 Deny 语句或权限边界可能导致复制失败。

    • 附加到源账户或目标账户的 Amazon Organizations 服务控制策略中的 Deny 语句可能导致复制失败。

  • 如果对象副本未出现在目标桶中,以下问题可能会禁止复制:

    • 若源桶中的某对象是另一个复制配置所创建的副本,Amazon S3 不会复制该对象。例如,如果您设置从桶 A 到桶 B 再到桶 C 的复制配置,则 Amazon S3 不会将桶 B 中的对象副本复制到桶 C。

    • 源桶拥有者可以向其他 Amazon Web Services 账户授予上载对象的权限。默认情况下,源桶拥有者对于其他账户创建的对象没有权限。复制配置仅复制源桶拥有者对其具有访问权限的对象。源桶拥有者可以向其他 Amazon Web Services 账户授予有条件地创建对象的权限,从而要求针对这些对象的显式访问权限。有关策略示例,请参阅在授予上传对象的跨账户权限的同时,确保存储桶拥有者拥有完全控制权

  • 假设在复制配置中,您添加了一个规则以复制具有特定标签的对象子集。在这种情况下,您必须在创建对象时分配特定的标签键和值,以供 Amazon S3 复制对象。如果您先创建对象,然后向现有对象添加标签,Amazon S3 将不会复制对象。

  • 可使用 Amazon S3 事件通知,在对象未复制到其目标 Amazon Web Services 区域的情况下收到通知。Amazon S3 事件通知可以通过 Amazon Simple Queue Service(Amazon SQS)、Amazon Simple Notification Service(Amazon SNS)或 Amazon Lambda 获得。有关更多信息,请参阅使用 Amazon S3 事件通知接收复制失败事件

    您还可以使用 Amazon S3 事件通知查看复制失败原因。要查看失败原因的列表,请参阅 Amazon S3 复制失败原因

批量复制错误

要对未复制到目标桶的对象进行问题排查,请检查您的桶、复制角色和用于创建批量复制任务的 IAM 角色的不同权限类型。此外,请务必检查公共访问设置和桶所有权设置。

当使用批量复制时,可能会遇到以下错误之一:

  • 批量操作状态为失败,原因是:无法将任务报告写入报告桶。

    如果用于批量操作任务的 IAM 角色无法将完成报告放到您创建任务时指定的位置,则会出现此错误。要解决此错误,请检查 IAM 角色是否对您要保存批量操作完成报告的桶具有 PutObject 权限。最佳实践是将报告提交到与源桶不同的桶中。

  • 批量操作已完成但出现失败,并且失败总数不是 0。

    如果正在运行的批量复制任务存在对象权限不足问题,则会出现此错误。如果您对批量复制任务使用复制规则,请确保用于复制的 IAM 角色具有访问源桶或目标桶中的对象的适当权限。也可以检查批量复制完成报告,以查看特定的 Amazon S3 复制失败原因

  • 批量任务成功运行,但目标桶中预期的对象数量不相同。

    当批量复制任务中提供的清单中列出的对象与您在创建任务时选择的筛选条件不匹配时,就会出现此错误。当源桶中的对象与任何复制规则不匹配且未包含在生成的清单中时,您也可能会收到此消息。