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