python - 在没有服务器的 s3 存储桶之间移动大文件(500GB 或更多)
问题描述
我有一个小的 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 分段上传示例
我找到了一个示例,其中包含多部分上传的一些代码片段(顺序 [a, 然后 b, 然后 c...] 和并行部分 [a, b, and c, 然后...] )。它看起来确实像很多会话 ID 管理。不同的是,在很长时间没有看它之后,我不想在 6 个月内遇到麻烦。
解决方案
一个非常简单的解决方案是使用 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,而不是传输数据本身。
推荐阅读
- ffmpeg - MOOV atom not found - 有没有办法从损坏的 mp4 中提取音频?
- ubuntu - Ubuntu 桌面应用程序会在 Ubuntu Touch OS 和使用 Electron 的设备上运行吗?
- monitoring - 有效监控?如何避免交替疲劳?
- python - 如何使用 python 在 dialogflow CX 中传递查询参数
- c# - RadGridView 子行中的用户控件 - Telerik Winforms
- python-3.x - 是否可以使用 api 将数据框保存到 atlassian 页面?
- python - 在数据中查找最大值和最小值并将 True/False 附加到相应的行 - Python
- r - 如何在闪亮的应用程序中使用 renv 包以避免在闪亮的服务器上安装新包?
- javascript - 在 Javascript 中,如何在再次触发后停止触发的声音?
- python - 根据相应列值的聚合有条件地填充 NA