Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
在桶之间设置复制时,为什么我的 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 操作来合并这些筛选条件。该规则将适用于具有特定密钥前缀和特定标签的对象子集。
相关信息
相关内容
- 已提问 2 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前