将图像从S3 bucket下载到Lambda temp文件夹(Node.js)

将图像从S3 bucket下载到Lambda temp文件夹(Node.js),node.js,amazon-web-services,amazon-s3,aws-lambda,sendgrid,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,Sendgrid,大家好 我有一个简单的问题:如何将图像从S3存储桶下载到Lambda function temp文件夹进行处理?基本上,我需要将其附加到电子邮件中(在本地测试时可以这样做) 我试过: s3.download_file(bucket, key, '/tmp/image.png') 以及(不确定哪些参数将帮助我完成工作): 就像我说的,这是一个简单的问题,出于某种原因我找不到解决办法 谢谢 您可以使用aws s3 api获取映像,然后使用fs将其写入tmp文件夹 var params = {

大家好

我有一个简单的问题:如何将图像从S3存储桶下载到Lambda function temp文件夹进行处理?基本上,我需要将其附加到电子邮件中(在本地测试时可以这样做)

我试过:

s3.download_file(bucket, key, '/tmp/image.png')
以及(不确定哪些参数将帮助我完成工作):

就像我说的,这是一个简单的问题,出于某种原因我找不到解决办法


谢谢

您可以使用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);   
  }); 
});

出于好奇,为什么需要编写文件才能附加它?将文件写入磁盘,这样您就可以从磁盘读取文件,这似乎有点多余。如果您直接将文件写入文件系统,您也可以这样做。它可能会更快一些/对内存更友好,特别是在内存受限的环境中,如Lambda

var fs = require('fs');
var path = require('path');

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);

我使用的是SendGrid,因此似乎必须将文件存在于本地磁盘上才能附加它。你是说这不一定是必需的吗?我对SendGrid一点也不熟悉,所以我不确定,但我的想法是你会把它下载到内存中,我认为这可能是一个取决于文件大小的问题。@Jonathansed我实际上遇到了一个问题,我正在使用
getObject
读取一个150-200mb的文本文件,这使我的Lambda函数达到其最大内存限制。是否有解决方法或内存限制为何如此低?@V.Samma您可以在控制台的“高级设置”下为lambda功能配置内存。我相信默认值是128MB。@Jonathansed我可能不够清楚。通过达到其最大内存限制,我的意思是我已经为lambda函数设置了最大内存,即1536MB,当lambda函数尝试读取2个文件(一个数KB-s,一个150-200MB-s)时,就会达到此限制然后将它们连接为字符串值,并将结果写回S3。您知道是
createReadStream()
make
aws sdk
触发多个GET调用,还是只执行一个GET调用,然后流式传输数据?我担心这一解决方案的成本。这条路是什么?@Cinn我相信它应该只触发一个GET呼叫。它与常规getObject做相同的事情,但只公开底层对象stream@VikasSatpute我编辑了添加路径,谢谢你打电话给我。请在你的答案中添加一些细节
var fs = require('fs');
var path = require('path');

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);
// Using NodeJS version 10.0 or later and promises

const fsPromise = require('fs').promises;

try {
    const params = {
        Bucket: 's3Bucket',
        Key: 'file.txt',
    };

    const data = await s3.getObject(params).promise();

    await fsPromise.writeFile('/tmp/file.txt', data.Body);

} catch(err) {
    console.log(err);
}