为了账号安全,请及时绑定邮箱和手机立即绑定

在没有服务器的情况下在 s3 存储桶之间移动大文件(500GB 或更多)

在没有服务器的情况下在 s3 存储桶之间移动大文件(500GB 或更多)

holdtom 2022-11-29 17:13:38
我有一个小的 Python 脚本,它运行一个 Lambda 作业,以便在文件上传后立即将文件从不受限制的 s3 存储桶移动到受限制的 s3 存储桶。最初的目标是 50GB 文件,现在是 500GB 文件(或更大)的目标。Lambda 容器在 15 分钟时停止,我只能在 Lambda 超时结束前传输大约 100GB。s3_resource = boto3.resource('s3')  #for s3 delete function... other stuff ...s3_resource.meta.client.copy(Bucket=target_bucket, Key=key, CopySource=copy_source, ExtraArgs={'ServerSideEncryption':'AES256'})#boto3 manual states s3_resource.meta.client.copy "is a managed transfer which will perform a multipart copy in multiple threads if necessary."我环顾四周,发现的选择是:使用 ECS 容器运行作业,由 s3 事件和 lambda 触发使用 Step Functions 为持续时间超过 15 分钟的分段上传生成循环我还没有使用以太服务。ECS 与 Step Function 的优缺点是什么?我可以调整他们的其他方式(代码或设置)以获得更高的文件传输限制。更新 1 系统详细信息。“公共”存储桶与 SFTP 服务一起使用。这将取代 Linux 机器上的 SFTP 服务器。当一个文件被发送给我时,Lambda 会检查它在内部需要放置的位置。当我使一个文件可供下载时,该文件所在目录的 lambda 会将其放置在正确的 SFTP 目录中。在给定窗口之后存储桶策略存档文件,除非再次需要,否则不允许下载它们。目标是发送给我的文件不会保留在公开/SFTP 公开的存储桶中。当文件被发布以供下载时,它们只存在一段设定的时间。虽然我的内部存储桶保留并使用文件。即使有 SFTP 访问控制层,我也希望外部暴露的存储桶大部分是空的。更新 1 Step Function multipart upload example found我找到了一个示例,其中包含一些分段上传的代码片段(顺序 [a, then b, then c...] 和并行部分 [a, b, and c, and then ...] )。它看起来确实像很多会话 ID 管理。不同的是,我不想在长时间不看之后在 6 个月内解决问题。
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

您可以使用 S3 复制功能。这将允许您复制第一个 S3 中的信息并将其复制到不同的 AWS 区域(跨区域复制),或者您可以在同一 AWS 区域中跨存储桶复制对象。此功能在 S3 中可用,如下图所示。

现在,Lambda 中的 15 分钟限制是硬性限制。此外,如果您的代码持续时间超过 15 分钟,那么 lambda 就不是一个合适的解决方案。


查看完整回答
反对 回复 2022-11-29
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

一个非常简单的解决方案是使用 Amazon EC2 实例而不是 AWS Lambda 函数。

如果您可以将文件放在第一个存储桶中一段时间,那么您可以简单地定期运行该实例(例如一天两次)。如果您需要它更快地工作,您可以使用Lambda 函数在出现新文件时启动 EC2 实例

Amazon EC2 实例实际上成本非常低。只有一个t2.nano实例$0.0058 per Hour,您只需按秒付费。

流程将是:

  • 创建新对象时触发Amazon S3 事件,该对象运行 AWS Lambda 函数

  • AWS Lambda 函数启动现有的 Amazon EC2实例

  • EC2 实例有一个脚本,在/var/lib/cloud/scripts/per-boot/每次启动时自动执行(不仅仅是第一次启动):

aws s3 mv --recursive . s3://target-bucket/

aws s3 mv --recursive . s3://target-bucket/

sudo shutdown now -h

这会将文件移动到目标存储桶,这意味着文件将被复制然后删除。如果多个文件彼此靠近上传,则不会出错,因为 Lambda 函数只会尝试启动一个已经启动的实例。该mv行是有意复制的,以便在复制期间上传更多文件时再次运行。(它可以写得更聪明以检查文件并保持循环。)

虽然t2.nano实例的网络带宽有限,但它应该足以复制大型对象,因为它只是将CopyPart()消息发送到 S3,而不是传输数据本身。


查看完整回答
反对 回复 2022-11-29
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信