JavaEar 专注于收集分享传播有价值的技术资料

"errorMessage": Task timed out after 3.00 seconds aws lambda nodejs lambda function trying to connect with RDS

I have written a simple lambda function in nodejs which queries data from amazon rds.(note : my lambda and rds are in default vpc with all ports open and also tried increasing time out in lambda)

My issue is when I test my lambda function I get log output with the queried data but I am also getting

Execution result: failed with "errorMessage": "2017-07-05T15:05:27.425Z 596fdf39-6193-11e7-9176-f58796899f9b Task timed out after 3.00 seconds" }

var mysql = require('mysql');

exports.handler = (event, context) => {
var con = mysql.createConnection({
  host: "testdb.cxyzu.ap-south-1.rds.amazonaws.com",
  user: "root",
  password: "mypassword",
  database: "test",
  port: "3306",
 // debug: true
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
 // var sql = "INSERT INTO users (id, name) VALUES (4, 'dfdd')";
var sql = "select * from test.users";
  con.query(sql, function (err, result) {
    if (err) throw err;
//    console.log("1 record inserted");
      console.log(result);
  });
});
//callback("sucess");
}

START RequestId: 596fdf39-6193-11e7-9176-f58796899f9b Version: $LATEST
2017-07-05T15:05:24.680Z	596fdf39-6193-11e7-9176-f58796899f9b	Connected!
2017-07-05T15:05:24.684Z	596fdf39-6193-11e7-9176-f58796899f9b	[ RowDataPacket { id: 1, name: 'sai' },
  RowDataPacket { id: 2, name: 'chandra' },
  RowDataPacket { id: 3, name: 'AA' },
  RowDataPacket { id: 4, name: 'dfdd' } ]
END RequestId: 596fdf39-6193-11e7-9176-f58796899f9b
REPORT RequestId: 596fdf39-6193-11e7-9176-f58796899f9b	Duration: 3003.80 ms	Billed Duration: 3000 ms 	Memory Size: 1536 MB	Max Memory Used: 21 MB	
2017-07-05T15:05:27.425Z 596fdf39-6193-11e7-9176-f58796899f9b Task timed out after 3.00 seconds

2个回答

    最佳答案
  1. You need to exit the lambda through a success or error callback. Otherwise, the engine stays on until a timeout occurs.

    The easiest way to exit your lambda would be to call 'context.succeed("done");' after you code is done.

    var mysql = require('mysql');
    
    exports.handler = (event, context) => {
    var con = mysql.createConnection({
      host: "testdb.cxyzu.ap-south-1.rds.amazonaws.com",
      user: "root",
      password: "mypassword",
      database: "test",
      port: "3306",
     // debug: true
    });
    
    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
     // var sql = "INSERT INTO users (id, name) VALUES (4, 'dfdd')";
    var sql = "select * from test.users";
      con.query(sql, function (err, result) {
        if (err) throw err;
    //    console.log("1 record inserted");
          console.log(result);
          context.succeed("done");
      });
    });
    //callback("sucess");
    }
    

    Here some basic introduction to the topic:

    Lambda Function Handler (Node.js)

  2. 参考答案2
  3. The accepted solution doesn´t work for me. I´m connecting to a RDS instance and if I send "context.succeed("done")", the callback is not called.

    I´m connecting to an Amazon RDS instance inside a lambda running nodejs 8.1.

    SOLUTION:

    In order to exit of "Nodejs event Loop" you must add the next code to invoke the callback:

    connection.end( function(err) {
            if (err) {console.log("Error ending the connection:",err);}
    
           //  reconnect in order to prevent the"Cannot enqueue Handshake after invoking quit"
    
             connection = mysql.createConnection({
                    host     : 'rds.host',
                    port     :  3306,
                    user     : 'user',
                   password : 'password',
                   database : 'target database'
    
                   });
            callback(null, {
                statusCode: 200,
                body: response,
    
            });
        });