When working with AWS ElastiCache for Redis, many developers encounter the frustrating "Connection refused" error when attempting remote connections. Here's what's really happening under the hood and how to properly configure your setup.
While you've correctly opened port 6379 in your security group, ElastiCache Redis has additional security layers:
# Security group example (minimum requirements)
- Type: Custom TCP
- Port: 6379
- Source: [Your IP or security group]
- Description: Redis access
ElastiCache instances reside within your VPC by default. To connect from outside AWS:
- Ensure your client is in the same VPC, or
- Set up a bastion host/EC2 instance as a jump server, or
- Configure VPC peering/PrivateLink for cross-account access
For production environments, I recommend this connection pattern:
redis-cli -h your-cluster-endpoint \
-p 6379 \
--tls \
--user default \
--auth your-auth-token
When the connection fails:
- Verify DNS resolution:
nslookup your-cluster-endpoint
- Test basic connectivity:
telnet your-cluster-endpoint 6379
- Check security group egress rules on your client machine
For safer cache management, consider this Python script using boto3:
import boto3
def flush_elasticache(cluster_id):
client = boto3.client('elasticache')
response = client.modify_cache_cluster(
CacheClusterId=cluster_id,
ApplyImmediately=True,
EngineDefaults={
'Parameters': [
{
'ParameterName': 'reset-all',
'ParameterValue': 'yes'
}
]
}
)
return response
When trying to connect to AWS ElastiCache Redis instances remotely, many developers encounter the frustrating "Connection refused" error, even with correct security group settings. Here's what's really happening and how to solve it properly.
ElastiCache Redis instances are designed to be accessed within your VPC by default. The common misconception is that simply opening port 6379 in security groups enables external access. However, there are additional layers of protection:
# Typical failed connection attempt
redis-cli -h my-cache-cluster.xxxxxx.0001.use1.cache.amazonaws.com -p 6379
# Returns: Could not connect to Redis at ... Connection refused
Before attempting remote connections, verify these fundamental requirements:
- VPC peering or VPN setup between networks
- NACLs allowing traffic both ways
- Redis cluster's parameter group configuration
- DNS resolution across networks
Here's the proper way to establish remote access:
# 1. Create SSH tunnel through a bastion host
ssh -i key.pem -N -L 6379:my-cache-cluster.xxxxxx.0001.use1.cache.amazonaws.com:6379 ec2-user@bastion-host
# 2. Connect locally through the tunnel
redis-cli -h 127.0.0.1 -p 6379
# 3. Once connected, flush cache if needed
FLUSHALL
FLUSHDB # For specific database
For more secure access patterns, consider creating a Lambda function with VPC access:
import boto3
import redis
def lambda_handler(event, context):
r = redis.Redis(
host='cluster-endpoint',
port=6379,
decode_responses=True)
if event.get('action') == 'flush':
return r.flushall()
return {"status": "No action taken"}
If connections still fail after proper setup:
- Verify subnet routing tables
- Check for network ACL conflicts
- Test with telnet to confirm basic connectivity
- Review CloudWatch logs for the Redis cluster
Remember that exposing Redis directly to the internet is dangerous. Always:
- Use TLS encryption
- Implement Redis AUTH
- Rotate credentials regularly
- Monitor connection attempts