JBM
JBM

Reputation: 473

Download image from S3 bucket to Lambda temp folder (Node.js)

Good day guys.

I have a simple question: How do I download an image from a S3 bucket to Lambda function temp folder for processing? Basically, I need to attach it to an email (this I can do when testing locally).

I have tried:

s3.download_file(bucket, key, '/tmp/image.png')

as well as (not sure which parameters will help me get the job done):

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

Like I said, simple question, which for some reason I can't find a solution for.

Thanks!

Upvotes: 17

Views: 30494

Answers (4)

shreya sood
shreya sood

Reputation: 1

I was having the same problem, and the issue was that I was using Runtime.NODEJS_12_X in my AWS lambda.

When I switched over to NODEJS_14_X it started working for me :').

Also

The /tmp is required. It will directly write to /tmp/file.ext.

Upvotes: 0

Dean Vollebregt
Dean Vollebregt

Reputation: 94

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

Upvotes: 3

Seafish
Seafish

Reputation: 2271

If you're writing it straight to the filesystem you can also do it with streams. It may be a little faster/more memory friendly, especially in a memory-constrained environment like 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);

Upvotes: 14

Jonathan Seed
Jonathan Seed

Reputation: 2017

You can get the image using the aws s3 api, then write it to the tmp folder using fs.

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

Out of curiousity, why do you need to write the file in order to attach it? It seems kind of redundant to write the file to disk so that you can then read it from disk

Upvotes: 15

Related Questions