14 votes

Délai de connexion à AWS Lambda RDS

J'essaie d'écrire une fonction Lambda utilisant Node.js qui se connecte à ma base de données RDS. La base de données fonctionne et est accessible depuis mon environnement Elastic Beanstalk. Lorsque j'exécute la fonction, elle renvoie une erreur de dépassement de délai.

J'ai essayé d'augmenter le délai d'attente jusqu'à 5 minutes avec exactement le même résultat.

Après quelques recherches, j'en suis arrivé à la conclusion qu'il s'agit probablement d'un problème de sécurité, mais je n'ai pas trouvé de solution dans la documentation d'Amazon ou dans le site Web de l'entreprise. ce (qui est la seule que j'ai pu trouver sur le sujet).

Voici les détails de la sécurité :

  • Le RDS et le Lambda sont tous deux dans le même groupe de sécurité.
  • Le RDS a des règles pour tout le trafic entrant et sortant.
  • Le Lambda a la politique AmazonVPCFullAccess dans son rôle.

Mon code est :

'use strict';
console.log("Loading getContacts function");

var AWS = require('aws-sdk');
var mysql = require('mysql');

exports.handler = (event, context, callback) => {

   var connection = mysql.createConnection({
        host     : '...',
        user     : '...',
        password : '...',
        port     : 3306,
        database: 'ebdb',
        debug    :  false
    });

    connection.connect(function(err) {
      if (err) callback(null, 'error ' +err);
      else callback(null, 'Success');
    });

};

Le résultat que j'obtiens est :

"errorMessage": "2017-03-05T05:57:46.851Z 9ae64c49-0168-11e7-b49a-a1e77ae6f56c Task timed out after 10.00 seconds"

0voto

DR. Points 57

Le problème ne vient pas du délai d'attente, mais de la façon dont vous fermez la connexion. Utilisez .destroy() à la place si vous ne voulez pas attendre le callback que OU utiliser correctement le callback lors de la fermeture de la connexion en .end(function(err) { //Now call your callback });

Véase ce fil pour une explication plus approfondie.

0voto

user2735676 Points 1

J'ai également été confronté à un scénario similaire de timeout. Le problème était de ne pas faire connection.end() après connection.connect() . Connection.end() doit être fait avant callback .

Code de travail :

  var mysql = require('mysql');

    var connection = mysql.createConnection({
        host     : 'host_name',
        user     : 'root',
        password : 'password'
    });

    module.exports.handler = (event, context, callback) => {

// **Connection to database**      
connection.connect(function(err) {
        if (err) {
          console.error('Database connection failed: ' + err.stack);
          return;
        }
        console.log('Connected to database.');
      });

    // **Hit DB Query**
      connection.query("Query", function(err, rows, fields) {
           console.log(rows);
        });

      //**Close Connection**

connection.end(); ***// Missing this section will result in timeout***

    //**Send API Response**
      callback(null, {
              statusCode: '200',
              body: "Success",
              headers: {
                  'Content-Type': 'application/json',
              },
      });

    };

0voto

xiyulangzi Points 6

La connexion.end() devrait être après le callback :

donc code fonctionnel :

    'use strict';
var mysql = require('mysql');

var connection = mysql.createConnection({
    host     : 'xxxxxx.amazonaws.com',
    user     : 'testuser',
    password : 'testPWD',
    port     : 3306,
    database: 'testDB',
    debug    : false        
});

module.exports.handler = (event, context, callback) => {
    // **Connection to database**      
    connection.connect(function(err) {
        if (err) {
            console.error('Database connection failed: ' + err.stack);
            context.fail();
            return;
        }
      else{ 
            console.log('Connected to database.');
        }
    });

    connection.query('show tables from testDB', function (error, results, fields) {
        if (error) {
            console.log("error: connection failed with db!");
            connection.destroy();
            throw error;
        } else {
            // connected!
            console.log("info: connection ok with db!");
            console.log(results);
            context.succeed("done");
            callback(error, results);
        }
    });

    //Send API Response
    callback(null, {
        statusCode: '200',
        body: 'succeed',
        headers: {
          'Content-Type': 'application/json',
        },
    });

    //Close Connection
    connection.end(); // Missing this section will result in timeout***

};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X