aws lambda如何在S3中存储通过https检索的图像
我正在尝试编写一个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);
}
});
});
};
正如评论中所示,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);
}
});
});
});
};
只是为了记录“s3”在这里是未定义的,我不得不补充: '''var s3 = new AWS.S3();'''' –
@EliAlbert答案更新:) –
试试这个包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);
})
}
这会工作正常,但' request'模块不在核心节点中,所以我选择@ alexis-no answer,因为它不需要加载额外的模块 – kleaver
请参考http://*.com/questions/19016130/pushing-binary-data-to -amazon-s3-using-node-js – Shibashis
如果我没有弄错,看起来在这个例子中,脚本正在本地机器上运行,它们使用curl将文件保存到磁盘,然后创建一个流与该保存的文件的路径。由于我在lambda上,我无法将文件保存到磁盘 – kleaver
“由于我在lambda上,我无法将文件保存到磁盘”。这是不正确的。您可以在Lambda上使用磁盘空间临时存储文件。 –