Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

如何设置跨区域复制

要设置跨区域复制,需要两个存储桶—源和目标。这两个存储桶必须启用版本控制,并且处于不同的 AWS 区域。有关可以在其中创建存储桶的 AWS 区域的列表,请参阅 AWS General Reference 中的区域和终端节点

重要

如果您在不受版本控制的存储桶中具有对象到期生命周期策略,并且希望在启用版本控制时保持相同的永久删除行为,则必须添加非当前版本到期策略。非当前版本到期生命周期策略将管理在受版本控制的存储桶中删除非当前对象版本的行为。(启用版本控制的存储桶会维护一个当前对象版本,以及零个或零个以上非当前对象版本。)有关更多信息,请参阅如何为 S3 存储桶创建生命周期策略? (在 Amazon Simple Storage Service 控制台用户指南 中)。

源存储桶中的对象只能复制到一个目标存储桶。如果这两个存储桶由同一个 AWS 账户拥有,则可以通过执行以下操作设置从源存储桶到目标存储桶的跨区域复制:

  • 创建一个 IAM 角色以向 Amazon S3 授予代表您复制对象的权限。

  • 对源存储桶添加复制配置。

此外,如果源存储桶和目标存储桶由两个不同的 AWS 账户拥有,则目标存储桶拥有者还必须添加一个存储桶策略,以向源存储桶拥有者授予执行复制操作的权限。

创建 IAM 角色

