web-dev-qa-db-ja.com

「errorMessage」:3.00秒後にタスクがタイムアウトしましたaws lambda nodejslambda関数がRDSに接続しようとしています

私はnodejsでAmazonrdsからのデータをクエリする単純なラムダ関数を作成しました(注:私のラムダとrdsはデフォルトのvpcであり、すべてのポートが開いており、ラムダでタイムアウトを増やしてみました)

私の問題は、ラムダ関数をテストすると、クエリされたデータでlog outputが得られますが、

実行結果:「errorMessage」で失敗しました:「2017-07-05T15:05:27.425Z596fdf39-6193-11e7-9176-f58796899f9bタスクが3.00秒後にタイムアウトしました」}

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
5
chandra

成功またはエラーのコールバックを介してラムダを終了する必要があります。それ以外の場合、エンジンはタイムアウトが発生するまでオンのままになります。

ラムダを終了する最も簡単な方法は、「c​​ontext.succeed( "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");
}

ここにトピックのいくつかの基本的な紹介があります:

ラムダ関数ハンドラー(Node.js)

7
jens walter

受け入れられた解決策は私にはうまくいきません。 RDSインスタンスに接続していますが、「context.succeed( "done")」を送信すると、コールバックが呼び出されません。

Nodejs8.1を実行しているラムダ内のAmazonRDSインスタンスに接続しています。

解決策:

「Nodejsイベントループ」を終了するには、コールバックを呼び出す次のコードを追加する必要があります。

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,

    });
});
3
Jorge Valvert