2016-07-28 95 views
7

我需要創建一個Zip文件,該文件包含位於我的s3存儲桶中的一系列文件(視頻和圖像)。使用Lambda節點從S3上的文件創建S3上的zip文件

目前使用我的代碼下面的問題是,我很快就達到了Lambda的內存限制。

async.eachLimit(files, 10, function(file, next) { 
    var params = { 
     Bucket: bucket, // bucket name 
     Key: file.key 
    }; 
    s3.getObject(params, function(err, data) { 
     if (err) { 
      console.log('file', file.key); 
      console.log('get image files err',err, err.stack); // an error occurred 
     } else { 
      console.log('file', file.key); 
      zip.file(file.key, data.Body); 
      next(); 
     } 
    }); 
}, 
function(err) { 
    if (err) { 
     console.log('err', err); 
    } else { 
     console.log('zip', zip); 
     content = zip.generateNodeStream({ 
      type: 'nodebuffer', 
      streamFiles:true 
     }); 
     var params = { 
      Bucket: bucket, // name of dest bucket 
      Key: 'zipped/images.zip', 
      Body: content 
     }; 
     s3.upload(params, function(err, data) { 
      if (err) { 
       console.log('upload zip to s3 err',err, err.stack); // an error occurred 
      } else { 
       console.log(data); // successful response 
      } 
     }); 
    } 
}); 
  • 這可能使用LAMBDA,或者我應該看不同的 的方法嗎?

  • 是否可以即時寫入壓縮的zip文件,從而在某種程度上消除內存問題,還是需要在壓縮之前收集文件?

任何幫助將不勝感激。

回答

1

使用流可能會非常棘手,因爲我不知道如何將多個流傳送到對象中。我已經使用標準文件對象多次完成此操作。這是一個多步驟的過程,速度非常快。請記住,Lambda在Linux中運行,因此您擁有所有Linux資源,包括system/tmp目錄。

  1. 創建/ tmp中調用一個子目錄「暫時」或任何你
  2. 使用s3.getObject()的作品,寫文件對象到/ tmp /短暫性
  3. 使用GLOB包生成來自/ tmp/transient的數組[]的路徑
  4. 循環數組和zip.addLocalFile(array [i]);
  5. zip.writeZip('tmp/files.zip');
+0

我可以看到的唯一問題是,lambda在tmp目錄中被限制爲500MB存儲空間。在這種情況下,它也會限制最終的郵編大小。 – Rabona

+1

不知道您是否在運行.zip過程中的任何文件處理,但是使用該數據量時,您希望確保您的功能可以在5分鐘的執行時間範圍內完成。我的最大數據量通常爲每次執行20-25毫克左右。 –

+0

@Rabona你是否設法通過lambda解決這個問題?我有同樣的問題。我們需要用大約100Mb的圖像壓縮1.5GB的視頻文件。我們耗盡內存。我們還嘗試了使用相同圖像的較小視頻文件(〜1GB)並獲取超時。希望你可能已經發現了一些有用的東西,可以幫助我們。 – Forer