默认情况下,所有 Amazon S3 资源 (存储桶、对象和相关子资源) 都是私有的:只有资源拥有者可以访问资源。因此,Amazon S3 需要从源存储桶读取对象以及将它们复制到目标存储桶的权限。您可以通过创建 IAM 角色授予这些权限。创建 IAM 角色时,需挂载以下角色策略:

  • 一个信任策略,您在其中信任 Amazon S3 代入角色,如下所示:

    Copy
    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }

    注意

    策略中的 Principal 标识 Amazon S3。有关 IAM 角色的更多信息,请参阅 IAM 用户指南 中的 IAM 角色

  • 一个访问策略,您在其中向角色授予代表您执行复制任务的权限。下面的访问策略授予以下权限:

    • 源存储桶上的 s3:GetReplicationConfigurations3:ListBucket 权限,以便 Amazon S3 可以检索复制配置和列出存储桶 (当前权限模型需要 s3:ListBucket 权限来访问删除标记)。

    • 启用了版本控制的源存储桶中所有对象上的 s3:GetObjectVersions3:GetObjectVersionAcl 权限。这允许 Amazon S3 获取特定对象版本和其中的 ACL。

    • 目标存储桶中对象上的 s3:ReplicateObjects3:ReplicateDelete 权限,以便 Amazon S3 可以从目标存储桶复制对象或删除标记。有关删除标记的信息,请参阅删除操作和跨区域复制

    • s3:GetObjectVersionTagging 权限允许 S3 读取对象标签以进行复制 (请参阅对象标签)。如果 S3 未获得此权限,则 S3 将复制对象而不是对象标签。

    有关 Amazon S3 操作的列表,请参阅在策略中指定权限

    Copy
    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource":[ "arn:aws-cn:s3:::source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource":[ "arn:aws-cn:s3:::source-bucket/*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags" ], "Resource":"arn:aws-cn:s3:::destination-bucket/*" } ] }

    s3:ReplicateObject 操作的权限也允许复制对象标签。因此,如果对目标存储桶上的 s3:ReplicateObject 授予权限,则 S3 也将复制对象标签 (您无需显式授予 s3:ReplicateTags 操作的权限)。

添加复制配置

向存储桶添加复制配置时,Amazon S3 会将该配置存储为 XML。以下是示例配置。有关 XML 结构的更多信息,请参阅 Amazon Simple Storage Service API Reference 中的 PUT Bucket 复制

例 1:包含一个规则请求的复制配置

以下复制配置包含一个规则。它请求 Amazon S3 将所有对象复制到指定目标存储桶。该规则指定空前缀,从而指示所有对象。该配置还指定一个 IAM 角色,Amazon S3 可以代入该角色以代表您复制对象。

Copy
<?xml version="1.0" encoding="UTF-8"?> <ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Role>arn:aws-cn:iam::account-id:role/role-name</Role> <Rule> <Status>Enabled</Status> <Prefix></Prefix> <Destination><Bucket>arn:aws-cn:s3:::destinationbucket</Bucket></Destination> </Rule> </ReplicationConfiguration>

如果 <Rule> 不指定存储类别,则 Amazon S3 将使用源对象的存储类别创建对象副本。您可以选择性地指定 Amazon S3 用于创建副本的存储类别,如下所示。请注意,<StorageClass> 元素不能为空。

Copy
<?xml version="1.0" encoding="UTF-8"?> <ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Role>arn:aws-cn:iam::account-id:role/role-name</Role> <Rule> <Status>Enabled</Status> <Prefix></Prefix> <Destination> <Bucket>arn:aws-cn:s3:::destinationbucket</Bucket> <StorageClass>storage-class</StorageClass> </Destination> </Rule> </ReplicationConfiguration>

您指定的存储类别可以是 Amazon S3 支持的任何存储类别,GLACIER 存储类别除外。您只能使用生命周期将对象转换为 GLACIER 存储类别。有关更多信息,请参阅 PUT Bucket 复制。有关生命周期管理的更多信息,请参阅对象生命周期管理。有关存储类别的更多信息,请参阅 存储类别

例 2:包含两个规则 (各自指定一个键名称前缀) 的复制配置

以下复制配置指定两个规则。第一个规则请求 Amazon S3 复制具有键名称前缀 TaxDocs/ 的对象。第二个规则请求 Amazon S3 复制具有键名称前缀 ProjectDocs/ 的对象。例如,Amazon S3 会复制具有键名称 TaxDocs/doc1.pdfProjectDocs/project1.txt 的对象,但不会复制任何具有键名称 PersonalDoc/documentA 的对象。请注意,这两个规则指定了同一个目标存储桶。

Copy
<?xml version="1.0" encoding="UTF-8"?> <ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Role>arn:aws-cn:iam::account-id:role/role-name</Role> <Rule> <Prefix>TaxDocs</Prefix> ... </Rule> <Rule> <Prefix>ProjectDocs</Prefix> ... </Rule> </ReplicationConfiguration>

请注意,您不能指定重叠前缀。以下示例配置包含两个指定重叠前缀 TaxDocs/TaxDocs/2015 的规则,这是不允许的。

Copy
<ReplicationConfiguration> <Role>arn:aws-cn:iam::account-id:role/role-name</Role> <Rule> <Prefix>TaxDocs</Prefix> <Status>Enabled</Status> <Destination> <Bucket>arn:aws-cn:s3:::destinationbucket</Bucket> </Destination> </Rule> <Rule> <Prefix>TaxDocs/2015</Prefix> <Status>Enabled</Status> <Destination> <Bucket>arn:aws-cn:s3:::destinationbucket</Bucket> </Destination> </Rule> </ReplicationConfiguration>

向存储桶添加复制配置时,您需要根据源存储桶和目标存储桶的拥有者来考虑两种情景。

情景 1:存储桶由同一个 AWS 账户拥有

当源存储桶和目标存储桶由同一个 AWS 账户拥有时,您可以使用 Amazon S3 控制台设置跨区域复制。假设您拥有源存储桶和目标存储桶 (都启用了版本控制),则可以使用控制台对源存储桶添加复制配置。有关更多信息,请参阅以下主题:

情景 2:存储桶由不同的 AWS 账户拥有

当源存储桶和目标存储桶由两个不同的 AWS 账户拥有时,您无法使用控制台添加复制配置,因为在控制台中您无法指定目标存储桶由另一个 AWS 账户拥有。您需要改为使用 AWS 开发工具包或 AWS Command Line Interface 以编程方式添加复制配置。要完成此操作,您需要将复制配置指定为 XML 格式。下面是一个示例复制配置:

Copy
<?xml version="1.0" encoding="UTF-8"?> <ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Role>arn:aws-cn:iam::46173example:role/CrrRoleName</Role> <Rule> <Status>Enabled</Status> <Prefix>TaxDocs</Prefix> <Destination><Bucket>arn:aws-cn:s3:::destinationbucket</Bucket></Destination> </Rule> </ReplicationConfiguration>

该配置请求 Amazon S3 将具有键前缀 TaxDocs/ 的对象复制到 destinationbucket。该配置还指定一个 IAM 角色,Amazon S3 可以代入该角色以代表您复制对象。有关 XML 结构的更多信息,请参阅 Amazon Simple Storage Service API Reference 中的 PUT Bucket 复制

因为目标存储桶由另一个 AWS 账户拥有,所以目标存储桶拥有者还必须向源存储桶拥有者授予复制 (复制和删除) 对象的权限,如下所示:

Copy
{ "Version":"2008-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "AWS":"arn:aws-cn:iam::SourceBucketOwnerAcctID:root" }, "Action":["s3:ReplicateObject", "s3:ReplicateDelete"], "Resource":"arn:aws-cn:s3:::destination bucket/*" } ] }

目标存储桶上的此存储桶策略向源存储桶拥有者授予在目标存储桶上执行 Amazon S3 对象操作 (s3:ReplicateObjects3:ReplicateDelete) 的权限。

有关示例演练的信息,请参阅 演练 2:配置跨区域复制 (其中源存储桶和目标存储桶由不同 AWS 账户拥有)

如果向源存储桶中的对象添加标签,请注意以下事项:

  • 如果源存储桶拥有者向 S3 授予 s3:GetObjectVersionTaggings3:ReplicateTags 操作的权限来复制对象标签 (通过 IAM 角色),则 S3 将复制标签以及对象。有关 IAM 角色的信息,请参阅创建 IAM 角色

  • 如果目标存储桶拥有者不希望复制标签,则该所有者可以向目标存储桶策略添加以下语句来显式拒绝 s3:ReplicateTags 操作的权限。

    Copy
    ... "Statement":[ { "Effect":"Deny", "Principal":{ "AWS":"arn:aws-cn:iam::SourceBucketOwnerAcctID:root" }, "Action":["s3:ReplicateTags"], "Resource":"arn:aws-cn:s3:::destination bucket/*" } ] ...

跨区域复制

复制和不复制的内容

演练 1:配置跨区域复制 (其中源存储桶和目标存储桶由同一 AWS 账户拥有)

演练 2:配置跨区域复制 (其中源存储桶和目标存储桶由不同 AWS 账户拥有)

如何查找对象的复制状态

在 Amazon S3 中排查跨区域复制问题