将图像从 S3 存储桶下载到 Lambda 临时文件夹 (Node.js)

Download image from S3 bucket to Lambda temp folder (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);
    }
});

就像我说的,简单的问题,出于某种原因我找不到解决方案。

谢谢!

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

出于好奇,为什么你需要写文件才能附加它?将文件写入磁盘似乎有点多余,这样您就可以从磁盘读取它

如果您直接将其写入文件系统,您也可以 do it with streams。它可能有点 faster/more 内存友好,尤其是在像 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);
// 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);
}