如何針對 CloudFront 的 502:"The request could not be satisfied (無法滿足請求)" 錯誤進行疑難排解?

上次更新日期:2022 年 12 月 22 日

我使用自訂網域設定了 Amazon CloudFront 分佈。透過 CloudFront 要求替代正規名稱記錄 (CNAME) 時,我收到 502 錯誤回應,並且有 "The request could not be satisfied (無法滿足請求)" 訊息。

簡短說明

當 CloudFront 無法連線至來源時,會發生 502 錯誤。請參閱下列章節以了解錯誤的原因以及如何進行疑難排解。

解決方案

CloudFront 無法建立與原始伺服器的 TCP 連線

根據預設,CloudFront 會透過連接埠 80 (適用於 HTTP) 和連接埠 443 (適用於 HTTPS),連線至原始伺服器。如果原始伺服器不允許透過這些連接埠的流量,或封鎖 CloudFront IP 地址的連線,則 TCP 連線會失敗。失敗時會產生 502 錯誤。若要解決此問題,請確認 CloudFront 分佈的「通訊協定」設定已設定為適用於 HTTP 或 HTTPS 連線的正確連接埠。

若要測試連接埠連線能力,請執行下列命令:

telnet ORIGIN_DOMAIN/ORIGIN_IP PORT

注意:針對 ORIGIN_DOMAIN,請輸入原始網域的 ID。針對 ORIGIN_IP,輸入來源的 IP 地址。針對 PORT,輸入您要用來連線至來源的連接埠號碼。

與原始伺服器的 SSL/TLS 交涉失敗

如果 SSL/TLS 交易失敗,則 CloudFront 與原始伺服器之間的連線會失敗,並產生 502 錯誤。請參閱下列章節以了解 SSL/TLS 交易失敗的原因,以及解決方法。

SSL 憑證與網域名稱不相符

來源的 SSL 憑證必須包含或涵蓋下列其中一個網域名稱:

  • 憑證的「一般名稱」欄位或「主旨替代名稱」欄位中的原始網域名稱。
  • 轉送至 CloudFront 分佈內原始伺服器之檢視器主機標頭的主機標頭網域名稱。

若要檢查憑證中的「一般名稱」和「主旨替代名稱」,請執行下列命令:

$ openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep -E '(CN|Alternative)' -A 2

注意:針對 DOMAIN,請輸入原始網域名稱。針對 SERVER_DOMAIN,請輸入原始網域名稱。或者,如果檢視器主機標頭轉送到原始伺服器,針對 SERVER_DOMAIN,請輸入傳入的主機標頭值。

如果下列條件成立,請設定快取政策或來源請求政策以包含主機標頭:

  1. SSL 憑證的一般名稱或儲存區域網路 (SAN) 包含檢視器主機標頭值。
  2. 主機標頭不會轉送到原始伺服器。

原始伺服器憑證已過期、不受信任或自我簽署

安裝自訂來源的憑證必須由受信任的憑證授權單位簽署。您可以在 Mozilla 網站上的 Mozilla 內含 CA 憑證清單中找到 CloudFront 信任的憑證授權單位。

CloudFront 不支援透過原始伺服器進行 SSL 設定的自我簽署憑證。自我簽署憑證是由組織本身發行,或是在 Web 伺服器本機上產生,而不是由受信任的憑證授權單位發行。

若要檢查您的原始憑證是否已過期,請執行下列 OpenSSL 命令。在輸出中,尋找 Not BeforeNot After 參數。確認目前的日期和時間在憑證的有效期間內。

$ openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep Validity -A 3

注意:針對 DOMAIN,請輸入原始網域名稱。針對 SERVER_DOMAIN,請輸入原始網域名稱。或者,如果檢視器主機標頭轉送到原始伺服器,針對 SERVER_DOMAIN,請輸入傳入的主機標頭值。

缺少中繼 CA 憑證或中繼憑證的順序不正確,會導致與原始伺服器之間的 HTTPS 通訊失敗。若要檢查憑證鏈,請執行下列命令。

$ openssl s_client -showcerts -connect DOMAIN:443 -servername SERVER_DOMAIN

注意,針對 DOMAIN,請輸入原始網域名稱;針對 SERVER_DOMAIN,請輸入原始網域名稱。或者,如果檢視器主機標頭轉送到原始伺服器,針對 SERVER_DOMAIN,請輸入傳入的主機標頭值。

CloudFront 不支援原始伺服器的密碼套件

如果沒有通用的交涉密碼套件,CloudFront 與原始伺服器之間的 SSL/TLS 交易會失敗。若要確認您使用的是正確的密碼套件,請參閱 CloudFront 和原始伺服器之間支援的通訊協定和密碼

您也可以使用 SSL Server 測試工具來檢查您的原始網域名稱是否包含在支援的密碼清單中。

CloudFront 無法解析來源 IP 地址

如果 CloudFront 無法解析原始網域,則會傳回 502 錯誤。若要針對這個問題進行疑難排解,請 use a dig/nslookup command to check if the origin domain resolves to an IP (使用 dig/nslookup 命令來檢查原始網域是否解析為 IP)。

Linux:

$ dig ORIGIN_DOMAIN_NAME

Windows:

nslookup ORIGIN_DOMAIN_NAME

注意:針對 ORIGIN_DOMAIN_NAME,請輸入原始網域名稱。

如果成功,則該命令會傳回原始網域名稱的 IP。使用 DNS 檢查程式工具檢查不同地理位置的 DNS 解析。

該錯誤是由上游來源所造成

CloudFront 散佈中定義的自訂來源可能是 Proxy、內容交付網路 (CDN) 主機名稱或連線到實際來源的負載平衡器。如果這些中介服務中的任何一項無法連線到來源,則會將 502 錯誤傳回給 CloudFront。若要解決此問題,請與您的服務供應商合作。

與 CloudFront 散佈失敗驗證相關聯的 Lambda@Edge 函數

如果 Lambda@Edge 函數將無效的回應傳回給 CloudFront,則 CloudFront 會傳回 502 錯誤。若要解決此問題,請檢查您的 Lambda@Edge 函數是否有下列常見問題:

  • 傳回的 JSON 物件
  • 缺少必要欄位
  • 回應中的物件無效
  • 新增或更新不允許或唯讀的標頭
  • 超過內文大小上限
  • 無效的字元或值

如需詳細資訊,請參閱測試和偵錯 Lambda@Edge 函數


此文章是否有幫助?


您是否需要帳單或技術支援?