【问题标题】:Stream and zip to S3 from AWS Lambda Node.JS从 AWS Lambda Node.JS 流式传输并压缩到 S3
【发布时间】:2019-08-30 15:04:55
【问题描述】:

我的目标是创建一个大的压缩文本文件并将其放入 S3。

文件内容由我从另一个来源循环读取的块组成。

由于此文件的大小,我无法将所有数据保存在内存中,因此我需要以某种方式将其同时直接流式传输到 S3 和 ZIP。

我了解如何使用 Node.JS 中的常规 fs 执行此技巧,但我很困惑是否可以使用 AWS Lambda 中的 S3 执行相同的技巧?我知道s3.putObject can consume streamObject,但在我看来,当我执行putObject 操作时,这个流应该已经完成​​了,什么会导致超出允许的内存。

【问题讨论】:

  • 压缩后的文件是否大于 Lambda 临时磁盘 (512 MB) 的容量?
  • @jarmod 可能没有,但假设我受到 128Mb lambda 的限制
  • 如果您可以摄取整个文本文件,以 gzip 格式保存到本地磁盘,然后在 Lambda 超时时间内将其全部上传到 S3,那么这应该很简单。想必大家可以使用分段上传到 S3 (docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html) 来避免一次无法将整个文件读入内存的问题。
  • 文件在哪里?它可以在本地应用程序使用还是需要通过 http 读取?我们在这里讨论的文件大小是多少?
  • 所以解决方案本质上是将所有内容存储在内存中(例如临时磁盘),对吗?

标签: node.js amazon-web-services amazon-s3 aws-lambda aws-sdk-nodejs


【解决方案1】:

您可以使用 NodeJs aws-sdk 中的 multipart upload functions 将文件 (>5mb) 流式传输到 S3 存储桶中。

这不仅有助于将大文件流式传输到存储桶中,还可以让您重试失败的块(而不是整个文件)和并行化单个块的上传(使用多个上传 lambda,例如,这在无服务器 ETL 设置中可能很有用)。它们到达的顺序并不重要,只要您跟踪它们并在全部上传后完成流程即可。

要使用分段上传,您应该:

  1. 使用createMultipartUpload 初始化进程并存储返回的UploadId(你需要它来上传块)
  2. 实现一个Transform 流来处理来自输入流的数据
  3. 实现一个PassThrough 流,它会在使用uploadPart 将数据推送到S3 之前以足够大的块缓冲数据(在步骤1 中返回的UploadId 下)
  4. 跟踪从块上传返回的ETagsPartNumbers
  5. 使用跟踪的ETagsPartNumbers 在S3 上使用completeMultipartUpload 组装/完成文件

这是一个工作代码示例中的gist of it,它从iso.org 流式传输文件,通过gzip 将其通过管道传输到S3 存储桶中。不要忘记更改存储桶名称并确保在节点 6.10 上运行具有 512mb 内存的 lambda。由于没有外部依赖项,因此您可以直接在 Web GUI 中使用代码。

注意:这只是我为了演示目的而放在一起的概念证明。对于失败的块上传没有重试逻辑,并且几乎不存在错误处理,这可能会让您付出代价(例如,abortMultipartUpload 应该在取消整个过程以清理上传的块时被调用,因为它们仍然被存储并且不可见 在 S3 上,即使最终文件从未组装过)。正在暂停输入流,而不是排队上传作业并利用backpressure 流机制等。

【讨论】:

  • 您的回答并没有解决 OP 的问题,即如何在不读取和 gzip 整个文件的情况下压缩块。
  • 怎么样?输入从输入流通过 gzip 和块部分通过管道传输。
  • 你验证了吗? gzip 不能进行增量压缩。
  • 据我所知,它按预期工作。如果我在管道到 gzip 之前通过 PassThrough 过滤器管道 inputStream,我可以看到字节在整个管道中移动,而不是 gzip 在压缩之前必须摄取整个内容。也许我错过了什么?
  • 你没有得到完整的问题。您可以在不解压缩或仅附加读取现有存档的情况下将新文件添加到现有 gzip 吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多