与 Amazon ElastiCache Redis 集群的 redis-cli 连接挂起

redis-cli connection to Amazon ElastiCache Redis cluster hangs up

我已经从源代码安装并编译了 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 documentation on the topic

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

这会无限挂断,而不会向 stderr/stdout 发出任何消息。

(请注意这是一个示例端点名称;我已确认我使用的是 AWS 控制台中列出的主要端点。)

我怀疑这可能与 AWS 端集群的安全组设置有关,但不确定具体要修改哪些 could/should。我很欣赏有关可能阻止连接的建议,并可以根据需要提供有关集群本身的信息。

连接被 EC2 实例的安全组禁止,并且它试图连接到的 ElastiCache 集群没有正确对齐。

来自 AWS docs:

All ElastiCache clusters are designed to be accessed from an Amazon EC2 instance. The most common scenario is to access an ElastiCache cluster from an Amazon EC2 instance in the same Amazon Virtual Private Cloud (Amazon VPC).

我采取的更正步骤是:

  1. 导航到 ElastiCache Dashboard > Redis 并单击有问题的集群名称。这将显示安全组字段,其中值为 组 ID,例如 sg-x8xxxxxx。
  2. https://console.aws.amazon.com/ec2 > 网络和安全 > 安全组下导航到您的安全组 table。从步骤 1 中找到 组 ID 并记下其对应的 组名称.
  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

我还看到对 redis-cli 的呼叫无限挂断,但在我的情况下,它并非源于 incorrectly-configured 安全组。

相反,它的发生是因为我在创建 Redis 集群时将 'Encryption in-transit' 选项设置为 'Yes'。这意味着我的数据库端点需要通过 SSL 隧道访问,而 redis-cli 不会这样做。

对于我的应用程序,加密 in-transit 实际上并不是必需的,因此我创建了一个新的 Redis 集群,但未选择该选项。有关使用 in-transit 加密时需要采取哪些不同措施的更多详细信息,请参见此处: https://aws.amazon.com/premiumsupport/knowledge-center/elasticache-connect-redis-node/

确认安全组并看到我们启用了 'Encryption in-transit' 后,我们的 redis-cli 命令(包括 -a/--askpass 以提供密码)仍然无限期挂起并且--verbose 标志没有显示任何内容。 aws docs 首先调用自定义构建的 redis-cli 是不必要的, 所需要的是将 --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 以及通过 brew 在 mac 上安装的 redis-cli 6.2.6 有效。

要使用 docker 图像 运行,您可以使用像 docker run -it redis:6.2.6 /bin/bash 这样的命令,然后 运行 上面的 redis-cli 命令。