2

我正在尝试从 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
    ),
  };

};

请让我知道我哪里出错了。

4

2 回答 2

0

首先,您的 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

于 2019-08-30T07:30:50.060 回答
0

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

Redis 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 在 TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16) 处连接 ECONNREFUSED 127.0.0.1:6379 (net.js:1144:16) { errno: 'ECONNREFUSED',代码:'ECONNREFUSED ',系统调用:'connect',地址:'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;

于 2020-12-15T18:11:47.280 回答