web-dev-qa-db-fra.com

Se connecter à la base de données MySQL à partir de la fonction Lambda (Node)

Je n'ai pas pu me connecter à la base de données MySQL en utilisant Node de la fonction Lambda. L'erreur que je reçois est Task timed out after 4.00 seconds.

Quelqu'un at-il des solutions?

Voici un aperçu de mon état:

  1. La base de données AWS RDS est une base de données MySQL. Il n'est pas limité au VPC (je peux me connecter en utilisant l'hôte/utilisateur/mot de passe de MySQLWorkbench).
  2. Le rôle d'exécution de ma fonction Lambda est défini pour avoir Lambda en tant qu'entité approuvée et un accès administrateur donné.
  3. Sur ma machine locale, j'ai installé le module mysql, zippé mon dossier index.js et node_modules et téléchargé sur ma fonction Lambda.
  4. J'ai essayé de mettre la fonction createConnection et connect à l'intérieur du gestionnaire. J'ai essayé de placer ma requête dans la fonction de rappel de la fonction de connexion. J'ai essayé d'augmenter le délai d'expiration à 10 secondes.
  5. Mon code:

    var mysql = require('mysql');
    
    var connection = mysql.createConnection({
        Host     : 'Amazon-string.rds.amazonaws.com',
        user     : 'myusername',
        password : 'mypassword'
    });
    
    connection.connect();
    
    exports.handler = (event, context, callback) => {
    
        connection.query("SELECT * FROM table", function(err, rows, fields) {
            console.log("rows: " + rows);
            callback(null);
        });
    
    };
    
7
sketchedin

Augmentez le délai à une minute. Cela pourrait être dû au démarrage à froid de la fonction lambda.

Seul votre premier appel devrait prendre du temps, les appels consécutifs devraient être très rapides, car vous réutilisez la même connexion.

De plus, en ayant un délai d'attente plus élevé, cela ne signifie pas que vous serez facturé pour ce délai, vous ne serez facturé que pour la durée d'exécution de Lambda.

Aussi pour accélérer le démarrage à froid du temps vous pouvez webpack vos scripts,

http://docs.aws.Amazon.com/sdk-for-javascript/v2/developer-guide/webpack.html

Il y a encore un problème remarqué,

var mysql = require('mysql');

var connection = mysql.createConnection({
    Host     : 'Amazon-string.rds.amazonaws.com',
    user     : 'myusername',
    password : 'mypassword'
});

connection.connect();

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

    connection.query("SELECT * FROM table", function(err, rows, fields) {
        console.log("rows: " + rows);
        context.succeed('Success');
    });

};

J'espère que cela aide.

7
Kannaiyan

Puisque vous utilisez RDS, consultez sa configuration de groupe de sécurité. Par défaut, le groupe de sécurité RDS autorise les connexions entrantes à partir de votre propre IP et de votre groupe de sécurité par défaut sur votre VPC par défaut. Cependant, Lambda, par défaut, ne fonctionne sous aucun VPC et n'est donc pas en mesure d'établir une connexion à RDS.

Modifiez votre instance RDS pour autoriser toutes les adresses IP ou exécutez votre fonction Lambda sous un VPC auquel votre instance RDS peut accéder et autorisez l'accès au groupe de sécurité.

3
heneryville