web-dev-qa-db-fra.com

AWS Lambda ne peut pas se connecter à l'instance RDS, mais je peux le faire localement?

J'essaie de me connecter à mon instance RDS à partir d'un lambda. J'ai écrit le lambda localement et testé localement, et tout fonctionnait parfaitement. Je me déploie sur lambda, et soudain, cela ne fonctionne pas. Ci-dessous le code que j'utilise, et si cela aide, j'appelle le lambda via un flux kinésis.

'use strict';

exports.handler = (event, context, handlerCallback) => {
    console.log('Recieved request for kinesis events!');
    console.log(event);
    console.log(context);

    const connectionDetails = {
        Host:     RDS_Host,
        port:     5432,
        database: RDS_DATABASE,
        user:     RDS_USER,
        password: RDS_PASSWORD
    };

    const db = require('pg-promise')({promiseLib: require('bluebird')})(connectionDetails);

    db
            .tx(function () {
                console.log('Beginning query');

                return this.query("SELECT 'foobar'")
                           .then(console.log)
                           .catch(console.log)
                           .finally(console.log);
            })
            .finally(() => handlerCallback());
};

Voici les journaux de Cloud Watch si cela vous aide:

START RequestId: *********-****-****-****-********* Version: $LATEST 
2016-05-31T20:58:25.086Z    *********-****-****-****-*********  Recieved request for kinesis events! 
2016-05-31T20:58:25.087Z    *********-****-****-****-*********  { Records:  [ { kinesis: [Object], eventSource: 'aws:kinesis', eventVersion: '1.0', eventID: 'shardId-000000000000:**********************************', eventName: 'aws:kinesis:record', invokeIdentityArn: 'arn:aws:iam::******************:role/lambda_kinesis_role', awsRegion: 'us-east-1', eventSourceARN: 'arn:aws:kinesis:us-east-1:****************:stream/route-registry' } ] } 
2016-05-31T20:58:25.283Z    *********-****-****-****-*********  { callbackWaitsForEmptyEventLoop: [Getter/Setter], done: [Function], succeed: [Function], fail: [Function], logGroupName: '/aws/lambda/apiGatewayRouteRegistry-development', logStreamName: '2016/05/31/[$LATEST]******************', functionName: 'apiGatewayRouteRegistry-development', memoryLimitInMB: '128', functionVersion: '$LATEST', getRemainingTimeInMillis: [Function], invokeid: '*********-****-****-****-*********', awsRequestId: '*********-****-****-****-*********', invokedFunctionArn: 'arn:aws:lambda:us-east-1:*************:function:apiGatewayRouteRegistry-development' } 
END RequestId: *********-****-****-****-********* 
REPORT RequestId: *********-****-****-****-*********    Duration: 20003.70 ms   Billed Duration: 20000 ms Memory Size: 128 MB   Max Memory Used: 22 MB   
2016-05-31T20:58:45.088Z *********-****-****-****-********* Task timed out after 20.00 seconds
18
LordZardeck

@MarkB @ Michael-sqlbot avait raison dans les commentaires, c'était un problème de groupe de sécurité.

J'ai finalement obtenu une réponse du support AWS pour souligner que le groupe de sécurité RDS était en effet privé pour une IP spécifique. Cela n'a pas de sens car je n'ai jamais configuré cela, et je pouvais accéder à la base de données depuis ma machine locale et le haricot élastique. J'ai ajouté 0.0.0.0/0 au groupe de sécurité et maintenant le lambda peut se connecter. Merci pour votre aide les gars!

20
LordZardeck

Voici comment j'ai résolu ce problème.

Lorsque vous créez une instance de base de données, vous êtes invité à sélectionner VPC. Même si vous sélectionnez des valeurs par défaut, il prend l'IP publique de votre système comme IP entrante par défaut. La fonction lambda, en revanche, a son propre paramètre IP. C'est pourquoi vous pouvez accéder via n'importe quel IDE ou localement mais pas via la fonction lambda.

Pour ajouter des restrictions Ip:

  1. Accédez au groupe de sécurité de votre instance. Après avoir sélectionné le groupe de sécurité par défaut, cliquez dessus. Dans la nouvelle page, faites défiler vers le bas pour trouver les paramètres entrants et sortants.

  2. Dans le paramètre entrant, cliquez sur modifier. Vous pouvez changer l'adresse IP ici. (0.0.0.0/0 le rend ouvert au monde)

  3. Si vous ajoutez une adresse IP publique ici, alors IDE ou votre connexion locale fonctionnera.

  4. Pour que la fonction lambda fonctionne, ajoutez l'IP de la fonction lambda. Accédez à la fonction Lambda, Réseau -> VPC -> (si aucun VPC n'est sélectionné, sélectionnez un VPC identique à la fonction DB) et notez l'IP ici.

  5. Tapez cette IP dans les paramètres entrants, cela affichera le remplissage automatique.

Enregistrez-le et testez votre fonction lambda.

13
Mohanty

Voici la réponse à cela sans accès mondial.

Autoriser AWS Lambda à accéder à la base de données RDS

Répétition de la réponse de Mark:

  1. Ajouter un accès vpc à la fonction lambda
  2. Créer un nouveau groupe de sécurité pour le lambda
  3. Ajoutez le groupe de sécurité RDS au SG du lambda.
2
Trellan5E