当前位置: 首页 > 知识库问答 >
问题:

从Elastic Beanstek上的NodeJS服务器连接ElastiCache失败

黄骏喆
2023-03-14

我们在AWS Elastic Beanstalk上有一个带有express的nodeJS服务器,我们正在尝试将其与nodeJS中的Elasticache(Redis clustered)连接,但出现以下错误:Redis Client Connection error ClusterAllFailedError:无法刷新插槽缓存 。这个错误似乎很常见,因为很多人都面临着相同的错误。为了连接到ElastiCache,我们使用了一个名为ioredis的npm模块。

很多人建议对ElastiCache和ElasticBeanstalk使用相同的VPC和安全组。我们已经在使用相同的VPC,在ElasticBeanstalk上,我们使用了两个安全组,其中一个与ElastiCache的安全组匹配。对于默认专有网络,我们已经为入站和出站规则启用了所有流量,但仍然面临相同的错误。

为了从NodeJS服务器连接到ElastiCache,我使用以下代码:

const Redis = require("ioredis");
exports.connect = () => {
  const client = new Redis.Cluster(
    ["xxxxx.xxxxx.clustercfg.use1.cache.amazonaws.com:6379"],
    {
      slotsRefreshTimeout: 10000,
      dnsLookup: (address, callback) => callback(null, address),
      redisOptions: {
        showFriendlyErrorStack: true,
        tls: {
          checkServerIdentity: (/*host, cert*/) => {
            // skip certificate hostname validation
            return undefined;
          },
        },
      },
    }
  );
  client.on("ready", () => {
    console.log("Redis Client Ready");
  });
  client.on("connect", () => {
    console.log("Redis Client Connected");
  });
  client.on("error", (error) => {
    console.log("Redis Client Connection Error", error);
  });
  client.on("reconnecting", () => {
    console.log("Redis Client Reconnecting");
  });
  client.on("end", () => {
    console.log("Redis Client Connection ended");
  });
  return client;
};

版本:

节点。js在64位Amazon Linux上运行,平台版本为4.15.1

NodeJS版本:12.18.3

ioredis版本:4.17.3

npm版本:6.14.6

快速版本:<代码>4.17.1

更新:如果我使用ssh和redis cli,我可以从ElasticBeanstalk访问ElastiCache,但无法在ElasticBeanstalk上运行的NodeJS上使用ioredis访问它。

共有3个答案

冷英光
2023-03-14

您可以简单地创建连接

const Redis = require("ioredis");
const client = new Redis(
        6379,
        "Configiration Endpoint (xxx.xxxx.xxxcache.amazonaws.com)"
);

client.on("ready", () => {
    console.log("Redis Client Ready");
    client.send(
  });
client.on("connect", () => {
    console.log("Redis Client Connected");
  });
client.on("error", (error) => {
    console.log("Redis Client Connection Error", error);
  });
夏青青
2023-03-14

我正在调试一个类似的问题。要访问redis,我必须将tls:{}添加到ioredis选项中:

{
      host: process.env.REDIS_HOST,
      port: process.env.REDIS_PORT,
      password: process.env.REDIS_PASSWORD,
      tls: {}
}
苏硕
2023-03-14

我有一个类似的设置,并最终使其工作,几个关键点:

  • Elasticbeanstalk和Elasticache必须位于同一VPC中

以下是连接代码:

import { RedisPubSub } from 'graphql-redis-subscriptions';
import Redis from 'ioredis';
import config from '../../config/env';

const options = {
  // AWS host will look like this: somecache-dev-ro.k6sjdj.ng.0001.use1.cache.amazonaws.com
  host: config.redis.host || 'localhost',
  port: config.redis.port || 6379,
  retryStrategy: (times: number): number => {
    // reconnect after
    return Math.min(times * 50, 2000);
  },
};

export const pubsub = new RedisPubSub({
  publisher: new Redis(options),
  subscriber: new Redis(options),
});
 类似资料:
  • 我有一个nodejs聊天服务器,它有不同的事件“Connection”,“SendChat”,“Switchroom”... null Thx很多!

  • 问题内容: 当我使用节点mysql时,在12:00到2:00之间出现错误,表明服务器已关闭TCP连接。这是完整的消息: 有解决办法。但是,以这种方式尝试后,问题也会出现。现在我不知道该怎么办。有人遇到这个问题吗? 这是我按照解决方案编写的方式: 问题答案: 尝试使用以下代码来处理服务器断开连接: 在您的代码中,我错过了之后的部分

  • 我想连接到树莓Pi节点。我从网络外部设置的js服务器。 我的路由器声称端口是开放的。我尝试在127.0.0.0、0.0.0.0和我的公共IP地址运行服务器。 我曾尝试使用ngrok打开端口8080,服务器在其中托管一个简单的网页,但尝试访问myIP:8080不起作用。 有人能帮我吗?

  • 我刚刚安装了Eclipse Neon,并添加了颠覆性的SVN插件。我试图添加一个新的存储库位置,我知道这是正确的,但我得到的结果是: > 使用SVNKit 1.8.12 SVN连接器(我以前一直使用它): 使用本机JavaHL 1.8.15 SVN连接器: 这些错误似乎都不为搜索引擎所知。我的SVN服务器是1.8.10。 PS:如果因为不是专门面向编程而偏离主题,请指出我应该在哪个SE网站上发布这

  • 问题内容: 环境文件: Routes.php: 我得到的错误: *Connector.php第55行中的 *PDOException : SQLSTATE [HY000] [2002]连接尝试失败,因为一段时间后连接方未正确响应,或者由于连接的主机未能响应,所以建立的连接失败。 我的问题是: 我正在尝试从计算机连接到远程MySQL服务器 而且我不明白为什么它不起作用? 我应该怎么做才能连接? 我想

  • 我配置了一个无密码的SFTP服务器。我想使用带有用户名和密码的jsch(JAVA)库连接它。我一直在使用以下代码行:- JAVA中的这一行是否会覆盖SSH配置的设置(少密码)? 请注意SFTP服务器使用终端命令SFTP连接良好,没有提示密码。