python - 通过 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 和端口,应该不存在这个错误。
解决方案
所以原来问题是由于如何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 绑定。
推荐阅读
- ssl - 错误:上传工件 - x509:证书由未知机构签名
- swift - 从 iCloud 下载文件的正确方法
- python - 无法安装netifaces
- codeigniter - 启用 gzip 压缩时 Codeigniter 显示空白页
- reactjs - React Typescript:从本地文本文件中读取
- html - 我需要一些关于 HTML 代码的帮助(输入类型="radio")
- reactjs - 如何在反应js中将rest api调用保留在不同的文件中
- discord - discord.py Ping 命令
- javascript - 按钮 onclick 导致链接
- python - check_hostname 需要 server_hostname