ElastiCache作為AWS的內存緩存組建可以說做的一點也不友好了,
你可以通過ElastiCache創建redis,memcache的實例,卻不能被外部訪問。
背景
人傻錢多的客戶總有人傻錢多的需求,他們本地做開發測試,需要用到redis,
於是他們決定在aws上創建一個redis的實例,用作本地開發測試。雖然我看不到價目表,但我想一台redis實例應該也得不少錢。
於是,我在public子網下創建了一個redis實例,原本以為可以通過終端節點的名稱加端口號來訪問到實例,結果我想多了。
官方給出的解釋是:
好吧,我不是有意吐槽,至少它還是給出了解決方法。
沒錯就是通過NAT實例
創建NAT實例
我們先來說說要求:
- 首先你必須在相同vpc,相同子網下創建你的NAT實例以及你的緩存實例
- 且所在子網必須是公有子網,啥叫公有子網就是在路由表中該子網必須綁定了internet網關(igw)
- 然后你的NAT實例必須綁定一個彈性IP(EIP)
(可能你看到這就已經覺得很麻煩了。。。)
環境准備:
接下來假設你在一個叫“TEST-VPC”下的“public-subnet”子網下創建了一個Redis的實例,你可以通過ping它的主機名以獲取它的內網IP地址后面會用到。
比如你的redis的內網ip是:192.168.1.110 端口: 6379
然后我們到EC2的界面選擇——》實例——》啟動實例
在選擇AMI的時候搜索帶有NAT標簽的鏡像(這里我就默認選擇的第一個),資源怎么划分大家根據需求隨意搭配
注意:
- 選擇和之前redis實例相同的VPC,以及相同的子網
- 在創建安全組的時候開放TCP 6379的端口 以及ssh 22遠程連接的端口
……省略創建EC2實例的過程
比如你已經創建好一個NAT實例了,IP地址為:192.168.1.120
接下來進入EC2界面——》彈性IP——》分配新地址,為你的實例關聯一個彈性IP
到這里你已經成功了一大半了。
添加iptables規則
登錄到NAT實例,為 NAT 實例啟用 IP 轉發。以下命令可用於確認這一點:
cat /proc/sys/net/ipv4/ip_forward
啟用偽裝:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
將 iptables 規則添加到 NAT 實例。
必須為群集中的每個節點將 iptables 規則添加到 NAT 表,以便將緩存端口從 NAT 實例轉發到群集節點。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 6379 -j DNAT --to 192.168.1.110:6379
你可以通過telnet測試是否成功:
telnet 203.0.113.73 6379
保存 iptables 配置。
在您測試和驗證規則之后保存規則。如果您使用基於 Redhat 的 Linux 分發(例如 Amazon Linux),請運行以下命令:
service iptables save
到這里所有的配置就結束了
總結
接下來就是真正的吐槽時間了!
首先客戶的提出的需求就已經是一個另類的需求了,想必大家並不多見。
如果是本地開發測試,並不介意將你的redis創建在公有雲上並通過公網訪問。
其次,我們來算一下你這次創建所需的花費:
- redis實例
- EC2實例
- 彈性IP
您的測試環境成本真的大,/不是禮貌的微笑