farjam
farjam

Reputation: 2289

Cannot upload to AWS S3 inside my Lambda function

I have the following lambda function. It received an XML, looks through it, finds a base64 pdf file and tries to upload it to S3.

index.js

const AWS = require('aws-sdk');
const xml2js = require('xml2js');
const pdfUpload = require('./upload_pdf');
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    let attachment;
    xml2js.parseString(event.body, function(err, result) {      
      attachment = 
        result.Attachment[0].Data[0];

      if (attachment) {
        pdfUpload(attachment); 
      }

    });

    return {
      statusCode: 200
    }
};

upload_pdf.js

/**
 *
 * @param  {string}  base64 Data
 * @return {string}  Image url
 */
const pdfUpload = async (base64) => {

  const AWS = require('aws-sdk');
  const s3 = new AWS.S3();
  const base64Data = new Buffer.from(base64, 'base64');

  // With this setup, each time your user uploads an image, will be overwritten.
  // To prevent this, use a different Key each time.
  // This won't be needed if they're uploading their avatar, hence the filename, userAvatar.js.
  const params = {
    Bucket: 'mu-bucket',
    Key: `123.pdf`, 
    Body: base64Data,
    ACL: 'public-read',
    ContentEncoding: 'base64', 
    ContentType: `application/pdf` 
  }

  let location = '';
  let key = '';
  try {
    const { Location, Key } = await s3.upload(params).promise();
    location = Location;
    key = Key;
  } catch (error) {
     // console.log(error)
  }

  console.log(location, key);

  return location;
}

module.exports = pdfUpload;

No matter what I do, the file does not get uploaded. I have checked the permissions, and the lambda has access to the bucket. Running the lambda I'm not receiving any errors either. Can anybody see what might be wrong here?

Upvotes: 0

Views: 232

Answers (1)

qkhanhpro
qkhanhpro

Reputation: 5220

First, as an advice, I think you should put more logs to see at which steps the function is stuck / failing

The second thing you can try is to put await

        await pdfUpload(attachment); 

Upvotes: 1

Related Questions