【问题标题】:Connection refused when connecting to redis on EC2 instance连接到 EC2 实例上的 redis 时连接被拒绝
【发布时间】:2020-01-03 09:09:29
【问题描述】:

我正在尝试从 lambda 函数连接到 EC2 实例上的本地 redis 数据库。但是,当我尝试执行代码时,我在日志中收到以下错误

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

安全组有以下条目

Type: Custom TCP Rule
Port: 6379
Source: <my security group name>

Type: Custom TCP Rule
Port: 6379
Source: 0.0.0.0/0

我的 Lambda 函数有以下代码。

'use strict';
const Redis = require('redis');

module.exports.hello = async event => {
  var redis = Redis.createClient({
      port: 6379,
      host: '127.0.0.1',
      password: ''
    });

  redis.on('connect', function(){
    console.log("Redis client conected : " );   
  });

  redis.set('age', 38, function(err, reply) {
    console.log(err);
    console.log(reply);
  });

  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'The lambda function is called..!!',
        input: event,
        redis: redis.get('age')
      },
      null,
      2
    ),
  };

};

请告诉我哪里出错了。

【问题讨论】:

    标签: amazon-web-services lambda redis localhost econnrefused


    【解决方案1】:

    在 Linux Ubuntu 服务器 20.04 LTS 上,我在重启 EC2 服务器后看到了类似的错误,对于我们的用例,该服务器通过 cron 作业运行 express 应用程序,使用 passport.js 连接 nodeJs 应用程序(与 nvm 一起安装)以使用会话在 Redis 中:

    Redis 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED 127.0.0.1:6379 在 TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16) { 错误号:'ECONNREFUSED', 代码:'ECONNREFUSED', 系统调用:'连接', 地址:'127.0.0.1', 端口:6379 }

    为我解决了这个问题,因为我的 nodeJs 应用程序作为 Ubuntu 用户运行,我需要使该路径可用,是通过以下方式添加到 /etc/crontab 中的 PATH:

    sudo nano /etc/crontab 只需注释掉那里的原始路径,以便您可以在需要时切换回来(我原来的 PATH 设置为:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin :/usr/sbin:/usr/bin ) 并附加您可能需要参考的 bin 的位置,格式为:

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/ubuntu/.nvm/versions/node/v12.20.0/bin

    错误对我来说消失了

    // redisInit.js

    const session = require('express-session');
    const redis = require('redis');
    const RedisStore = require('connect-redis')(session);
    
    const { redisSecretKey } = process.env;
    
    const redisClient = redis.createClient();
    
    redisClient.on('error', (err) => {
        console.log('Redis error: ', err);
    });
    
    const redisSession = session({
        secret: redisSecretKey,
        name: 'some_redis_store_name',
        resave: true,
        saveUninitialized: true,
        cookie: { secure: false },
        store: new RedisStore(
            {
                host: 'localhost', port: 6379, client: redisClient, ttl: 86400
            }
        )
    });
    

    module.exports = redisSession;

    【讨论】:

      【解决方案2】:

      第一件事,你的 lambda 试图连接到 localhost,所以这将不起作用。您必须放置 Redis 实例的公共或私有 IP。

      但是,您仍然需要确保这些事情

      • 应该与您的 EC2 实例在同一个 VPC 中
      • 应该允许安全组中的出站流量
      • 分配子网
      • 您的实例允许 lambda 与安全组中的 Redis 连接
      const redis = require('redis');
      const redis_client = redis.createClient({
          host: 'you_instance_IP',
          port: 6379
      });
      
          exports.handler = (event, context, callback) => {
              redis_client.set("foo", "bar");
      
              redis_client.get("foo", function(err, reply) {
                  redis_client.unref();
                  callback(null, reply);
              });
          };
      
      

      你也可以看看这个how-should-i-connect-to-a-redis-instance-from-an-aws-lambda-function

      【讨论】:

      • 谢谢 Adiii。我的 redis 实例在同一台 EC2 机器上。它不是作为服务部署的。我已经在 EC2 实例上手动安装了 redis。您提到的要点是当 redis 部署为服务时。这是我的理解可能是我错了。我这样做的原因是因为我是 aws 的新进入者,并且为了最大限度地减少我在同一实例上部署的学习曲线。
      猜你喜欢
      • 2021-12-18
      • 2021-09-18
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多