本帖最后由 13522273333 于 2019-6-4 17:27 编辑
作者:光环云 徐毅
简述
跨区域复制(Cross Region Replication)是AWS对象存储服务S3的一项非常实用的功能特性,允许用户跨不同区域中的存储桶自动、异步地复制对象
要求
l 源存储桶和目标存储桶必须已经启用版本控制
l 源存储桶和目标存储桶必须处于不同的区域
l S3必须有权代表用户将对象从源存储桶复制到目标存储桶
跨区域复制既可以在同一个账号之下进行,也可以在不同的账号之间进行,因为我只有一个账号,所以本次实践就是在同一个账号之下进行的,有兴趣的兄弟可以多弄几个账号试试。
跨区域存储可以通过控制台、AWS CLI和AWS开发工具包来进行操作配置,本次实践通过AWS CLI进行,当然前提是已经安装好了CLI,我安装的是windows版本。
实践
步骤1 创建源存储桶,并启用版本控制
1)创建存储桶
- aws s3api create-bucket \
- --bucket source \ //指定源存储桶名称
- --region us-east-1 \ //指定源存储桶所在区域
- --profile acctA //指定配置文件
复制代码 以上部分是在CLI上执行的命令,在CLI上执行该命令:
其中—profile参数不是必须的,通常我们在安装完CLI后,都会用aws configure进行配置,此时采用的默认的配置文件。后面的命令执行时也无需加—profile参数,采用默认的配置文件即可。
上面两图分别是创建存储桶命令执行前后在控制台上所观察到的状况。
注意:1)存储桶的名称全部小写;2)命令中各参数大小写不能写错;3)命令执行完成以后可能需要等待一段时间多刷新几次才能在控制台看到效果。
2)启用版本控制
- aws s3api put-bucket-versioning \
- --bucket source \
- --versioning-configuration Status=Enabled \
- --profile acctA
复制代码 执行该命令:
在控制台crrsourcebucket存储桶属性中可看到版本控制已启用,如图5所示。至此,已经成功在美东区域创建了一个名称为crrsourcebucket的存储桶并开启了版本控制。
步骤2 创建目标存储桶,并开启版本控制
1)创建存储桶
- aws s3api create-bucket \
- --bucket destination \
- --region us-west-2 \
- --create-bucket-configuration LocationConstraint=us-west-2 \
- --profile acctA
复制代码 执行该命令:
提示crrdestinationbucket这个存储桶已经存在,必须换一个,可能是其他用户创建了,总之存储桶名称必须全局唯一,所以,修改存储桶名称crrdstbucket,再执行一次:
注意:目标存储桶必须位于与源存储桶不同的区域中。
创建成功,在控制台刷新即可看到目标存储桶。
2)开启版本控制
- aws s3api put-bucket-versioning \
- --bucket destination \
- --versioning-configuration Status=Enabled \
- --profile acctA
复制代码 执行该命令:
至此,成功在美西区域创建了一个名称为crrdstbucket的存储桶并开启了版本控制。
步骤3 创建一个IAM角色
1)创建一个信任策略文件
创建信任策略如下,将策略内容保存到一个json文件(windows下用记事本即可创建)
- {
- "Version":"2012-10-17",
- "Statement":[
- {
- "Effect":"Allow",
- "Principal":{
- "Service":"s3.amazonaws.com"
- },
- "Action":"sts:AssumeRole"
- }
- ]
- }
复制代码 2)创建角色
- aws iam create-role \
- --role-name crrRole \
- --assume-role-policy-document file://s3-role-trust-policy.json \
- --profile acctA
复制代码 执行该命令,根据本地的json文件创建角色:
注意:1)角色名称可以指定;2)json文件名称可以指定;3)json文件建议放在CLI当前目录下,其他目录也可以,但容易弄错。 至此我们创建了一个名为mytestrole的角色,可切换到控制台IAM服务里面查看刚刚创建的角色,并记住该角色的ARN,后面会用到。
3)创建一个权限策略文件 - {
- "Version":"2012-10-17",
- "Statement":[
- {
- "Effect":"Allow",
- "Action":[
- "s3:GetObjectVersionForReplication",
- "s3:GetObjectVersionAcl"
- ],
- "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",
- "s3:GetObjectVersionTagging"
- ],
- "Resource":"arn:aws:s3:::destination-bucket/*"
- }
- ]
- }
复制代码在CLI当前目录下创建一个权限策略文件s3-role-permissions-policy.json,并将上述权限策略复制到json文件中,注意正确填写存储桶的名称。
4)将权限策略附加到角色 - aws iam put-role-policy \
- --role-name crrRole \
- --policy-document file://s3-role-permissions-policy.json \
- --policy-name crrRolePolicy \ //策略名称自行指定
- --profile acctA
复制代码执行上述命令:
步骤4 将跨区域复制配置添加到源存储桶中
1)在CLI当前目录下创建一个配置文件replication.json,其内容如下: - {
- "Role": "IAM-role-ARN", //此处需填写该role的ARN
- "Rules": [
- {
- "Status": "Enabled",
- "Priority": 1,
- "DeleteMarkerReplication": { "Status": "Disabled" },
- "Filter" : { "Prefix": "Tax"},
- "Destination": {
- "Bucket": "arn:aws:s3:::destination-bucket"
- }
- }
- ]
- }
复制代码l Status指示规则是启用还是禁用。如果规则处于禁用状态,则 Amazon S3 不会执行规则中指定的操作。 l Priority指示在向对象应用多个规则时哪个规则具有优先级。 l 目前,不复制删除标记,因此您必须将 DeleteMarkerReplication 设置为Disabled。 注意:1)务必正确填写role的ARN(前面曾经提到过的);2)prefix为前缀,在存储桶中表现为文件夹,表示该文件夹中的内容都会进行跨区域复制,如果希望整个存储桶都进行跨区域复制,将前缀填为空即可。 注意:图13中,我将prexif置为空,表示整个存储桶的内容都进行复制。 2)将配置添加到源存储桶 - aws s3api put-bucket-replication \
- --replication-configuration file://replication.json \
- --bucket source \
- --profile acctA
复制代码
执行该命令:
至此即完成了对于跨区域复制的相关配置,在控制台切换到源存储桶,点开“管理”->“复制”,可查看当前的配置状态:
步骤5 验证 在控制台上传任意文件或文件夹到源存储桶,随后刷新目标存储桶即可在其中看到刚刚上传到源存储桶中的文件,略。 注意:1)如果此前的filter中指定了前缀,则只有相应的文件夹内容才能进行跨区域复制;2)在配置跨区域存储之前已经存在于源存储桶中的文件是不能复制到目标存储桶的。 结束语 Crr的配置本身并不复杂,但是对于CLI操作中的一些细节点很容易忽视,从而导致配置失败。关于crr,还有跨账户的配置,以及关于加密的复制等内容没有演练。
|