10

I've created a node lambda function that does a simple call to an Aurora database. When I test the function in the console, the query returns, I can see the results in the log, but the callback never seems to get called and so my lambda function times out. I can't figure out what the problem is. Hopefully someone here can point me to the problem.

var mysql = require("mysql"); module.exports.handler = function(event, context, cb) { console.log('start\n'); var con = mysql.createConnection({ ... }); console.log('call data\n'); con.query('SELECT * FROM Tags', function(err, rows) { console.log('Data received from Db:\n'); console.log(rows); console.log('calling callback'); cb(null, 'Success'); console.log('callback called'); }); console.log('data called\n'); }; 

The resulting Cloudwatch log is as follows...

2016-07-25T14:20:05.343Z daf5cd6b-5272-11e6-9036-e73ad17006df start 2016-07-25T14:20:05.398Z daf5cd6b-5272-11e6-9036-e73ad17006df call data 2016-07-25T14:20:05.405Z daf5cd6b-5272-11e6-9036-e73ad17006df data called 2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df Data received from Db: 2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df [ RowDataPacket { id: 1, externalId: 'a87ead34de7e', orgId: 1, name: 'lacinia sapien', createdDate: 1448598369, modifiedDate: 0 }, ..., RowDataPacket { id: 50, externalId: '9ebaaab372e3', orgId: 1, name: 'et commodo', createdDate: 1451551837, modifiedDate: 0 } ] 2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df calling callback 2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df callback called END RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df REPORT RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df Duration: 300000.12 ms Billed Duration: 300000 ms Memory Size: 1024 MB Max Memory Used: 52 MB 2016-07-25T14:25:05.341Z daf5cd6b-5272-11e6-9036-e73ad17006df Task timed out after 300.00 seconds 
3
  • Can you post the body of your callback function along with how cb is being populated? Commented Jul 25, 2016 at 14:55
  • The callback function is provided by Lambda when using node version 4.3. When my logic is finished I call the Lambda provided callback function to indicate that my logic is finished and any errors or return data is provided (the parameters for the callback function respectively). Commented Jul 25, 2016 at 15:04
  • You're not waiting for the connection to finish before submitting the query. Commented Jul 25, 2016 at 20:25

1 Answer 1

25

Thanks to this question...

Lambda Timing out after calling callback

I found the problem. the Node mysql module keeps the connection open until the server closes it unless it is explicitly closed by the handler logic.

So the node event loop never empties and so never returns the callback. In the above code, I did a ...

con.end(); 

before calling the callback and it worked.

Sign up to request clarification or add additional context in comments.

4 Comments

OR you add context.callbackWaitsForEmptyEventLoop = false at the top of your Lambda!
Thanks @MrkFldig ! I have forgotten that... my app use mongodb (the same behavior of mysql)
Also I’d pass the connection from the wrapper to handler containers are re-used a lot more than you in Lambda
Took me way too long to find this, but this was my problem! Same issue when using the mysql module.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.