node.js - 无法从 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;
};
版本:
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 访问它。
解决方案
我正在调试一个类似的问题。要访问 redis,我必须添加tls: {}
ioredis 选项:
{
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASSWORD,
tls: {}
}
推荐阅读
- go - 从 redis 获取结构数组时解组错误
- excel - 在给定范围内查找 Length=2 单元格
- ubuntu - 是否可以从我不是管理员的系统上的容器中构建容器?
- angular - 从一个window.addEventListener(MessageEvent)中取出一个值event.data来执行一个新的函数
- python - split() 缺少 1 个必需的位置参数:'y'
- javascript - 制作下一个和上一个按钮,显示敌人的名字和生命值,但隐藏伤害
- python-2.7 - python2.7从另一个外部模块中使用的外部模块装饰函数
- java - 执行Java程序appium出错等异常
- css - 未占用 100% 空间的子组件(角度材料选项卡)
- python-3.x - 我怎样才能避免一个撇号的森林?