AWS Lambda - downloading a file, and using it in the same function - nodejs

20,624

Solution 1

The only available local file system you can write to in Lambda is /tmp so make sure the path for the local file you are trying to write to is in the /tmp directory and you should be all set.

Solution 2

Just note as of last year (2020) Lambdas support EFS as a mount as well so you can write to EFS mount point. Excessive for your case..but it might help for someone doing large file processing https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/

Share:
20,624

Related videos on Youtube

Brij Raj Singh - MSFT
Author by

Brij Raj Singh - MSFT

Sr. Software Engineer, CSE (Microsoft) Hi, I am Brij, and I am a Senior Software Engineer in Commercial Software Engineering at Microsoft.

Updated on April 08, 2021

Comments

  • Brij Raj Singh - MSFT
    Brij Raj Singh - MSFT over 2 years

    I have some certificate files over s3 (public) and I am to download and use these files in my code, If I write an equivalent code in nodejs at my local, it just runs fine, but in AWS lambda it just crashes.

    var apn = require('apn');
    var https = require('https');
    var fs = require('fs');
    
    exports.handler = function(event, context) {
      console.log("Running aws apn push message function");
      console.log("==================================");
      console.log("event", event);
    
      var certPath = event.certPath;
      var keyPath = event.keyPath;
      var certFileName = event.certFileName;
      var keyFileName = event.keyFileName;
      var passphrase = event.passphrase;
      var apnId = event.apnId;
      var content = event.content;
    
    
    var certfile = fs.createWriteStream(certFileName);
    var certrequest = https.get(certPath, function(certresponse) {
      certresponse.pipe(certfile);
      console.log("downloaded the certificate");
    
      var keyfile = fs.createWriteStream(keyFileName);
      var keyrequest = https.get(keyPath, function(keyresponse) {
        keyresponse.pipe(keyfile);
        console.log("downloaded the key file");
    
    
      var options = { 
                          "cert":certFileName,
                          "key":keyFileName,
                          "passphrase":passphrase,
                          "batchFeedback": true,
                          "interval": 10
                          };
    
      var apnConnection = new apn.Connection(options);
    
      var myDevice = new apn.Device(apnId);
      var note = new apn.Notification();
      note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.        
      note.payload = {'COMMAND': content};       
      apnConnection.pushNotification(note, myDevice);
      console.log('message sent to ' + apnId);       
    
      context.done();
    
      });
    });
    }
    

    Error I get is related to accessing files i suppose -

    events.js:72 
     throw er; // Unhandled 'error' event 
     ^ 
    Error: EACCES, open 'PushChatCert.pem'
    

    So while on AWS Lambda is there some specific concerns when one is downloading a file and using it, related to its path or something, where do the files stay when they get downloaded, in fact I don't even see the log of file getting downloaded.