Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
在桶之间设置复制时,为什么我的 Amazon S3 对象不复制?
我在 Amazon Simple Storage Service(Amazon S3)桶之间设置了跨区域复制(CRR)或同区域复制(SRR)。但是,对象无法复制到目标桶。
解决方法
要解决 S3 对象不复制到目标桶的问题,请检查桶的各种不同类型的权限。此外,请检查公共访问权限设置和存储桶所有权设置。
提示:
- 每次配置更改后,请将对象上传到源存储桶,以测试复制。最佳做法是每次更改一个配置,以确定是否存在复制设置问题。
- 针对复制失败激活 s3:Replication:OperationFailedReplication 事件类型通知。错误代码可能有助于您确定失败的原因。
解决了导致复制失败的问题后,源存储桶中可能存在未复制的对象。默认情况下,S3 复制不复制现有对象或复制状态为 FAILED 或 REPLICA 的对象。要检查对象的复制状态,请参阅如何查看从一个 Amazon S3 存储桶复制到另一个 Amazon S3 存储桶失败的对象?使用 S3 批量复制来复制这些对象。
授予 Amazon S3 的最低权限
确认您在复制规则中使用的 AWS Identity Access Management (IAM) 角色具有正确的权限。如果源存储桶和目标存储桶位于不同的 AWS 账户,请确认目标账户的存储桶策略向复制角色授予了足够的权限。
以下示例 IAM 策略具有复制所需的最低权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::SourceBucket" ] }, { "Effect": "Allow", "Action": [ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::SourceBucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ReplicateObject", "s3:ReplicateTags" ], "Resource": "arn:aws:s3:::DestinationBucket/*" } ] }
**注意:**请将 SourceBucket 和 DestinationBucket 替换为您的 S3 存储桶的名称。
根据复制规则选项,您可能需要授予其他权限。
IAM 角色必须具有允许 Amazon S3 代入该角色来复制对象的信任策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
授予其他 Amazon S3 权限
如果将复制规则设置为将对象所有权更改为目标存储桶拥有者,则 IAM 角色必须具有 s3:ObjectOwnerOverrideToBucketOwner 权限。对 S3 对象资源授予权限:
{ "Effect": "Allow", "Action": [ "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
目标账户还必须在存储桶策略中授予 s3:ObjectOwnerOverrideToBucketOwner 权限:
{ "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
注意:如果目标存储桶的对象所有权为强制存储桶拥有者,则无需在复制规则中设置将对象所有权更改为目标存储桶拥有者。默认情况下,会发生此更改。
如果您在复制规则上激活了删除标记复制,则 IAM 角色必须具有 s3:ReplicateDelete 权限:
{ "Effect": "Allow", "Action": [ "s3:ReplicateDelete" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
如果目标存储桶位于其他账户中,则目标存储桶拥有者还必须在存储桶策略中授予此权限:
{ "Version": "2012-10-17", "Id": "PolicyForDestinationBucket", "Statement": [ { "Sid": "Stmt1644945277847", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "s3:ReplicateObject", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner", "s3:ReplicateDelete" ], "Resource": "arn:aws:s3:::DestinationBucket/*" } ] }
**注意:**请将 arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role 替换为您的复制角色的 ARN。请将 DestinationBucket 替换为您的 S3 存储桶的名称。
授予 AWS KMS 权限
如果您使用 AWS Key Management Service (AWS KMS) 密钥对存储桶的源对象进行加密,则复制规则必须包含 AWS KMS 加密的对象。
完成以下步骤:
- 打开 Amazon S3 控制台。
- 选择包含源对象的 S3 存储桶。
- 在 Management(管理)选项卡上,选择复制规则。
- 选择 Edit(编辑)。
- 在 Encryption(加密)下,选择 Replicate objects encrypted with AWS KMS(复制使用 AWS KMS 加密的对象)。
- 在 AWS KMS key for encrypting destination objects(用于加密目标对象的 AWS KMS 密钥)下,选择 AWS KMS 密钥。默认选项是使用 AWS KMS 密钥 (aws/S3)。
有关详细信息,请参阅示例策略:将 SSE-S3 和 SSE-KMS 与复制结合使用。
**重要事项:**如果目标存储桶位于其他账户中,请指定目标账户拥有的 AWS KMS 客户自主管理型密钥。默认 aws/S3 密钥使用源账户拥有的 AWS 托管式密钥加密对象。由于您无法与其他账户共享 AWS 托管式密钥,因此目标账户无法访问目标存储桶中的对象。
针对跨账户场景授予额外的 AWS KMS 权限
要使用目标账户的 AWS KMS 密钥加密目标对象,目标账户必须在密钥策略中授予复制角色:
{ "Sid": "AllowS3ReplicationSourceRoleToUseTheKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": "*" }
注意:如果您对 AWS KMS 密钥策略中的资源使用星号 (*),则该策略仅向复制角色授予权限。该策略不允许复制角色扩展其权限。
此外,您必须从源账户向复制角色的 IAM 策略添加以下最低权限:
[ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "SourceKmsKeyArn" ] }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": [ "DestinationKmsKeyArn" ] } ]
默认情况下,AWS KMS 密钥策略向根用户授予对密钥的完全权限。您可以将这些权限委托给同一账户中的其他用户。您还可以使用 IAM 策略向复制角色授予源 KMS 密钥的权限。除非源 KMS 密钥策略中有拒绝语句,否则这就足够了。
检查是否存在显式拒绝语句和有条件允许语句
如果在验证权限后,您的对象仍无法复制,请检查是否存在可能导致复制失败的显式拒绝语句。
删除目标存储桶策略或 AWS KMS 密钥策略中限制访问以下内容的拒绝语句:
- 特定的 CIDR 范围
- 虚拟私有云 (VPC) 端点
- S3 接入点
删除附加到 IAM 角色的拒绝语句或权限边界。此外,删除附加到源账户或目标账户的 AWS Organizations 服务控制策略 (SCP) 中的拒绝语句。
**提示:**在删除任何显式拒绝语句之前,请确认拒绝的原因。此外,请确定该语句是否会影响数据安全。
检查是否存在 Amazon S3 存储桶密钥
如果源或目标 KMS 密钥根据加密上下文授予权限,请检查是否使用了 S3 存储桶密钥。如果存储桶使用存储桶密钥,则加密上下文必须针对存储桶级资源:
"kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::SOURCE_BUCKET_NAME" ] "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::DESTINATION_BUCKET_NAME" ]
**注意:**请将 SOURCE_BUCKET_NAME 和 DESTINATION_BUCKET_NAME 替换为您的源存储桶和目标存储桶的名称。
如果源存储桶或目标存储桶没有使用存储桶密钥,则加密上下文必须针对对象级资源:
"kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::SOURCE_BUCKET_NAME/*" ] "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::DESTINATION_BUCKET_NAME/*" ]
**注意:**请将 SOURCE_BUCKET_NAME 和 DESTINATION_BUCKET_NAME 替换为您的源存储桶和目标存储桶的名称。
检查是否存在对象 ACL 和屏蔽公共访问权限
检查源存储桶和目标存储桶是否使用访问控制列表 (ACL)。如果对象包含允许公共访问的 ACL,但目标存储桶使用屏蔽公共访问权限,则复制将失败。
确认源对象所有权
如果其他账户上传了源存储桶中的对象,则源账户可能没有访问这些对象的权限。检查源存储桶以确定 ACL 是否已停用。
如果源存储桶上已停用 ACL,则源账户是该存储桶中所有对象的拥有者。如果源存储桶上未停用 ACL,请检查对象所有权是设置为 Object owner preferred(首选对象拥有者)还是 Bucket owner preferred(首选存储桶拥有者)。如果所有权设置为 Bucket owner preferred(首选存储桶拥有者),则源存储桶对象必须具有 bucket-owner-full-control ACL 权限。
源账户可以通过停用 ACL 来获得其存储桶中所有对象的所有权。大多数用例不需要使用 ACL 来管理访问权限。最佳做法是使用 IAM 和存储桶策略来管理对 S3 资源的访问。要停用 S3 存储桶上的 ACL,请参阅为您的存储桶控制对象所有权和禁用 ACL。您的存储桶和 IAM 策略必须授予足够的权限,以便在停用 ACL 时不会影响 Amazon S3 访问。
指定正确的复制规则筛选条件
确保您正确指定了复制规则筛选条件。
如果您指定的规则筛选条件是密钥前缀和对象标签的组合,则 S3 会执行逻辑 AND 操作来合并这些筛选条件。该规则将适用于具有特定密钥前缀和特定标签的对象子集。