web-dev-qa-db-ja.com

S3バケットからLambdatempフォルダー(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);
    }
});

私が言ったように、簡単な質問ですが、何らかの理由で解決策を見つけることができません。

ありがとう!

7
JBM

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

不思議なことに、ファイルを添付するためにファイルを書き込む必要があるのはなぜですか?ファイルをディスクに書き込んでディスクから読み取るのは冗長なようです。

8
Jonathan Seed

ファイルシステムに直接書き込んでいる場合は、 ストリームで行う もできます。特に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);
4
Seafish