2016-05-17 63 views
3

我正在嘗試編寫一個lambda腳本,可以從站點中提取圖像並將其存儲在S3中。我遇到的問題是將什麼樣的對象作爲Body屬性傳遞給S3.putObject方法。在文檔here它說它應該是new Buffer('...') || 'STRING_VALUE' || streamObject,但我不知道如何將https響應轉換爲其中之一。以下是我試過的:aws lambda如何在S3中存儲通過https檢索的圖像

var AWS = require('aws-sdk'); 
var https = require('https'); 
var Readable = require('stream').Readable; 
var s3 = new AWS.S3(); 
var fs = require('fs'); 

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png'; 

exports.handler = function(event, context) { 
    https.get(url, function(response) { 
    var params = { 
    Bucket: 'example', 
    Key: 'aws-logo.png', 
    Body: response // fs.createReadStream(response); doesn't work, arg should be a path to a file... 
        // just putting response errors out with "Cannot determine length of [object Object]" 
    }; 

    s3.putObject(params, function(err, data) { 
     if (err) { 
     console.error(err, err.stack); 
     } else { 
     console.log(data); 
     } 
    }); 
    }); 
}; 
+0

請參考http://stackoverflow.com/questions/19016130/pushing-binary-data-to -amazon-s3-using-node-js – Shibashis

+0

如果我沒有弄錯,看起來在這個例子中,腳本正在本地機器上運行,它們使用curl將文件保存到磁盤,然後創建一個流與該保存的文件的路徑。由於我在lambda上,我無法將文件保存到磁盤 – kleaver

+0

「由於我在lambda上,我無法將文件保存到磁盤」。這是不正確的。您可以在Lambda上使用磁盤空間臨時存儲文件。 –

回答

3

正如評論中所示,Lambda允許將文件保存在/tmp中。但你並不需要它...

response不包含文件的內容,但是http響應(帶有它的狀態碼和頭文件)。

你可以嘗試這樣的事:

var AWS = require('aws-sdk'); 
var https = require('https'); 
var s3 = new AWS.S3(); 

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png'; 

exports.handler = function(event, context) { 
    https.get(url, function(res) { 
    var body = ''; 
    res.on('data', function(chunk) { 
     // Agregates chunks 
     body += chunk; 
    }); 
    res.on('end', function() { 
     // Once you received all chunks, send to S3 
     var params = { 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: body 
     }; 
     s3.putObject(params, function(err, data) { 
     if (err) { 
      console.error(err, err.stack); 
     } else { 
      console.log(data); 
     } 
     }); 
    }); 
    }); 
}; 
+0

只是爲了記錄「s3」在這裏是未定義的,我不得不補充: '''var s3 = new AWS.S3();'''' –

+0

@EliAlbert答案更新:) –

3

試試這個包https://www.npmjs.com/package/request

var request = require('request'); 

exports.handler = function (event, context) { 
    s3.putObject({ 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: request.get(url, {followRedirect: false}) 
    }, function (err, data) { 
     if (err) console.error(err, err.stack); 
     else console.log(data); 
    }) 
} 
+0

這會工作正常,但' request'模塊不在覈心節點中,所以我選擇@ alexis-no answer,因爲它不需要加載額外的模塊 – kleaver

相關問題