2016-08-16 46 views
0

良い一日の男の子。S3バケットからLambda tempフォルダ(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); 
    } 
}); 

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

ありがとうございます!

答えて

4

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

奇妙なことに、なぜあなたはファイルを添付するために書き込む必要がありますか?ファイルをディスクに書き込むことは冗長であるため、ディスクから読み込むことができます。

+0

私はSendGridを使用していますので、添付ファイルをローカルディスク上に存在させる必要があります。これは必ずしも必要というわけではありませんか? – Breeds

+0

私はSendGridに慣れていないので、わかりませんが、私はあなたの意見をメモリにダウンロードして、ファイルサイズに応じて問題になると考えていました。 –

+0

@JonathanSeed私は実際にこの問題を抱えています。私は、getObjectで150〜200MBのテキストファイルを読み込んでいます。これは私のラムダ関数を最大メモリ制限に達するようにします。回避策がありますか、またはメモリ制限がそれほど低いのはなぜですか? –

0

ファイルシステムに直接書き込む場合は、do it with streamsでも可能です。ラムダのようなメモリが制約された環境では、少し速く/よりメモリにやさしいかもしれません。

var fs = require('fs'); 

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); 
関連する問題