首页 > 解决方案 > 通过 AWS PrivateLink 从不同的 AWS 账户访问 AWS ElastiCache(Redis CLUSTER 模式)

问题描述

我有一个商业案例,我想从一个帐户(假设是帐户 A)访问一个集群的 Redis 缓存到帐户 B。

我已经使用了以下链接中提到的解决方案,并且在大多数情况下,它可以工作基本解决方案

如果我尝试通过它访问群集 Redis,则基本解决方案可以正常工作,redis-py但是如果我尝试使用redis-py-cluster它失败。

我正在一个暂存环境中测试所有这些,其中 Redis 集群只有一个节点,但在生产环境中,它有两个节点,所以这种redis-py方法对我不起作用。

下面是我的示例代码

redis = "3.5.3"
redis-py-cluster = "2.1.3"
==============================


from redis import Redis
from rediscluster import RedisCluster

respCluster = 'error'
respRegular = 'error'

host = "vpce-XXX.us-east-1.vpce.amazonaws.com"
port = "6379"

try:
    ru = RedisCluster(startup_nodes=[{"host": host, "port": port}], decode_responses=True, skip_full_coverage_check=True)
    respCluster = ru.get('ABC')
except Exception as e:
    print(e)

try:
    ru = Redis(host=host, port=port, decode_responses=True)
    respRegular = ru.get('ABC')
except Exception as e:
    print(e)

return {"respCluster": respCluster, "respRegular": respRegular}

上面的代码在帐户 A 中完美运行,但在帐户 B 中,我得到的输出是

{'respCluster': 'error', 'respRegular': '123456789'}

我得到的错误是

rediscluster.exceptions.ClusterError: TTL exhausted

在账户 A 中,我们使用 AWS ECS + EC2 + docker 来运行它并

在账户 B 中,我们在 AWS EKS Kubernetes pod 中运行代码。

在这种情况下,我应该怎么做才能完成redis-py-cluster工作?或者在 python 中是否有替代方法redis-py-cluster来访问多节点 Redis 集群?

我知道这是一个非常具体的案例,不胜感激。

编辑 1:经过进一步研究,似乎 TTL 耗尽是一个一般错误,在日志中初始错误是

redis.exceptions.ConnectionError: 
Error 101 connecting to XX.XXX.XX.XXX:6379. Network is unreachable

这里 XXXX 是 Account A 中 Redus 集群的 IP。这很奇怪,因为它redis-py也连接到相同的 IP 和端口,应该不存在这个错误。

标签: pythonamazon-web-servicesdockerkubernetesredis

解决方案


所以原来问题是由于如何redis-py-cluster管理主机和端口。

创建新redis-py-cluster对象时,它会从 Redis 服务器获取主机 IP 列表(即 Redis 集群主机 IP 来自帐户 A),然后客户端尝试连接到新主机和端口。

在正常情况下,它作为初始主机和响应的IP是一个相同的。(即在创建对象时添加的主机和端口)

在我们的例子中,对象创建主机和端口是从 Account B 的 Endpoint 服务的 DNS 名称中获取的。

它导致代码尝试从账户 A 访问实际 IP,而不是从账户 B 访问 DNS 名称。

使用主机端口重映射解决了这个问题,这里我们将账户 A 从 Redis 服务器返回的 IP 与账户 B 的端点服务 DNA 名称的 IP 绑定。


推荐阅读