I'm raising this question here as I'm struggling to find any answers elsewhere
Has anyone had any success connecting to AWS Elasticache Clustered Redis via node and ioredis with TLS enabled.
The flag for TLS has been set as tls: {}. Debug logs show that we can return the slots cache from the cluster, but seem unable to read/write to the cluster...
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[clustercfg.redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:cluster getting slot cache from clustercfg.redacted.cache.amazonaws.com:6379
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[clustercfg.redacted.cache.amazonaws.com:6379]: wait -> connecting
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis queue command[0] -> cluster(slots)
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[n.n.n.n:6379]: connecting -> connect
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis write command[0] -> info()
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[n.n.n.n:6379]: connect -> ready
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:connection send 1 commands in offline queue
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis write command[0] -> cluster(slots)
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: [empty] -> wait
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:cluster status: connecting -> connect
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[redacted.cache.amazonaws.com:6379]: wait -> connecting
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis queue command[0] -> cluster(info)
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: #033[32m#033[1m2018-07-11T08:38:28.358Z INFO#033[0m#033[39m Connected to Redis on clustercfg.redacted.cache.amazonaws.com : 6379
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[n.n.n.n:6379]: ready -> close
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:connection skip reconnecting since the connection is manually closed.
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[n.n.n.n:6379]: close -> end
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis status[n.n.n.n:6379]: connecting -> connect
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:redis write command[0] -> info()
Jul 11 08:38:28 ip-10-100-30-175 javascript-app.sh: Wed, 11 Jul 2018 08:38:28 GMT ioredis:connection error: Error: read ECONNRESET
I understand that ECONNRESET suggests the connection has been terminated by the peer, but surely we wouldn't get the slots cache information back if SSL was not working correctly?
Hi,
The below node code worked for me in accessing In-transit encryption and AUTH feature enabled ElastiCache Redis cluster mode enabled cluster.
var Redis = require('ioredis');
var nodes = [{
host: 'clustercfg.xxxxxencr.rqeqka.euw1.cache.amazonaws.com',
port: '6379',
}];
var cluster = new Redis.Cluster(nodes,{
redisOptions: {
password: '1234123412341234',
tls: {}
}});
cluster.set('aws', 'aneesh');
cluster.get('aws', function (err, res) {
cluster.disconnect()
});
Thanks,
Aneesh Mohan
Thanks, the above config worked for us. We edited to suit our app and this is how we now do it...
const Redis = require('ioredis');
const config = require('../../config/environment');
const logger = require('../../helpers/logger');
let client = null;
/**
connection.retryStrategy = times => Math.min(times * 50, 2000);
if (config.redis.useRedisCluster) {
if (config.redis.tls) {
client = new Redis.Cluster([connection], {
redisOptions: {
tls: {},
},
});
} else {
client = new Redis.Cluster([connection]);
}
} else {
client = new Redis(connection);
}
}
// Set error and connection event handlers
client.on('error', (err) => {
logger.error(Redis encountered an error: ${err.message}, { stack: err.stack });
});
client.on('connect', () => {
const hostname = config.redis.hostname;
const port = config.redis.port;
logger.info(Connected to Redis on ${hostname} : ${port});
});
client.on('end', () => {
logger.info('Disconnected from Redis');
});
return client;
};
/**
Most helpful comment
Hi,
The below node code worked for me in accessing In-transit encryption and AUTH feature enabled ElastiCache Redis cluster mode enabled cluster.
var Redis = require('ioredis');
var nodes = [{
host: 'clustercfg.xxxxxencr.rqeqka.euw1.cache.amazonaws.com',
port: '6379',
}];
var cluster = new Redis.Cluster(nodes,{
redisOptions: {
password: '1234123412341234',
tls: {}
}});
cluster.set('aws', 'aneesh');
cluster.get('aws', function (err, res) {
cluster.disconnect()
});
Thanks,
Aneesh Mohan