redis-cli连接Amazon ElastiCache Redis集群卡住了

23

我已经从源代码安装和编译了Redis,并尝试连接到Amazon ElastiCache (Redis)集群。

我可以无问题地连接到默认的本地主机,但是尝试连接到AWS终端点会导致似乎是无限挂起的情况。

使用默认设置:

$ redis-server /etc/redis.conf  # daemonized, uses localhost
$ redis-cli ping
PONG
$ sudo service redis_6379 status
Redis is running (12919)
$ redis-cli shutdown  # or sudo service redis_6379 stop

现在,这里有一种尝试连接端点的方法,来自于AWS文档中的内容:

redis-cli -c -h my_example_endpoint_name.eaogs8.ng.0001.use1.cache.amazonaws.com -p 6379 ping

这会一直挂起而没有任何东西被输出到stderr/stdout。

(请注意,这只是一个端点名称示例;我已经验证我正在使用AWS控制台上列出的主要端点。)

我怀疑这可能与AWS集群的安全组设置有关,但不确定具体应该修改什么。感谢提供可能阻止连接的信息,并可以根据需要提供有关集群本身的信息。


有没有办法使用单个命令连接到所有集群? - Saurabh Verma
3个回答

23

我也遇到了调用redis-cli无限挂起的情况,但我的情况并不是由于错误配置的安全组引起的。

相反,这是因为我创建了一个具有“传输中加密”选项设置为“是”的Redis集群。这意味着必须通过SSL隧道访问我的数据库端点,而redis-cli并不支持这样做。

对于我的应用程序,实际上并不需要在传输过程中进行加密,因此我创建了一个没有选择该选项的新Redis集群。关于使用传输中加密时需要进行哪些不同操作的更多详细信息可在此处找到:https://aws.amazon.com/premiumsupport/knowledge-center/elasticache-connect-redis-node/


我设置了 encryption in transit = true,这意味着我需要提供密码 (-a),然后就可以通过 redis-cli 从该 VPC 中的 ec2 实例连接。不确定我的设置有何不同,但它运行良好。 - dwanderson
遇到了同样的问题,没有意识到 TransitEncryptionEnabled 字段的影响。感谢提供信息! - LeOn - Han Li
对于遇到同样问题的人,可以查看以下文档了解如何使用redis-cli连接:https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/in-transit-encryption.html#connect-tls - user4867444
我曾经遇到过同样的问题。我将传输加密设置为“否”,然后就能够通过redis-cli连接到redis了。 - Suz'l Shrestha

17
该连接被 EC2 实例和 ElasticCache 集群的安全组禁止,因为它们没有正确对齐。
来自 AWS docs 的信息:

所有的 ElasticCache 集群都被设计成可以从 Amazon EC2 实例访问。最常见的情况是从同一 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon EC2 实例访问 ElasticCache 集群。

我采取的纠正措施如下:
  1. 进入ElastiCache仪表盘 > Redis ,然后单击相关的集群名称。 这将显示一个Security Group字段,其中值为诸如sg-x8xxxxxx的Group ID
  2. 导航到您的安全组表,位于https://console.aws.amazon.com/ec2 >网络和安全 > 安全组下。 找到步骤1中的Group ID 并记录其对应的Group Name。
  3. 导航到您的EC2管理控制台https://console.aws.amazon.com/ec2 >实例 >实例。 对于您用于尝试连接到Redis集群的服务器,请注意安全组字段。 这必须包括步骤2中的Group Name。 如果没有,请添加此安全组。 选中服务器名称旁边的复选框,选择操作 > 网络和安全 > 更改安全组。 添加安全组名称,以便两个组件共享同一VPC。

现在,您应该能够使用类似以下内容的东西进行连接(示例):

redis-cli -c -h mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com -p 6379 ping

1
一直卡在那里,很困惑,后来我发现我的 EC2 实例在 VPC "dan-test" 中,而我的 Redis 在 VPC "dan-other-test" 中 - 这是触发我解决问题的关键,谢谢! - dwanderson

17
确认了安全组并且启用了“传输中的加密”,我们使用包括-a/--askpass以提供密码的redis-cli命令仍然无限期地挂起,--verbose标志没有显示任何内容。首先调用自定义构建的redis-cli的aws docs是不必要的,但需要的是将--tls标志作为命令的一部分,并且然后它就可以工作了。
这种形式的命令应该可以工作: redis-cli -h <primary endpoint> --tls -p <port> -a <password> <optional command>
例如:redis-cli -h master.redis.abc7bh.usw2.cache.amazonaws.com --tls -p 6379 -a password ping redis-cli docker镜像版本4.0.10和6.2.6以及在mac上通过brew安装的redis-cli 6.2.6都可以工作。
要使用docker镜像运行,您可以使用类似于docker run -it redis:6.2.6 /bin/bash的命令,然后运行上面的redis-cli命令。

2
“--tls” 对我很有帮助! - Mark
这里的魔法是 --tls!谢谢! - e.thompsy
在哪里可以找到适用于ElastiCache Redis集群的TLS证书? - Brent Bradburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接