為什麼我無法連上我的 ElastiCache for Redis 叢集?

3 分的閱讀內容
0

我無法連上我的 Amazon ElastiCache for Redis 叢集。我該如何排除此問題?

簡短描述

連線問題可能有許多根本原因。最常見的問題有:

  • 叢集尚未準備就緒。
  • 叢集運作狀態不良。
  • 網路組態不正確。
  • 用戶端組態不正確。

解決方案

確認叢集已就緒

如果您剛建立叢集,請確認您已完成叢集建立程序,且叢集已準備好接受連線。

請使用 ElastiCache 主控台、AWS Command Line Interface (AWS CLI),或是 ElastiCache API 來確認叢集的狀態。檢查下列項目的**「狀態」**欄:

  • 如果**「狀態」欄顯示為「可用」**,表示叢集已就緒。
  • 如果**「狀態」欄顯示為「建立中」,表示叢集尚未建立完畢。等待幾分鐘,直到狀態更新為「可用」**。
  • 如果**「狀態」欄顯示為「修改中」,表示叢集的組態正在更新。等待幾分鐘直到修改完畢,且狀態變更為「可用」**。

確認叢集的運作狀態

一個運作狀態良好的叢集,其內部的每一個節點都應處於**「可用」**狀態。若要驗證叢集的運作狀態,請執行以下動作:

驗證叢集與用戶端資源之間的網路層級連線

若要將延遲降到最低,請從 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體存取 ElastiCache。從相同的 Amazon Virtual Private Cloud (Amazon VPC) 內的其他資源存取 Amazon ElastiCache 也有助於將延遲降到最低。然而您還是可以從 VPC 外部,甚至是 AWS 外部進行連線。

如需連線至 ElastiCache 的詳細資訊,請參閱以下內容:

若要自動化連線程序,請使用 VPC 網路存取分析服務 來排除 AWS 資源之間的連線問題。

確認安全群組和網路 ACL 允許連線

請在 ElastiCache 叢集和啟動連線的資源上執行此步驟。例如以下的用戶端資源:

  • 一個 Amazon EC2 執行個體。
  • 一個 AWS Lambda 函數。
  • Amazon Elastic Container Service (Amazon ECS) 或是 Amazon Elastic Kubernetes Service (Amazon EKS) 容器等等。

請確保您已在 ElastiCache 中正確設定安全群組。針對其他資源,請驗證安全群組和網路 ACL。

確認 ElastiCache 叢集上的安全群組

1.    從 Redis 叢集選單中選取叢集名稱,然後選取**「網路和安全性」**索引標籤。

2.    確認至少有一個關聯的安全群組已允許從用戶端資源傳入連線至叢集的連接埠

3.    若要確認連接埠號碼,請檢視叢集的任何端點。端點採用的格式為domain_name:port

**注意:**叢集的連接埠預設為 6379/TCP。您可以在叢集建立期間覆寫連接埠號碼。

4.    在用戶端資源上,確認安全群組允許傳出連線至叢集的連接埠和叢集子網路的 CIDR 區塊。

5.    確認網路 ACL 允許用戶端和叢集之間傳出 / 傳入連線。網路 ACL 通常會預設為允許所有連線。

**備註:**您可以使用 VPC 網路存取分析服務來排除安全群組和網路 ACL 的組態問題。

識別連線的正確端點

建議的連線端點會因叢集配置而有所不同。如需進一步瞭解如何尋找正確端點和可能的組態,請參閱尋找連線端點

確認 DNS 解析可以在用戶端上運作

DNS 問題通常可透過**「名稱或服務未知」「NXDOMAIN」**錯誤訊息來辨別。

$ nslookup nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com
Server:         172.31.0.2
Address:        172.31.0.2#53

** server can't find nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com: NXDOMAIN
$ redis-cli -h nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com
Could not connect to Redis at nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com:6379: Name or service not known

如果看到上述錯誤,請檢查 VPC 用戶端資源的 DNS 屬性。

可以的話,最佳做法是使用 Amazon DNS 伺服器。如需詳細資訊,請參閱 Amazon DNS 伺服器

驗證用戶端和 Redis 之間的 TCP 連線狀態

使用 curltelnet 指令來建立 TCP 連線並驗證連線狀態:

