首页 > 解决方案 > 无法从 Elastic Beanstalk 上的 NodeJS 服务器连接 ElastiCache

问题描述

我们在 AWS Elastic Beanstalk 上有一个带有 express 的 nodeJS 服务器,我们正在尝试将它与来自 NodeJS 的 Elasticache(Redis clustered) 连接,但收到此错误Redis Client Connection Error ClusterAllFailedError: Failed to refresh slots cache.。这个错误似乎很常见,因为很多人都面临同样的错误。为了连接到 ElastiCache,我们使用了一个名为ioredis.

很多人建议对 ElastiCache 和 Elastic Beanstalk 使用相同的 VPC 和安全组。我们已经在使用同一个 VPC,并且在 Elastic Beanstalk 上我们使用了两个安全组,其中一个与 ElastiCache 的安全组匹配。对于默认 VPC,我们启用All Traffic了入站和出站规则,但我们仍然面临同样的错误。

为了从 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;
};

ElastiCache 配置 在此处输入图像描述

具有入站和出站规则的默认 VPC 安全组 在此处输入图像描述 在此处输入图像描述

Elastic Beanstalk 安全组(与默认相同) 在此处输入图像描述

来自 Elastic Beanstalk 的错误信息 在此处输入图像描述

版本:

Node.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,但无法使用ioredis在 ElasticBeanstalk 上运行的 NodeJS 访问它。

标签: node.jsamazon-web-servicesredisamazon-elastic-beanstalkamazon-elasticache

解决方案


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

{
      host: process.env.REDIS_HOST,
      port: process.env.REDIS_PORT,
      password: process.env.REDIS_PASSWORD,
      tls: {}
}

推荐阅读