首页 > 解决方案 > Lambda 连接到同一 VPC 中 ec2 内的 redis,但连接 ECONNREFUSED 失败

问题描述

我正在使用 redis npm,下面是我的代码的一部分:

const redis = require("redis");
const client = redis.createClient({ port: settings.redis_port, host: settings.redis_host  });

当我在我的电脑上进行本地开发时,redis_host设置为"127.0.0.1",当在 lambda 中时,redis_host设置为"172.12.34.56". 在本地开发时,我需要先运行ssh -i "D:/Project/mykey.pem" -fNg -L 6379:localhost:6379 ubuntu@3.1.3.90 -p 22,然后我上面的代码才能连接到redis。无论如何,在完成上述所有操作后,我的本地部署与 redis 连接得很好。

问题是当我将代码部署到 lambda 时。它总是会返回错误

ERROR   Uncaught Exception      {"errorType":"Error","errorMessage":"Redis connection to 172.12.34.56:6379 failed - connect ECONNREFUSED 172.12.34.56:6379","code":"ECONNREFUSED","errno":"ECONNREFUSED","syscall":"connect","address":"172.12.34.56","port":6379,"stack":["Error: Redis connection to 172.12.34.56:6379 failed - connect ECONNREFUSED 172.12.34.56:6379","    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)"]}

问题是,redis 与我的 MongoDB 驻留在同一个 ec2 实例中,我的 lambda 可以使用连接字符串毫无问题地访问 MongoDBmongoose.connect('mongodb://172.12.34.56:27017/mydb')

我还在6379我的 ec2 实例的安全组入站规则中添加了端口,如下图所示: 在此处输入图像描述

我错过了什么吗?

标签: aws-lambdaredisserverless-framework

解决方案


我通过以下方式解决了这个问题:

  1. 编辑redis.conf和注释掉bind 127.0.0.1 ::1
  2. protected-mode no

我的 ec2 实例已经无法公开访问,因此切换保护模式应该不是问题。


推荐阅读