如何以最低成本在两个 S3 存储桶之间移动文件?

如何以最低成本在两个 S3 存储桶之间移动文件?

我在 Amazon S3 存储桶中有数百万个文件,我想以最低成本或免费将这些文件移动到其他存储桶和文件夹。所有存储桶都位于同一区域。

我该如何做呢?

答案1

数百万是一个很大的数字——我稍后会回顾这一点。

无论你采用哪种方法,底层机制都需要直接从一个存储桶复制到另一个存储桶 - 这样(因为你的存储桶位于同一区域)你就不会产生任何带宽费用。任何其他方法都是低效的(例如下载并重新上传文件)。

存储桶之间的复制是通过使用“PUT copy”来完成的 - 这是一个包含“x-amz-copy-source”标头的 PUT 请求 - 我相信这被归类为 COPY 请求。这将复制文件,默认情况下还会复制关联的元数据。如果您想同时设置 ACL,则必须包含具有正确值的“x-amz-acl”(否则,它将默认为私有)。您将为您的 COPY 请求付费($0.01/1,000 个请求)。您可以在复制不需要的文件后将其删除(DELETE 请求不收费)。(我不太清楚的一点是 COPY 请求是否也会产生 GET 请求的费用,因为必须先从源存储桶中获取对象 - 如果是这样,则费用将为额外的 $0.01/10,000 个请求)。

上述费用似乎是不可避免的——对于一百万个对象,您需要支付大约 10 美元(或 11 美元)。由于最终您必须在目标存储桶上实际创建文件,因此其他方法(例如对文件进行 tar-gzip 压缩、Amazon Import/Export 等)无法避免此成本。尽管如此,如果您要传输的对象超过几百万个,联系亚马逊可能是值得的。

鉴于上述情况(不可避免的价格),接下来要考虑的是时间,这在复制“数百万个文件”时将是一个重要因素。所有可以在存储桶之间执行直接复制的工具都将收取相同的费用。不幸的是,您需要对每个文件发出一个请求(复制)、一个请求删除,并且可能还有一个请求读取 ACL 数据(如果您的文件有不同的 ACL)。最佳速度将来自可以运行最多并行操作的任何工具。

有一些命令行方法可能非常可行:

  • s3cmd-修改(该特定的拉取请求)包括并行 cp 和 mv 命令,对您来说应该是一个不错的选择。
  • AWS 控制台可以直接执行复制 - 尽管我无法说出它有多么并行。
  • Tim Kay 的 aws脚本可以进行复制 - 但它不是并行的 - 您需要编写脚本来运行您想要的完整副本(在这种情况下可能不是最好的选择 - 虽然它是一个很棒的脚本)。
  • CloudBerry S3 资源管理器存储桶资源管理器, 和云好友应该都可以完成这项任务,尽管我不知道每个程序的效率如何。但我相信大多数程序的多线程功能都需要购买软件。
  • 使用其中一个可用的 SDK 编写您自己的脚本。

s3fs 有可能起作用 - 它非常并行,支持同一存储桶之间的复制 - 不支持不同存储桶之间的复制,但是可能支持不同bucket之间的移动。

我将从 s3cmd-modification 开始,看看您是否成功,或者联系亚马逊寻求更好的解决方案。

答案2

老话题了,但对于任何调查相同场景的人来说都是如此。加上我花费的时间,共 20,000 多个对象。在 AWS Linux/Centos 上运行,每个对象大部分都是图像,还有一些视频和各种媒体文件。

使用 AWS CLI 工具将文件从存储桶 A 复制到存储桶 B。

A.创建新的存储桶

$ aws s3 mb s3://new-bucket-name

B. 将旧 bucket 与新 bucket 同步

$ 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

答案3

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

运行这些后,您可以使用如下简单的同步命令:

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 倍。

答案4

我想你现在可能已经找到了一个很好的解决方案,但是对于遇到此问题的其他人(就像我最近遇到的那样),我专门设计了一个简单的实用程序,用于以高度并发但 CPU 和内存高效的方式将一个 S3 存储桶镜像到另一个 S3 存储桶。

它在 GitHub 上,遵循 Apache 许可证:https://github.com/cobbzilla/s3s3mirror

如果您决定尝试一下,有任何反馈请告诉我。

相关内容