2016-08-16 48 views
0

美好的一天傢伙。從S3存儲桶下載圖像到Lambda臨時文件夾(Node.js)

我有一個簡單的問題:如何從S3存儲桶下載圖像到Lambda函數臨時文件夾進行處理?基本上,我需要將其附加到電子郵件(我可以在本地測試時執行此操作)。

我曾嘗試:

s3.download_file(bucket, key, '/tmp/image.png') 

以及(不知道哪些參數會幫我完成任務):

s3.getObject(params, (err, data) => { 
    if (err) { 
     console.log(err); 
     const message = `Error getting object ${key} from bucket ${bucket}.`; 
     console.log(message); 
     callback(message); 
    } else { 

     console.log('CONTENT TYPE:', data.ContentType); 
     callback(null, data.ContentType); 
    } 
}); 

就像我說的,簡單的問題,由於某種原因我找不到解決方案。

謝謝!

回答

4

您可以使用aws s3 api獲取圖像,然後使用fs將其寫入tmp文件夾。

var params = { Bucket: "BUCKET_NAME", Key: "OBJECT_KEY" }; 

s3.getObject(params, function(err, data){ if (err) { 
    console.error(err.code, "-", err.message); 
    return callback(err); } 

    fs.writeFile('/tmp/filename', data.Body, function(err){ 
    if(err) 
     console.log(err.code, "-", err.message); 

    return callback(err); 
    }); 
}); 

出於好奇,爲什麼你需要編寫文件以附加它?將文件寫入磁盤似乎有點多餘,以便您可以從磁盤讀取它

+0

我使用的SendGrid,所以它似乎是強制性的文件存在本地磁盤上附加它。你是說這不一定是必需的嗎? – Breeds

+0

我對SendGrid並不熟悉,所以我不確定,但我的想法是,你會將它下載到內存中,認爲這可能是一個問題,具體取決於文件大小。 –

+0

@JonathanSeed我實際上遇到了這個問題,我正在用'getObject'讀取一個150-200mb的文本文件,這使得我的Lambda函數達到了它的最大內存限制。有沒有解決方法或爲什麼內存限制如此之低? –

0

如果直接寫入文件系統,也可以使用do it with streams。它可能會更快一些/更符合內存,特別是在像Lambda這樣的內存受限的環境中。

var fs = require('fs'); 

var params = { 
    Bucket: "mybucket", 
    Key: "image.png" 
}; 

var tempFileName = path.join('/tmp', 'downloadedimage.png'); 
var tempFile = fs.createWriteStream(tempFileName); 

s3.getObject(params).createReadStream().pipe(tempFile); 
相關問題