我正在为一个拥有 2 个独立 AWS 账户的客户做一些工作。我们需要将其中一个 S3 账户上的存储桶中的所有文件移动到第二个账户上的新存储桶中。
我们认为 s3cmd 会允许这样做,使用以下格式:
s3cmd cp s3://bucket1 s3://bucket2 --recursive
但是,这只允许我使用一个帐户的密钥,我不能指定第二个帐户的帐户。
有没有办法在不下载文件并将它们再次上传到第二个帐户的情况下做到这一点?
您不必向所有人开放权限。使用以下关于源和目标的存储桶策略,使用 IAM 用户从一个账户中的存储桶复制到另一个账户
要复制的存储桶:SourceBucket
要复制到的存储桶:DestinationBucket
源 AWS 账户 ID:XXXX–XXXX-XXXX
来源 IAM 用户:src–iam-user
以下策略意味着 – IAM 用户 –XXXX–XXXX-XXXX:src–iam-user
拥有s3:ListBucket
和s3:GetObject
特权on SourceBucket/*
以及s3:ListBucket
和s3:PutObject
特权DestinationBucket/*
在 SourceBucket 上,策略应如下所示:
{
"Id": "Policy1357935677554",
"Statement": [{
"Sid": "Stmt1357935647218",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::SourceBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}, {
"Sid": "Stmt1357935676138",
"Action": ["s3:GetObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::SourceBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}]
}
在 DestinationBucket 上,策略应该是:
{
"Id": "Policy1357935677555",
"Statement": [{
"Sid": "Stmt1357935647218",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DestinationBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}, {
"Sid": "Stmt1357935676138",
"Action": ["s3:PutObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DestinationBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}]
}
要运行的命令是s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1
AWS 内部的带宽不计算在内,因此只要存储桶位于同一区域,您就可以通过 AWS 内部的一个盒子完成所有操作,从而节省一些金钱和时间。
至于在没有将文件放在某处的计算机上的情况下这样做 - 不要这么认为。
除了:由于他们会从您邮寄给他们的硬盘驱动器进行批量上传,因此他们可能会为您执行相同的桶到桶传输。
我建议使用 cloudberry s3 explorer,作为让事情快速发展的简单解决方案。它还允许您使用内部 aws 带宽免费传输服务。
您还可以使用 cloudberry sdk 工具集成到您的应用程序中。
祝乔恩好运
即使角色和策略是一种非常优雅的方式,我还有另一个解决方案:
在您的本地计算机(桌面或 AWS 之外的任何服务器)上,使用 Source-Bucket-Accounts 的凭据创建一个新配置文件。
aws --profile ${YOUR_CUSTOM_PROFILE} 配置
填写 aws_access_key_id 和 aws_secret_access_key(您可以跳过 Region 和 Output)
将您的 Destination-Bucket-Credentials 保存为 Environment-Variables
导出 AWS_ACCESS_KEY_ID=AKI...
导出 AWS_SECRET_ACCESS_KEY=CN...
现在进行同步,但添加关键的“配置文件”-参数
aws --profile ${YOUR_CUSTOM_PROFILE} s3 同步 s3://${SOURCE_BUCKET_NAME} s3://${DESTINATION_BUCKET_NAME}
好的,想出了一个答案。可能还有其他方法可以做到这一点,但这很容易。
我可以使用 s3cmd 实用程序来做到这一点,但也可以使用类似的工具来完成。
配置 s3cmd 时,请使用您的帐户访问密钥和秘密访问密钥对其进行配置。
使用您要转移到的存储桶的帐户登录 S3 Web 控制台。
访问 S3 Web 控制台。
https://console.aws.amazon.com/s3/home
单击您的存储桶,然后单击操作,然后单击属性。
在“权限”选项卡下的底部,单击“添加更多权限”。
Set "Grantee" to Everyone
Check "List" and "Upload/Delete"
Save
要转移,请从您的终端运行
s3cmd cp s3://from_account_bucket s3://to_account_bucket --recursive
传输完成后,您应立即再次访问 S3 控制台并删除您为存储桶添加的权限。
这里显然存在安全问题。我们要转移到的存储桶对所有人开放。有人找到您的存储桶名称的机会很小,但确实存在。
您可以使用存储桶策略作为仅打开对特定帐户的访问权限的替代方式,但这对我来说太难了,因此我将其作为练习留给那些需要弄清楚的人。
希望这可以帮助。