看来你的情况是:
-
帐户 A: 存储桶 A 和用户 A(访问权限有限)
-
帐户 B: 存储桶 B 和用户 B(具有管理员权限)
您可以将账户 A 中的数据推送到存储桶 B,也可以使用账户 B 从存储桶 A拉取数据。
从账户 A 推送到存储桶 B
假设用户 A 可以访问存储桶 A。只需授予用户 A 写入存储桶 B 的权限。这可以通过存储桶 B 上的存储桶策略来完成:
{
"Id": "PolicyB",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GrantAccessToUserA",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::BUCKET-B",
"arn:aws:s3:::BUCKET-B/*"
],
"Principal": "arn:aws:iam::ACCOUNT-A:user/USER-A"
}
]
}
这会授予用户 A 在存储桶 B 上的所有 s3 权限。这太过分了,但大概这只是暂时的。
然后用户 A 会将文件从存储桶 A 复制到存储桶 B。例如:
aws s3 sync s3://BUCKET-A s3://BUCKET-B \
--acl bucket-owner-full-control \
--source-region SOURCE-REGION \
--region DESTINATION-REGION
重要提示:复制文件时,请务必使用授予bucket-owner-full-control 的访问控制列表。这意味着文件将由 Bucket B 的所有者拥有。如果您不这样做,文件仍归用户 A 拥有,并且用户 B 无法删除,即使使用 admin权利!
使用账户 B 从存储桶 A 中拉取
为此,必须向用户 B 授予对存储桶 A 的访问权限。您需要在账户 A 中拥有足够的访问权限才能在存储桶 A 上添加存储桶策略:
{
"Id": "PolicyA",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GrantAccessToUserB",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::BUCKET-A",
"arn:aws:s3:::BUCKET-A/*"
],
"Principal": "arn:aws:iam::ACCOUNT-B:user/USER-B"
}
]
}
然后,用户 B 可以复制文件:
aws s3 sync s3://BUCKET-A s3://BUCKET-B \
--source-region SOURCE-REGION \
--region DESTINATION-REGION
(您可能需要授予更多访问权限,我没有测试上述策略。)
存储桶位于不同区域这一事实不会影响权限,但会影响您发送命令的位置。命令被发送到目标区域,然后从源区域拉取。
见:AWS CLI s3 sync command