$ curl -v telnet://test.1234id.clustercfg.euw1.cache.amazonaws.com:6379
*  Trying 172.31.1.242:6379...
* Connected to test.1234id.clustercfg.euw1.cache.amazonaws.com (172.31.1.242) port 6379 (#0)

在上述的例子中,關鍵字 Connected 表示 TCP 連線可以正常運作。

如果命令結果中沒有顯示 Connected,請檢查以下項目:

於 ElastiCache 叢集

  • 安全群組必須允許叢集連接埠的連線。驗證叢集組態頁面上的連接埠值 (預設值為 TCP/6379)。如需詳細資訊,請參閱修改 ElastiCache 叢集
  • 叢集及其所有碎片和節點必須處於**「可用」**狀態。如需詳細資訊,請參閱檢視叢集的詳細資訊

於用戶端資源

  • 安全群組必須允許對叢集 IP 和連接埠的傳出連線。
  • 路由表必須具有適當的路由,才能存取叢集。
  • 資源可以位於相同的 VPC 當中。如果資源位於另一個 VPC 或 AWS 之外,請確定資源已設定適當的連線。例如 VPN、VPC 對等互連、直接連結等等。如需詳細資訊,請參閱存取您的叢集或複寫群組
    **注意:**為了確保低延遲,Amazon ElastiCache 專為從相同的 VPC 存取而設計。VPC 外部的連線會產生額外延遲。直接使用公有網際網路或透過通道連線時,這種額外的延遲會特別常見。由於 Redis 對延遲非常敏感,因此額外的延遲可能會導致連線和逾時問題。

Amazon VPC Reachability Analyzer工具可協助判斷存取被封鎖的原因。

與傳輸中加密的叢集進行連線的疑難排解

傳輸中加密是透過 TLS 傳送 Redis 流量來運作。用戶端必須有 TLS 支援,連線才能正常運作。

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com

如果您已安裝 redis-cli 且其有 TLS 支援,請在指令中加上 --tls 引數:

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com --tls
encrypted.1234id.clustercfg.euw1.cache.amazonaws.com:6379>

redis-cli 在沒有 TLS 支援下被編譯,則會顯示以下錯誤訊息:

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com --tls
Unrecognized option or bad number of args for: '--tls'

若要排解上述錯誤,請執行以下其中一項:

如果您往後會用到 redis-cli,那麼在 TLS 支援下編譯 redis-cli 是最佳做法。如需 Amazon Linux 2 和 Amazon Linux 的逐步指南,請參閱**「步驟 4:連線至叢集的節點」**文中的〈下載並安裝 redis-cli〉一節。

-或者-

使用另一個指令替代,例如 openssl。若您因沒有 TLS 支援而無法使用 redis-cliopenssl 指令在大多數系統上都可以使用,是一組相當實用的指令。以下是 openssl 指令的使用範例:

$ openssl s_client -connect encrypted.1234id.clustercfg.euw1.cache.amazonaws.com:6379
CONNECTED(00000003)
----- omitted --------
INFO
# Server
redis_version:6.2.6
----- omitted -----

如需詳細資訊,請參閱「步驟 4:連線至叢集的節點」文中的〈連線到啟用加密 / 身分驗證的叢集〉一節。

針對使用驗證連線至叢集進行疑難排解

redis-cli

所有具有驗證的叢集都需要 TLS。redis-cli 指令需要同時具有 --tls--askpass(或是 -a)兩種引數。

如果未提供 --askpass 引數,會輸出以下結果:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls
auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com:6379> INFO # or any other Redis command
NOAUTH Authentication required.

如果指令中的密碼錯誤,會輸出以下結果:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls --askpass
Please input password: *************
Warning: AUTH failed

在以下範例中,Redis 指令使用了正確的密碼,因此按照預期執行:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls --askpass
Please input password: ******************
auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com:6379> INFO
# Server
redis_version:6.2.6
----- omitted -----

openssl

您可以使用 openssl 指令來測試連線狀況。此指令僅應用於偵錯用途:

$ openssl s_client -connect master.auth-cluster.3i1yig.euw1.cache.amazonaws.com:6379
CONNECTED(00000003)
----- omitted -----
---
AUTH topsecretpassword
+OK
INFO
# Server
redis_version:6.2.6
----- omitted -----

如需詳細資訊,請參閱**「步驟 4:連線至叢集的節點」**文中的〈連線到啟用加密 / 身分驗證的叢集〉一節。

如需 ElastiCache 連線的其他詳細資訊,請參閱 疑難排解


AWS 官方
AWS 官方已更新 2 年前