簡體   English   中英

通過 AWS PrivateLink 從不同的 AWS 賬戶訪問 AWS ElastiCache(Redis CLUSTER 模式)

[英]Accessing AWS ElastiCache (Redis CLUSTER mode) from different AWS accounts via AWS PrivateLink

我有一個業務案例,我想從一個帳戶(假設帳戶 A)到帳戶 B 訪問集群 Redis 緩存。

我已經使用了下面鏈接中提到的解決方案,並且在大多數情況下,它可以工作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 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是A賬戶的Redus集群的IP。這個奇怪,因為redis-py也連接到了同一個IP和端口,這個錯誤應該不存在。

所以事實證明問題是由於redis-py-cluster如何管理主機和端口。

創建新的redis-py-cluster對象時,它會從 Redis 服務器獲取主機 IP 列表(即帳戶 A 的 Redis 集群主機 IP),之后客戶端嘗試連接到新主機和端口。

在正常情況下,它作為初始主機和響應的IP是一回事。(即對象創建時添加的主機和端口)

在我們的例子中,對象創建主機和端口是從賬戶 B 的端點服務的 DNS 名稱中獲取的。

它導致代碼嘗試從帳戶 A 訪問實際 IP,而不是從帳戶 B 訪問 DNS 名稱。

該問題已使用主機端口重新映射解決,這里我們將從賬戶 A 的 Redis 服務器返回的 IP 與賬戶 B 的端點服務 DNA 名稱的 IP 綁定。

根據您的評論:

這是不可能的,因為賬戶 A 和賬戶 B 中的 VPC 具有相同的 CIDR 范圍。 對等 VPC 不能具有相同的 CIDR 范圍。

我認為你正在尋找的是不可能的。 VPC的路由總是首先發生 - 它發生在任何路由表被考慮之前。 換句話說,如果數據包的目的地位於發送 VPC 內,它永遠不會離開該 VPC,因為 AWS 將嘗試在其自己的 VPC 內路由它,即使當時 VPC 中沒有使用該 IP。

因此,如果您嘗試與具有與您的 IP 范圍相同的 IP 范圍的另一個 VPC 進行通信,即使您專門設置了一條將出口流量路由到不同 IP(但在同一范圍內)的路由,該規則也將被靜默忽略並AWS 將嘗試在原始 VPC 中傳送數據包,這似乎不是您想要完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM