0

我想写一个使用redis(在amazon elasticcache上)的AWS Lambda函数。问题 - 我无法连接到redis。我用这样的代码AWS Lambda和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 

,结果我看到的日志是这样的:

 
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 

当我改变Redis的URL的东西,这肯定是没有意义的我有一个附加行:

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 

任何想法?

+0

您是否为Lambda函数启用了VPC访问? –

+0

是的,问题出在VPC访问。谢谢。你有什么想法,为什么我有不同的行为? – kharandziuk

+1

当您尝试访问存在的内容,但您没有网络访问权时(由于不正确的VPC配置),您将收到超时。当您尝试访问不存在的内容时,您会收到“未找到”错误。 –

回答

1

您需要在同一个VPC中使用redis,与Lambda具有相同的区域。检查您的安全组设置。然后,如果您有EC2访问权限,请安装redis cli并尝试连接redis。如果这个连接你的Lambda Redis也会连接。如前所述,您需要将您的lambda放在同一个VPC中。 以下是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()在执行任何redis命令后非常重要。如果你不调用quit(),你的lambda会超时执行。 – user1858991