gpt4 book ai didi

node.js - 从 AWS Lambda Node.JS 流式传输并压缩到 S3

转载 作者:搜寻专家 更新时间:2023-10-31 22:42:52 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

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

关于node.js - 从 AWS Lambda Node.JS 流式传输并压缩到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com