AWS-datasync自动同步(Amazon S3 传输到另一个 Amazon S3AWS 账户)
以下是这种场景的样子:
· 账户 A:您用于管理要从中复制数据的 S3 存储桶中复制数据。AWS 账户
· 账户 B:您用于管理要将AWS 账户数据复制到其中的 S3 存储桶用于管理要将数据复制到其中的 S3 存储桶。
1. 先在帐户A创建一个S3存储桶,创建如下:(存储桶名字可以更改,但是需要全局唯一,其它均为默认配置即可)
2. 先在帐户B创建一个S3存储桶,创建如下:(存储桶名字可以更改,但是需要全局唯一,其它均为默认配置即可)
步骤 1: DataSync 在账户 A 中创建 IAM 角色
您需要一个 IAM 角色,该角色可以 DataSync 授予写入账户 B 中的 S3 存储桶的权限。
当您为存储段创建位置时, DataSync 可以自动创建并代入具有访问该存储桶的正确权限的角色。由于您跨账户转移,因此您必须手动创建角色。
有关更多信息,请参阅 IAM 用户指南中的 AWS 服务(控制台)创建角色。
创建 IAM 角色
以可信实体 DataSync 身份创建角色。
创建 IAM 角色
1. 使用账户 A 登录。AWS Management Console
2. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/。
3. 在左侧导航窗格的 “访问管理” 下,选择 “角色”,然后选择 “创建角色”。
4. 在 “选择可信实体” 页面上,对于可信实体类型,选择AWS 服务。
5. 对于用例,DataSync在下拉列表中选择并选择DataSync。选择 Next(下一步)。
6. 在 Add permissions(添加权限)页面上,选择 Next(下一步)。
7. 为您的角色命名,然后选择创建角色。(角色名是可以自定义的)
将自定义策略附加到 IAM 角色
IAM 角色需要一个 DataSync 允许写入账户 B 中的 S3 存储桶的策略。
将自定义策略附加到 IAM 角色
1. 在 IAM 控制台的角色页面上,搜索您刚刚创建的角色并选择其名称。
2. 在角色的详细信息页面上,选择 Permiss (权限) 选项卡。选择添加权限,然后选择创建内联策略。
3. 选择 JSON 选项卡并执行以下操作:
a. 将下面的 JSON 粘贴到策略编辑器中:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::account-b-bucket"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::account-b-bucket/*"
}
]
}
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/list_amazons3.html
b. account-b-bucket替换为账户 B 中的 S3 存储桶的名称。
c. 可以至帐号B中查看s3存储桶的arn,如下所示。
4. 选择Review policy(查看策略)。(我这是已经更换好我自己的实验场景)
5. 为您的策略命名,然后选择创建策略。
步骤 2:在账户 B 中禁用 S3 存储桶的 ACL
您复制到 S3 存储桶的所有数据都必须属于账户 B。为确保账户 B 是数据的所有者,请禁用存储段的访问控制列表 (ACL)。有关更多信息,请参阅《Amazon S3 用户指南》中的控制存储桶的对象所有权和禁用 ACL。
l 禁用 S3 存储桶的 ACL
1. 在中AWS Management Console,切换到账户 B。
2. 通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/。
3. 在左侧导航窗格中,选择桶。
4. 在存储段列表中,选择要将数据传输到的 S3 存储桶。
5. 在存储桶的详细信息页面上,选择 Permiss (权限) 选项卡。
6. 在 Object Ownership(对象所有权)下方,请选择 Edit(编辑)。
7. 如果尚未选择 ACL,请选择 ACL 已禁用(推荐)选项。
8. 选择 Save changes(保存更改)。
因为我们创建S3存储桶时选择的默认时是ACL 已禁用(推荐),所以不需要操作,如果不是默认创建的,可以检查下。
步骤 3:更新账户 B 中的 S3 存储桶策略
在账户 B 中,修改 S3 存储桶策略以允许访问您为 DataSync 账户 A 创建的 IAM 角色
更新后的政策(在以下说明中提供给您)包括两项主要内容:
· 第一个委托人指定了您在步骤 1 中创建的账户 A 中的 IAM 角色。此角色允许写入 DataSync 到账户 B 中的 S3 存储桶。
· 第二个委托人指定了账户 A 中的 IAM 角色,您使用该角色访问控制台或AWS CLI。在步骤 4 中,您将在创建 S3 存储桶的目标位置时使用此角色。
更新 S3 存储桶策略
1. 当您仍在 S3 控制台中并使用账户 B 时,选择要将数据复制到的 S3 存储桶。
2. 在存储桶的详细信息页面上,选择 Permiss (权限) 选项卡。在存储桶策略下,选择编辑,然后执行以下操作来修改您的 S3 存储桶策略:
a. 更新编辑器中的内容以包括以下政策声明:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "DataSyncCreateS3LocationAndTaskAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-a-id:role/name-of-datasync-role"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": [
"arn:aws:s3:::account-b-bucket",
"arn:aws:s3:::account-b-bucket/*"
]
},
{
"Sid": "DataSyncCreateS3Location",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-a-id:user/name-of-your-role"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::account-b-bucket"
}
]
}
b. account-a-id替换为账户 A 的AWS 账户号码。
c. name-of-datasync-role替换为您在账户 A DataSync 中创建的 IAM 角色(返回步骤 1)。
d. account-b-bucket替换为账户 B 中的 S3 存储桶的名称。
e. arn:aws:iam::account-a-id:user/name-of-your-role替换为您用于访问控制台的 IAM 角色或AWS CLI账户 A。(这点特别注意,很坑)
3. 选择 Save changes(保存更改)。
这里的arn:aws:iam::848227734245:user/datasync 是上文没有创建的用户,所以这里需要创建一个用户,创建流程如下:
1、通过以下网址打开 Identity and Access Management (IAM)控制台:https://us-east-1.console.aws.amazon.com/iam/home#/home
添加用户:我这里是已经创建好了的。
安全凭证后续可能要用到,所以可以同步创建下。
我这里是已经创建好的,可以参考该链接配置访问密钥https://www.cnblogs.com/syavingcs/p/14850710.html
步骤 4:为 S3 存储桶创建 DataSync 目标位置
为 S3 存储桶创建位置后,即可运行 DataSync 任务。但是,该 DataSync主机不支持在不同的账户中创建地点。必须先使用创建位置,AWS CLI然后才能运行任务。
使用 CLI 创建 DataSync 地点
注意事项,使用CLI是要地区要求的https://docs.aws.amazon.com/zh_cn/general/latest/gr/cloudshell.html
1. 打开 终端。
2. 确保您的 CLI 配置文件配置为使用账户 A。
3. 复制以下命令:
aws datasync create-location-s3 \
--s3-bucket-arn arn:aws:s3:::account-b-bucket \
--s3-config '{"BucketAccessRoleArn":"arn:aws:iam::account-a-id:role/name-of-datasync-role"}'
4. account-b-bucket替换为账户 B 中的 S3 存储桶的名称。
5. account-a-id替换为账户 A 的AWS 账户号码。
6. name-of-datasync-role替换为您在账户 A DataSync 中创建的 IAM 角色(返回步骤 1)。
7. 如果账户 B 中的存储桶与账户 A 中的存储桶位于不同的区域,请在命令末尾添加--region选项以指定账户 B 存储桶所在的区域。例如,--region us-west-1。 (可选,本文实验中没有遇到)
8. 运行 命令。
如果该命令返回与以下 DataSync 位置相似的位置 ARN,则表示您成功创建了位置:
注意,这里可能会有AK SK相关问题,报错为an error occurred (UnrecognizedClientException) when calling the CreateLocationS3 operation: The security token included in the request is invalid.,回到步骤3底部有AK SK相关文档
9. 在中切换回账户 AAWS Management Console。
10. 通过 https://console.aws.amazon.com/datasync/ 打开 DataSync 主机。
11. 在左侧导航窗格中,选择 Loces (位置)。
您可以看到刚刚使用 CLI 创建的账户 B 中的 S3 存储桶的位置。
12. 现在创建帐号A,也就是本地的位置,可以使用控制台创建。
创建好后显示如下:(位置编号是随机的,按照你们配置时的来即可)
步骤 5:创建并启动 DataSync 任务
在移动数据之前,让我们回顾一下你到目前为止所做的事情:
· 在账户 A 中创建了一个 IAM 角色,以便 DataSync 可以将数据写入账户 B 中的 S3 存储桶。
· 在账户 B 中配置 S3 存储桶以确保 DataSync 任务正常运行。
· 在账户 A 中创建了您的 DataSync 来源和目的地地点。
创建和启动 DataSync 任务
1. 在账户 A 中仍使用 DataSync 控制台时,在左侧导航窗格中选择任务,然后选择创建任务。
源位置我这里定义的是帐号B下的,也就是用CLI创建的位置
目标位置是用帐号A下的,也就是用控制台创建的
设置任何名称和cron定时时间,因为是测试,遂设置的5分钟一次,业务环境根据业务属性来定义。
注意
您必须使用在步骤 3 中的 S3 存储桶策略中为账户 A 指定的 IAM 角色登录控制台。
2. 如果账户 B 中的存储段与账户 A 中的存储段位于不同的区域,请在导航窗格中选择账户 B 存储段的区域。
您必须从目标位置的区域(在本例中为账户 B 存储桶)启动 DataSync 任务,以避免连接错误。
3. 在配置源位置页面上,选择选择现有位置。
4. 对于跨区域转移,请选择 Account A 存储桶所在的区域。
5. 选择要从中复制数据的源位置(账户 A 中的 S3 存储桶),然后选择下一步。
6. 在配置目标位置页面上,选择选择现有位置。选择要将数据复制到的目标位置(账户 B 中的 S3 存储桶),然后选择下一步。
7. 在配置设置页面上,为任务命名。根据需要配置其他设置,例如指定 Amazon CloudWatch 日志组。选择 Next(下一步)。
8. 在 “查看” 页面上,查看您的设置并选择 “创建任务”。
9. 在任务详细信息页面上,选择 Start (开始),然后选择以下操作之一:
· 要在不修改的情况下运行任务,请选择 “以默认值启动”。
· 要在运行任务之前对其进行修改,请选择 “使用替代选项开始”。
任务完成后,检查账户 B 中的 S3 存储桶。您应该会看到账户 A 存储桶中的数据。