通过AWS PrivateLink从不同的AWS帐户访问AWS ElastiCache(Redis群集模式)

2024-04-19 07:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个商业案例,我想从一个帐户(比如帐户a)访问群集Redis缓存到帐户B

我使用了下面链接中提到的解决方案,在大多数情况下,它是有效的Base Solution

如果我试图通过redis-py访问集群Redis,则基本解决方案可以正常工作,但是如果我尝试将其与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吊舱中运行代码

在这种情况下,我应该如何使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是帐户A中Redus群集的IP。 这很奇怪,因为redis-py也连接到相同的IP和端口, 此错误不应存在


Tags: 代码pyredishost节点portru错误
2条回答

根据您的评论:

this was not possible because of VPCs in Account-A and Account-B had the same CIDR range. Peered VPCs can’t have the same CIDR range.

我认为你要找的是不可能的。在专有网络中,路由总是首先发生-它发生在考虑任何路由表之前。换句话说,如果数据包的目的地位于发送VPC内,它将永远不会离开该VPC,因为AWS将尝试在其自己的VPC内路由它,即使IP当时在VPC中未使用

因此,如果您试图与另一个与您的IP范围相同的VPC通信,即使您专门将流量出口路由设置为不同的IP(但在相同范围内),该规则将被默默忽略,AWS将尝试在原始VPC中传送数据包,这似乎不是你想要完成的

因此,问题在于redis-py-cluster如何管理主机和端口

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

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

在我们的例子中,对象创建主机和端口是从帐户B的端点服务的DNS名称获得的

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

使用Host port remapping解决了这个问题,这里我们将Redis服务器从帐户A返回的IP与帐户B的端点服务DNA名称的IP绑定

相关问题 更多 >