0

J'essaye d'écrire une fonction AWS Lambda qui utilise redis (sur amazon elasticcache). Le problème - je ne peux pas me connecter à Redis. J'utilise le code comme ceciAWS Lambda et Redis

'use strict' 

function handler (data, context, cb) { 
    const redis = require("redis") 
    console.log('before client initialization') 
    const client = redis.createClient({ 
    url: 'redis://propper-url-cache.some.0001.euw1.cache.amazonaws.com:6379', 
    retry_strategy: function(options) { 
     console.log(options) 
     if (options.total_retry_time > 1000) { 
     throw new Error('can`t connect to redis') 
     } 
    } 
    }) 
    console.log('after client initialization') 

    client.on("error", function (err) { 
    console.log('in error') 
    cb({error: err}) 
    }); 

    client.get("counter", function (err, counter) { 
    console.log('counter', counter) 
    if(_.isNull(counter)) { 
     counter = 0 
    } 
    client.set('counter', counter + 1, function(err) { 
     console.log(err) 
     cb(null, {counter: counter}) 
    }) 
    }); 
} 

exports.handler = handler 

par conséquent, je vois quelque chose comme ça dans les journaux:

 
15:33:41 
START RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6 Version: $LATEST 
 
15:33:42 
2016-09-20T13:33:42.632Z d8024ec2-7f36-11e6-996c-1bfcb60572c6 before client initialization 
 
15:33:42 
2016-09-20T13:33:42.813Z d8024ec2-7f36-11e6-996c-1bfcb60572c6 after client initialization 
 
15:33:44 
END RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6 
 
15:33:44 
REPORT RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6 Duration: 3002.67 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 19 MB 
 
15:33:44 
2016-09-20T13:33:44.620Z d8024ec2-7f36-11e6-996c-1bfcb60572c6 Task timed out after 3.00 seconds 

quand je change url Redis pour quelque chose qui fait vraiment aucun sens que j'ai une ligne supplémentaire:

2016-09-20T13:29:42.953Z 48fcb071-7f36-11e6-bc52-c5ac58c12843 { attempt: 1, error: { [Error: Redis connection to some-url.euw1.cache.amazonaws.com:6379 failed - getaddrinfo ENOTFOUND some-url.euw1.cache.amazonaws.com some-url.euw1.cache.amazonaws.com:6379] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo', hostna 

Des idées?

+0

Avez-vous activé l'accès VPC pour la fonction Lambda? –

+0

Oui, le problème était avec l'accès VPC. Merci. Avez-vous des idées pour lesquelles j'ai un comportement différent? – kharandziuk

+1

Lorsque vous essayez d'accéder à quelque chose qui existe, mais que vous n'avez pas accès au réseau (en raison d'une configuration VPC incorrecte), vous obtenez un délai d'attente. Lorsque vous essayez d'accéder à quelque chose qui n'existe pas, vous obtenez une erreur "introuvable". –

Répondre

1

Vous devez avoir redis dans le même VPC, même région que Lambda. Vérifiez les paramètres de votre groupe de sécurité. Et puis, si vous avez un accès EC2, installez redis cli et essayez de vous connecter redis. Si cela est connecté, votre Lambda redis sera également connectée. Comme dit précédemment, vous devez avoir votre lambda dans le même VPC. Voici le code pour la connexion lambda.

console.log('before client initialization') 
    const redisOptions = { 
    host: "xxxx.xxx.xxx.xxx.xxx.amazonaws.com", 
    port: 6379 

    } 

    var client = redis.createClient(redisOptions); 


client.on('connect', function(result) { 
    console.log("connected"); 
    } 
+2

client.quit() est très important après l'exécution de toute commande redis. Si vous n'appelez pas quit(), votre lambda temporise l'exécution. – user1858991