Answers:
数以百万计的数字很大-我稍后再讲。
无论采用哪种方法,底层机制都需要直接从一个存储桶复制到另一个存储桶-这样(由于您的存储桶位于同一区域),您不会为带宽带来任何费用。任何其他方法都是效率低下的(例如下载和重新上传文件)。
各个存储区之间的复制是通过使用“ PUT复制”完成的-这是一个包含“ x-amz-copy-source”标头的PUT请求-我认为这被归类为COPY请求。这将复制文件,默认情况下将复制关联的元数据。如果要同时设置ACL,则必须包含具有正确值的“ x-amz-acl”(否则,它将默认为private)。您需要为COPY请求付费($ 0.01 / 1,000个请求)。复制不需要的文件后,您可以删除它们(不收取删除请求)。(我不清楚的一点是COPY请求是否还会产生GET请求的费用,因为必须首先从源存储桶中获取对象-如果这样做,则将额外收取$ 0.01 / 10,000要求)。
上述费用似乎是不可避免的-对于一百万个对象,您需要支付大约10美元(或11美元)。由于最终您必须实际在目标存储桶上创建文件,因此其他方法(例如,将文件压缩成tar,Amazon Import / Export等)将无法避免此费用。但是,如果您要转移的对象超过数百万个,那么与您联系亚马逊可能值得。
鉴于上述(不可避免的价格),接下来要考虑的是时间,这是复制“数百万个文件”时的重要因素。所有可以在存储桶之间执行直接复制的工具将产生相同的费用。不幸的是,您需要每个文件一个请求(复制),一个删除请求,以及一个读取ACL数据的请求(如果文件具有不同的ACL)。最好的速度将来自可以运行大多数并行操作的任何设备。
有一些命令行方法可能非常可行:
s3fs可能有工作的可能-它非常并行,确实支持同一存储桶之间的副本-不支持不同存储桶之间的副本,但可能支持不同存储桶之间的移动。
我将从s3cmd-modification开始,看看您是否成功使用它,或者与Amazon联系以寻求更好的解决方案。
aws s3 sync s3://source s3://destination
适合在哪里?
旧话题,但是这适用于研究相同场景的任何人。随着时间的流逝,我花了20,000多个物件。在AWS Linux / Centos上运行,每个对象大部分都是图像,以及一些视频和各种媒体文件。
使用AWS CLI工具将文件从存储桶A复制到存储桶B.
A.创建新的存储桶
$ aws s3 mb s3://new-bucket-name
B.将旧存储桶与新存储桶同步
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
正在复制20,000多个对象...
开始于17:03
已结束17:06
20,000个以上的对象的总时间=大约3分钟
正确配置新存储桶后,即具有权限,策略等,您希望删除旧存储桶。
C.删除/删除旧存储桶
$ aws s3 rb --force s3://old-bucket-name
我以为您现在可能已经找到了一个好的解决方案,但是对于其他遇到此问题的人(就像我最近一样),我精心设计了一个简单的实用程序,专门用于将一个S3存储桶镜像到另一个S3存储桶。高度并发,但CPU和内存高效的方式。
它在Apache许可下的github上:https : //github.com/cobbzilla/s3s3mirror
如果您决定尝试一下,如果您有任何反馈意见,请告诉我。
--cross-account-copy
选择-C
)可以做到这一点。请注意,跨帐户复制时,不会复制ACL 。目标存储桶的所有者将对复制的数据拥有完全权限。
AWS CLI提供了一种在并行进程中将一个存储桶复制到另一个存储桶的方法。取自https://stackoverflow.com/a/40270349/371699:
以下命令将告诉AWS CLI使用1,000个线程来执行作业(每个文件或一个多部分副本的一部分)并预执行100,000个作业:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
运行这些命令后,可以使用简单的sync命令,如下所示:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
在m4.xlarge机器上(在AWS--4内核中,具有16GB RAM),对于我的情况(3-50GB文件),同步/复制速度从大约9.5MiB / s变为700 + MiB / s,速度提高了是默认配置的70倍。