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


44

我在Amazon S3存储桶中有数百万个文件,我想将这些文件移动到其他存储桶和文件夹中,且成本最低,如果可能的话,则不增加成本。所有存储桶都在同一区域中。

我该怎么办?

Answers:


53

数以百万计的数字很大-我稍后再讲。

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

各个存储区之间的复制是通过使用“ 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)。最好的速度将来自可以运行大多数并行操作的任何设备。

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

  • s3cmd-modification(特定的拉取请求)包括并行的cp和mv命令,应该是一个不错的选择。
  • AWS控制台可以直接执行复制-但是我不能说它的并行程度。
  • 蒂姆凯(Tim Kay)的aws脚本可以完成复制-但它不是并行的-您将需要对其进行脚本编写以运行所需的完整副本(在这种情况下,这可能不是最佳选择-尽管这是一个不错的脚本)。
  • 尽管我不知道每个组件的效率如何,但CloudBerry S3 ExplorerBucket ExplorerCloudBuddy都应该能够执行任务。我相信,尽管其中大多数具有多线程功能,但都需要购买该软件。
  • 使用可用的SDK之一编写自己的脚本。

s3fs可能有工作的可能-它非常并行,确实支持同一存储桶之间的副本-不支持不同存储桶之间的副本,但可能支持不同存储桶之间的移动。

我将从s3cmd-modification开始,看看您是否成功使用它,或者与Amazon联系以寻求更好的解决方案。


桶浏览器似乎对我来说运行良好(此刻在两个桶之间移动文件)
Noodles

3
aws s3 sync s3://source s3://destination适合在哪里?
奥利维尔·拉隆德

7

旧话题,但是这适用于研究相同场景的任何人。随着时间的流逝,我花了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

生命的救星。我要复制300 + GB。提示:如果您从同一区域中的存储桶中进行复制,则比在另一个区域中进行复制要快得多(我读过它的价格较低)。
MarceloAgimóvel18年

我对您的方法有疑问:文件隐私都设置为PRIVATE,即使大多数对象都是公共的,发生了什么?
MarceloAgimóvel18年


3

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

它在Apache许可下的github上:https : //github.com/cobbzilla/s3s3mirror

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


我在s3s3mirror方面有丰富的经验。我能够在m1.small EC2节点上进行设置,并在大约2个小时内复制了150万个对象。由于我不熟悉Maven和Java,因此安装有点困难,但是在Ubuntu上只需要执行几个apt-get命令即可安装所有内容。最后一点:如果(像我一样)担心在一个重要的大型s3存储桶上运行未知脚本,请创建一个特殊用户,该用户对“复制自”存储桶具有只读访问权限,并使用这些凭据。意外删除的机会为零。
米卡,2013年

可以将其应用于不同帐户之间的存储桶吗?
奥利弗·伯德金

@OliverBurdekin是的(有一种--cross-account-copy选择-C)可以做到这一点。请注意,跨帐户复制时,不会复制ACL 。目标存储桶的所有者将对复制的数据拥有完全权限。
cobbzilla '16

谢谢@rfcreader我如何估算这笔费用?我知道AWS成本计算器,但不知道此过程将涉及到puts ls请求等的数量。我认为使用CLI计算这些指标非常容易,但是如果您知道更多信息,请联系。AWS支持建议“请求者付费”。哈!
奥利弗·伯德金

@OliverBurdekin s3s3mirror确实按类型(GET,COPY,DELETE等)跟踪AWS请求的数量。这些统计信息会在运行时定期打印,最后一次输出。您可以进行有限/测试运行来复制对象的一小部分,这应该使您大致了解复制整个数据集需要多少个总请求。
cobbzilla '16

2

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


0

在丢失的存储桶中,选择要复制到另一个存储桶的文件。

  • 在“操作”下,选择“复制”。
  • 转到收益桶。
  • 在“操作”下,选择“粘贴”

1
为什么要重复别人一年前提到的解决方案?
本杰明·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.