1

流式传输并压缩到S3我的目标是创建一个大的gzip文本文件并将其放入S3。从AWS Lambda Node.JS

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

由于这个文件的大小我不能保存所有的数据在内存中,所以我需要以某种方式直接流到S3和ZIP在同一时间。

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

+0

gzip文件是否大于Lambda临时磁盘(512 MB)? – jarmod

+0

@jarmod可能不是,但假设我受限于128Mb lambda – Andremoniy

+0

如果您可以接收整个文本文件,请将gzip格式保存到本地磁盘,并在Lambda超时内将其上传到S3,然后这应该足够简单。您大概可以使用分段上传至S3(http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html)来避免无法将整个文件一次读入内存的问题。 – jarmod

回答

0

您可以在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组装/使用completeMultipartUpload

下面是在一个工作码示例的gist of it从流文件完成S3的文件iso.org,通过gzip管道并进入S3存储桶。不要忘记更改存储桶名称,并确保在节点6.10上运行512MB内存的lambda。由于没有外部依赖关系,因此可以直接在Web GUI中使用代码。

备注:这仅仅是为了演示目的而放在一起的概念证明。没有失败的块上传重试逻辑和几乎不存在的错误处理几乎不会花费你(例如abortMultipartUpload应取消整个过程来清理上传的块,因为它们仍然存储和隐形上S3尽管最终文件从未汇编)。输入流暂停而不是排队等待上传作业并利用流机制等。

+0

你的回答并没有解决OP如何在没有阅读和gzip整个文件的情况下gzip块的问题。 – Kannaiyan

+0

如何?输入是通过输入流通过gzip和chunk部分上传的。 –

+0

你确认了吗? gzip不能做增量压缩。 – Kannaiyan