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

Dan*_*ier 50 files cloud storage amazon-s3

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

我怎么能做到?

cyb*_*x86 55

百万是一个很大的数字——我稍后再谈。

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

存储桶之间的复制是通过使用“PUT 复制”来完成的——这是一个包含“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 导入/导出等)将无法解决此成本。尽管如此,如果您要传输的对象超过几百万,那么联系亚马逊可能是值得的。

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

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

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

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

我会从 s3cmd-modification 开始,看看你是否有任何成功,或者联系亚马逊以获得更好的解决方案。

  • `aws s3 sync s3://source s3://destination` 在哪里适合? (4认同)

小智 12

老话题,但这适用于调查相同场景的任何人。随着我花费的时间,为 20,000 多个对象。在 AWS Linux/Centos 上运行,每个对象大部分都是图像,以及一些视频和各种媒体文件。

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

A. 创建新的bucket

$ aws s3 mb s3://new-bucket-name
Run Code Online (Sandbox Code Playgroud)

B. 将旧桶与新桶同步

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Run Code Online (Sandbox Code Playgroud)

复制 20,000 多个对象...

17:03 开始

17:06 结束

20,000 多个对象的总时间 = 大约 3 分钟

一旦正确配置了新存储桶,即权限、策略等,并且您希望删除旧存储桶。

C. 移除/删除旧的bucket

$ aws s3 rb --force s3://old-bucket-name
Run Code Online (Sandbox Code Playgroud)


小智 5

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

  • 这不太可能处理一百万个文件。 (8认同)
  • @James 可以痛苦地确认这一点;) (2认同)

tim*_*fly 5

AWS CLI 提供了一种在并行进程中将一个存储桶复制到另一个存储桶的方法。摘自/sf/answers/2818924461/

以下命令将告诉 AWS CLI 使用 1,000 个线程来执行作业(每个是一个小文件或多部分副本的一部分)并展望 100,000 个作业:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Run Code Online (Sandbox Code Playgroud)

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

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Run Code Online (Sandbox Code Playgroud)

在 m4.xlarge 机器上(AWS--4 核,16GB RAM),就我而言(3-50GB 文件),同步/复制速度从大约 9.5MiB/s 上升到 700+MiB/s,速度增加了比默认配置高 70 倍。