通过 AWS PrivateLink 从不同的 AWS 账户访问 AWS ElastiCache(Redis CLUSTER 模式)

abh*_*314 5 python amazon-web-services redis docker kubernetes

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

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

如果我尝试通过以下方式访问集群 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}
Run Code Online (Sandbox Code Playgroud)

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

{'respCluster': 'error', 'respRegular': '123456789'}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

rediscluster.exceptions.ClusterError: TTL exhausted
Run Code Online (Sandbox Code Playgroud)

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

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

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

我知道这是一个非常具体的案例,任何帮助表示赞赏。

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

redis.exceptions.ConnectionError: 
Error 101 connecting to XX.XXX.XX.XXX:6379. Network is unreachable
Run Code Online (Sandbox Code Playgroud)

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

abh*_*314 1

事实证明,问题是由于如何redis-py-cluster管理主机和端口造成的。

当创建一个新redis-py-cluster对象时,它会从 Redis 服务器获取主机 IP 列表(即账户 A 中的 Redis 集群主机 IP),之后客户端尝试连接到新主机和端口。

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

在我们的示例中,对象创建主机和端口是从账户 B 的端点服务的 DNS 名称获取的。

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

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