【问题标题】:right way to move large objects between folders/buckets in S3在 S3 中的文件夹/存储桶之间移动大对象的正确方法
【发布时间】:2021-05-19 13:35:46
【问题描述】:

我需要将一些大文件(1 TB 到 5 TB)从一个 S3 位置移动到同一存储桶中的不同目录或不同存储桶。

我能想到的更稳健的方法很少。

  1. 基于 ObjectCreated 触发 lambda 函数:Put 触发器并使用 boto3 将文件复制到新位置并删除源文件。干净利落。但是,如果在复制文件时出现任何错误,我将丢失该事件。我必须同时设计某种跟踪系统。

  2. 使用 same-region-replication 并在复制完成后删除源。我认为复制对象后不会发出任何事件,所以我不确定。

  3. 触发 Step 函数,并将 Copy 和 Delete 作为单独的步骤。这样,如果由于某种原因复制或删除步骤失败,我可以重新运行状态机。问题又来了,如果文件太大而 lambda 无法复制怎么办?

  4. 基于ObjectCreated:Put触发器触发一个lambda函数并创建一个数据管道并使用aws s3 mv移动文件。这可能有点贵。

这样做的正确方法是什么?

我正在寻找有关正确方法的建议。我不是在寻找代码。请不要发布aws s3 cpaws s3 mvaws s3api copy-object 一行命令。

【问题讨论】:

  • 这是一次性要求还是持续要求?也就是说,是否所有对象都已经存在,或者您希望在将来创建新对象时进行复制?请注意,S3 复制仅在创建对象时触发——它不适用于现有对象。此外,您是否愿意编写涉及多部分副本的代码?
  • 这是一个持续的解决方案。随着新对象的上传,它应该复制和删除。我可以用 shell 和 Python 编写代码。

标签: amazon-web-services amazon-s3


【解决方案1】:

您的情况似乎是:

  • 正在 Bucket A 中创建新对象
  • 您希望将它们“移动”到存储桶 B(或将它们移动到存储桶 A 中的其他位置)
  • 移动应该在对象创建后立即发生

当然,最简单的解决方案是在正确的位置创建对象而不需要移动它们。我会假设你有理由不能这样做。

回应你的概念:

  • 使用 AWS Lambda 函数:这是最简单且响应速度最快的方法。由于对象可能很大,因此代码需要进行多部分复制。如果出现不可恢复的错误,原始对象将留在源存储桶中以供以后重试。
  • 使用同区域复制:这是将对象复制到所需目的地的一种更简单的方法。 S3 可以将对象创建信息推送到 Amazon SQS 队列,以便稍后删除源对象时参考该队列。你是对的,时间安排会有点棘手。如果您可以暂时保留一些源文件,则可以定期处理队列(例如每 15 分钟)。
  • 使用 Step Function: 您需要一些东西来触发 Step Function(另一个 Lambda 函数?)。这可能是矫枉过正,因为第一个选项(使用 Lambda)可以在成功复制后删除源对象,而无需调用后续步骤。不过,Step Functions 或许能够提供一些重试功能。
  • 使用数据管道:不要。说得够多了。

使用 AWS Lambda 函数复制对象将需要它为对象的每个部分发送复制命令,从而执行多部分复制。这可以通过多个线程并行运行多个请求来加快速度。 (我没有在 Lambda 中尝试过,但应该可以。)

这种多线程已经在 AWS CLI 中实现。因此,另一种选择是触发调用以运行 AWS CLI aws s3 mv 命令的 AWS Lambda 函数(上面的#1)。是的,这是可能的,请参阅:How to use AWS CLI within a Lambda function (aws s3 sync from Lambda) :: Ilya Bezdelev。这种方法的好处是代码已经存在,可以工作,使用aws s3 mv会在复制成功后删除对象,而且运行速度非常快,因为AWS CLI并行实现了多部分复制。

【讨论】:

  • 我看到的分段上传的问题是首先我必须先下载文件。由于存储限制,使用 lambda 下载 3 TB 的文件也将不起作用。这也可能不具有成本效益。如果我在这里错了,请纠正我。
  • 不完全。您可以执行“多部分复制”,其中每个部分都来自 S3 中的现有部分。因此,您只是告诉 S3 将一个对象的一部分复制到新对象的一部分。这是复制大型对象的唯一方法,您会看到 AWS CLI 也是这样做的。见:Copying an object using multipart upload - Amazon Simple Storage Service
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多