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

我在Amazon S3存储桶中拥有数百万个文件,并且希望尽可能以最低成本或无成本将这些文件移动到其他存储桶和文件夹。 所有的桶都在同一个区域。

我怎么能这样做?

    数百万是一个很大的数字 – 我会在稍后回顾。

    不pipe你的方法如何,底层机制需要直接从一个桶复制到另一个桶中 – 这样(因为你的桶在同一个区域),你不需要为带宽收费。 任何其他方法都是低效的(例如下载和重新上传文件)。

    在桶之间复制是通过使用“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美元)的一百万件物品。 因为最后你必须在目标存储桶上创build文件,其他方法(比如tar文件夹,Amazon导入/导出等)不会绕过这个成本。 无论如何,如果你有超过两百万的物品转移,那么与亚马逊联系可能是值得的。

    鉴于上述(不可避免的价格),接下来要研究的是时间,这将是复制“数百万个文件”时的一个重要因素。 所有可以执行桶之间直接复制的工具都会产生相同的费用。 不幸的是,您需要每个文件(要复制)一个请求,一个删除请求以及一个读取ACL数据的请求(如果您的文件具有不同的ACL)。 最好的速度将来自任何可以运行最平行的操作。

    有一些命令行方法可能相当可行:

    • s3cmd-modification (特定的拉取请求)包含并行的cp和mv命令,应该是一个很好的select。
    • AWS控制台可以直接执行复制 – 我不能说它是多么平行。
    • 蒂姆·凯的aws脚本可以做副本 – 但不是平行的 – 你需要脚本来运行你想要的完整副本(在这种情况下可能不是最好的select – 尽pipe这是一个很棒的脚本)。
    • CloudBerry S3资源pipe理器 , Bucket Explorer和CloudBuddy应该都可以执行任务,但我不知道每个堆栈的效率如何。 我相信,虽然大多数这些的multithreadingfunction需要购买的软件。
    • 使用其中一个可用的SDK编写脚本。

    有一些s3fs可能工作的可能性 – 这是相当平行的,是否支持同一个桶之间的副本 – 不支持不同桶之间的副本,但可能支持不同桶之间的移动。

    我会从s3cmd修改开始,看看你是否有任何成功,或与亚马逊联系,以获得更好的解决scheme。

    我不确定这是最好的方法,但AWSpipe理控制台具有剪切/复制/粘贴function。 非常容易使用和高效。

    我想现在你可能已经find了一个很好的解决scheme,但是对于遇到这个问题的其他人(就像我刚才那样),我已经制作了一个简单的工具,专门用于将一个S3存储桶镜像到另一个高度并发,但CPU和内存有效的方式。

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

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

    在丢失的存储桶中,select您想要复制到另一个存储桶的文件。

    • 在操作下,select“复制”。
    • 去获得桶。
    • 在“操作”下方,select“粘贴”

    老主题,但这是任何人调查相同的情况。 随着时间,我花了20000多件物品。 在AWS Linux / Centos上运行,每个对象大部分都是图像,还有一些video和各种媒体文件。

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

    A.创build新的存储桶

     $ 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分钟

    一旦新桶被正确configuration,即权限,政策等,你希望删除旧的桶。

    C.删除/删除旧的桶

     $ aws s3 rb --force s3://old-bucket-name