为同一账户拥有的源存储桶和目标存储桶配置复制
复制是在相同或跨不同 AWS 区域 的存储桶自动、异步地复制对象。复制操作会将源存储桶中新创建的对象和对象更新复制到目标存储桶。有关更多信息,请参阅 复制对象概述。
配置复制时,需要向源存储桶添加复制规则。复制规则定义要复制的源存储桶对象和存储已复制对象的目标存储桶。您可以创建一条规则,以复制存储桶中的所有对象或具有特定键名前缀和/或一个或多个对象标签的对象子集。目标存储桶与源存储桶可以位于同一 AWS 账户 中,也可以位于不同的账户中。
如果您指定要删除的对象版本 ID,Amazon S3 会在源存储桶中删除该对象版本。但不会将删除操作复制到目标存储桶中。换句话说,它不会从目标存储桶中删除同一对象版本。这会防止恶意删除数据。
当您将复制规则添加到存储桶后,默认情况下将启用复制规则,使该规则在您保存它后立即启动。
在此示例中,您为由同一 AWS 账户 拥有的源存储桶和目标存储桶设置复制。提供了使用 Amazon S3 控制台、AWS Command Line Interface (AWS CLI) 以及 AWS SDK for Java 和 AWS SDK for .NET 的示例。
要在目标存储桶与源存储桶位于同一 AWS 账户中时配置复制规则,请按照以下步骤操作。
如果目标存储桶与源存储桶位于不同的账户中,您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制目标存储桶中的对象的权利。有关更多信息,请参阅 在源存储桶和目标存储桶由不同的 AWS 账户 拥有时授予权限。
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
在存储桶列表中,请选择您想要的存储桶的名称。
-
选择管理选项卡,向下滚动到复制规则,然后选择创建复制规则。
-
在复制规则配置部分的复制规则名称下,输入规则的名称,以帮助以后识别该规则。该名称是必填项,并且它在存储桶内必须是唯一的。
-
在状态下,已启用默认情况下处于选中状态。已启用的规则将在您保存它后立即开始工作。如果您想以后再启用该规则,请选择已禁用。
-
如果存储桶具有现有的复制规则,系统会指示您为规则设置优先级。必须为规则设置优先级,以避免因在多个规则的范围内包含对象而引起冲突。如果规则重叠,Amazon S3 会使用规则优先级确定要应用哪个规则。数字越大,优先级越高。有关规则优先级的更多信息,请参阅 复制配置。
-
在源存储桶下,您可以通过以下选项设置复制源:
-
要复制整个存储桶,请选择应用到存储桶中的所有对象。
-
要复制具有相同前缀的所有对象,请选择 Limit the scope of this rule using one or more filters (使用一个或多个筛选条件限制此规则的范围)。这会将复制限制为名称以您指定的前缀(例如
pictures
)开头的所有对象。在前缀框中输入前缀。注意
如果您输入的前缀是文件夹名称,则必须使用 /(正斜杠)作为最后一个字符(例如,
pictures/
)。 -
要复制具有一个或多个对象标签的所有对象,请选择添加标签,然后在框中输入键值对。重复上述过程以添加其他标签。您可以组合前缀和标签。有关对象标签的更多信息,请参阅 使用标签对存储进行分类。
新的复制配置 XML 模式支持前缀和标签筛选以及规则优先级划分。有关新架构的更多信息,请参阅 向后兼容性。如需详细了解在用户界面后台工作的 Amazon S3 API 所使用的 XML,请参阅 复制配置。新架构被描述为复制配置 XML V2。
-
-
在目标下,选择您希望 Amazon S3 将对象复制到的存储桶。
注意
目标存储桶的数量仅限于给定分区中的 AWS 区域 的数量。分区是一组区域。AWS 目前有三个分区:
aws
(标准区域)、aws-cn
(中国区域)和aws-us-gov
(AWS GovCloud (US) 区域)。要请求提高目标存储桶限额,您可以使用服务限额。-
要复制到您的账户中的一个或多个存储桶,请选取选择此账户中的存储桶,然后输入或浏览目标存储桶。
-
要复制到其他 AWS 账户中的一个或多个存储存储桶,请选择指定另一个账户中的存储存储桶,然后输入目标存储存储桶账户 ID 和存储桶名称。
如果目标存储桶与源存储桶位于不同的账户中,您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制对象的权限。有关更多信息,请参阅 在源存储桶和目标存储桶由不同的 AWS 账户 拥有时授予权限。
(可选)如果要帮助标准化目标存储桶中的新对象的所有权,请选择将对象所有权更改为目标存储桶拥有者。有关此选项的更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。。
注意
如果未对目标存储桶启用版本控制,您将收到包含 Enable versioning(启用版本控制)按钮的警告。请选择此按钮可对存储桶启用版本控制。
-
-
设置 AWS Identity and Access Management (IAM) 角色,Amazon S3 可以代入该角色以代表您复制对象。
要设置 IAM 角色,请在 IAM 角色部分中,从 IAM 角色下拉列表中选择以下任一选项:
-
我们强烈建议您选择 Create new role (创建新角色),让 Amazon S3 为您创建一个新的 IAM 角色。当您保存该规则后,将为 IAM 角色生成一个与您选择的源和目标存储桶匹配的新策略。
-
您可以选择使用现有的 IAM 角色。在这种情况下,您必须选择一个角色,该角色会授予 Amazon S3 必要的权限以进行复制。如果该角色未按照您的复制规则授予 Amazon S3 足够的权限,复制会失败。
重要
将复制规则添加到存储桶时,您必须具有
iam:PassRole
权限才能传递授予 Amazon S3 复制权限的 IAM 角色。有关更多信息,请参阅《IAM 用户指南》中的向用户授予将角色传递给 AWS 服务的权限。 -
-
要复制源存储桶中使用具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)进行加密的对象,请在加密下选择复制已使用 AWS KMS 加密的对象。在用于加密目标对象的 AWS KMS 密钥下,是您允许复制使用的源密钥。预设情况下,所有源 KMS 密钥都包含在内。要缩小 KMS 密钥选择范围,可以选择别名或密钥 ID。
使用您未选择的 AWS KMS keys 加密的对象不会进行复制。系统为您选择一个 KMS 密钥或一组 KMS 密钥,您可以自行选择 KMS 密钥。有关将 AWS KMS 用于复制的信息,请参阅 复制加密对象(SSE-C、SSE-S3、SSE-KMS、DSSE-KMS)。
重要
在复制使用 AWS KMS 加密的对象时,AWS KMS 请求速率会在源区域中加倍并在目标区域中增加相同的量。之所以对 AWS KMS 的调用率会增加,是因为数据是使用您为复制目标区域定义的 KMS 密钥进行重新加密的。对于每个区域的每个调用账户,AWS KMS 设定了一个请求速率限额。有关限额默认值的信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS KMS 限额 – 每秒请求数:因情况而异。
如果您在复制期间的当前 Amazon S3
PUT
对象请求速率超过您账户的默认 AWS KMS 速率限制的一半,则建议您请求提高您的 AWS KMS 请求速率限额。要请求提高,请在联系我们处的 AWS Support 中心内创建一个案例。例如,假设您当前的 PUT
对象请求速率为每秒 1000 个请求并且您使用 AWS KMS 加密对象。在此情况下,建议您让 AWS Support 将您在源区域和目标区域中的 AWS KMS 速率限制提高到每秒 2500 个请求(如果不同),以确保不受 AWS KMS 的限制。要查看源存储桶中的
PUT
对象请求速率,请查看 Amazon S3 的 Amazon CloudWatch 请求指标中的PutRequests
。有关查看 CloudWatch 指标的信息,请参阅使用 S3 控制台如果选择复制使用 AWS KMS 加密的对象,请执行以下操作:
-
在用于加密目标对象的 AWS KMS key 下,通过以下方式之一指定您的 KMS 密钥:
-
要从可用的 KMS 密钥列表中进行选择,请选择从您的 AWS KMS keys 密钥中进行选择,并从可用密钥的列表中选择您的 KMS 密钥。
AWS 托管式密钥 (
aws/s3
) 和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的客户密钥和 AWS 密钥。 -
要输入 KMS 密钥 Amazon 资源名称(ARN),请选择输入 AWS KMS key ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。这会加密目标存储桶中的副本。您可以在 IAM 控制台
中的加密密钥下方找到您的 KMS 密钥的 ARN。 -
要在 AWS KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥。
有关创建 AWS KMS key 的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建密钥。
重要
您只能使用与存储桶所在相同 AWS 区域 中启用的 KMS 密钥。选择从您的 KMS 密钥中选择时,S3 控制台对于每个区域仅列出 100 个 KMS 密钥。如果您在同一区域中有超过 100 个 KMS 密钥,您只会在 S3 控制台中看到前 100 个 KMS 密钥。要使用控制台中未列出的 KMS 密钥,请选择输入 AWS KMS key ARN,然后输入您的 KMS 密钥 ARN。
在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时,您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥,而不支持非对称 KMS 密钥。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的确定对称和非对称 KMS 密钥。
有关创建 AWS KMS key 的更多信息,请参阅 AWS Key Management Service 开发人员指南中的创建密钥。有关将 AWS KMS 与 Amazon S3 结合使用的更多信息,请参阅使用具有 AWS KMS 密钥的服务器端加密(SSE-KMS)。
-
-
-
在目标存储类下,如果要将数据复制到目标中的特定存储类,请选择更改复制对象的存储类。然后选择要用于目标中的已复制对象的存储类。如果您不选择此选项,已复制对象的存储类将与原始对象的类相同。
-
设置其他复制选项时,您具有以下附加选项:
-
如果要在复制配置中启用 S3 Replication Time Control(S3 RTC),请选择复制时间控制(RTC)。有关此选项的更多信息,请参阅 使用 S3 Replication Time Control(S3 RTC)满足合规性要求。
-
如果要在复制配置中启用 S3 复制指标,请选择 Replication metrics and events(复制指标和事件)。有关更多信息,请参阅使用复制指标和 S3 事件通知监控进度。
-
如果要在复制配置中启用删除标记复制,请选择 Delete marker replication (删除标记复制)。有关更多信息,请参阅在存储桶之间复制删除标记。
-
如果要在复制配置中启用 Amazon S3 副本修改同步,请选择 Replica modification sync (副本修改同步)。有关更多信息,请参阅使用 Amazon S3 副本修改同步复制元数据更改。
注意
使用 S3 RTC 或 S3 复制指标时,需要支付额外费用。
-
-
要完成,请选择 Save (保存)。
-
在您保存规则之后,可以通过选择您的规则并选择 Edit rule (编辑规则) 来编辑、启用、禁用或删除您的规则。
要使用 AWS CLI 在源存储桶和目标存储桶由同一 AWS 账户 拥有时设置复制,请执行以下操作:
-
创建源存储桶和目标存储桶
-
对存储桶启用版本控制功能
-
创建为 Amazon S3 授予复制对象权限的 IAM 角色
-
将复制配置添加到源存储桶中
要验证您的设置,请对其进行测试。
当源存储桶和目标存储桶由同一 AWS 账户 拥有时设置复制
-
为 AWS CLI 设置凭证配置文件。在此示例中,我们使用配置文件名称
acctA
。有关设置凭证配置文件的更多信息,请参阅《AWS Command Line Interface 用户指南》中的命名配置文件。重要
用于本练习的配置文件必须具有必要的权限。例如,在复制配置中,指定 Amazon S3 可担任的 IAM 角色。仅当您所使用的配置文件具有
iam:PassRole
权限时,您才能执行此操作。有关更多信息,请参阅 IAM 用户指南中的向用户授予将角色传递给 AWS 服务的权限。如果您使用管理员凭证创建命名配置文件,则可执行所有任务。 -
创建一个
存储桶,并对其启用版本控制。以下代码在美国东部(弗吉尼亚州北部)(us-east-1)区域中创建一个source
存储桶。source
aws s3api create-bucket \ --bucket
source
\ --region us-east-1 \ --profile acctAaws s3api put-bucket-versioning \ --bucket
source
\ --versioning-configuration Status=Enabled \ --profile acctA -
创建一个
存储桶,并对其启用版本控制。以下代码在美国西部(俄勒冈州)(us-west-2)区域中创建一个destination
存储桶。destination
注意
要在源存储桶和目标存储桶位于同一 AWS 账户 时设置复制配置,请使用同一配置文件。此示例使用
acctA
。要在两个存储桶由不同 AWS 账户 拥有时对复制配置进行测试,您需要为每个存储桶指定不同的配置文件。在此示例中,我们对目标存储桶使用acctB
配置文件。aws s3api create-bucket \ --bucket
destination
\ --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2 \ --profile acctAaws s3api put-bucket-versioning \ --bucket
destination
\ --versioning-configuration Status=Enabled \ --profile acctA -
创建一个 IAM 角色。您将在稍后添加到
源
存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色:-
创建角色。
-
将权限策略附加到角色。
-
创建 IAM 角色。
-
复制以下信任策略,并将其保存到本地计算机上当前目录中一个名为
s3-role-trust-policy.json
的文件。此策略向 Amazon S3 服务主体授予担任该角色的权限。{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
-
运行以下命令以创建角色。
$
aws iam create-role \ --role-name replicationRole \ --assume-role-policy-document file://s3-role-trust-policy.json \ --profile acctA
-
-
将权限策略附加到角色。
-
复制以下权限策略,并将其保存到本地计算机上当前目录中一个名为
s3-role-permissions-policy.json
的文件。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource":[ "arn:aws:s3:::
source-bucket
/*" ] }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration" ], "Resource":[ "arn:aws:s3:::source-bucket
" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags" ], "Resource":"arn:aws:s3:::destination-bucket
/*" } ] } -
运行以下命令以创建策略并将其附加到角色。
$
aws iam put-role-policy \ --role-name replicationRole \ --policy-document file://s3-role-permissions-policy.json \ --policy-name replicationRolePolicy \ --profile acctA
-
-
-
将复制配置添加到
存储桶中。source
-
尽管 Amazon S3 API 要求复制配置采用 XML 形式,但 AWS CLI 要求您以 JSON 形式指定复制配置。将以下 JSON 保存到计算机上本地目录中一个名为
replication.json
文件。{ "Role": "
IAM-role-ARN
", "Rules": [ { "Status": "Enabled", "Priority": 1, "DeleteMarkerReplication": { "Status": "Disabled" }, "Filter" : { "Prefix": "Tax"}, "Destination": { "Bucket": "arn:aws:s3:::destination-bucket
" } } ] } -
通过提供
和destination-bucket
的值来更新 JSON。保存更改。IAM-role-ARN
-
运行以下命令以将复制配置添加到源存储桶中。请务必提供
存储桶名称。source
$
aws s3api put-bucket-replication \ --replication-configuration file://replication.json \ --bucketsource
\ --profile acctA
要检索复制配置,请使用
get-bucket-replication
命令。$
aws s3api get-bucket-replication \ --bucketsource
\ --profile acctA -
-
在 Amazon S3 控制台中测试该设置:
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在
存储桶中,创建一个名为source
Tax
的文件夹。 -
将示例对象添加到
存储桶中的source
Tax
文件夹。注意
Amazon S3 复制对象所需的时间量取决于对象大小。有关如何查看复制状态的信息,请参阅获取复制状态信息。
在
存储桶中,确认以下几点:destination
-
该 Amazon S3 已复制对象。
-
在对象 properties (属性) 中,Replication Status (复制状态) 已设置为
Replica
(将其标识为副本对象)。 -
在对象 properties (属性) 中,权限部分未显示权限。这意味着副本仍由
存储桶拥有者拥有,而source
存储桶拥有者不具有对象副本的权限。您可以添加可选配置以指示 Amazon S3 更改副本所有权。有关示例,请参阅 如何更改副本拥有者。destination
-
以下代码示例分别使用 AWS SDK for Java 和 AWS SDK for .NET 向存储桶添加复制配置。