如何透過 VPC 連結整合對 Amazon API Gateway 產生的 500 錯誤進行疑難排解?

上次更新日期:2022 年 11 月 1 日

我已使用 VPC 連結整合設定了 Amazon API Gateway。當我呼叫 API 時,我收到含有 HTTP 500 狀態碼的組態或內部錯誤。如何解決此問題?

簡短描述

如果出現以下情況,AWS API Gateway 可能無法將流量轉送到後端資源,而且會傳回含有 VPC 連結HTTP 500 狀態碼:

  • VPC 連結處於 Failed (失敗) 狀態、端點服務已刪除或處於 Rejected (已拒絕) 狀態。
  • 目標群組的已註冊目標運作狀態不良或處於非使用中狀態。
    備註:如果 60 天內沒有透過 VPC 連結傳送流量,其狀態就會變成 INACTIVE (非使用中)。如需詳細資訊,請參閱使用 HTTP API 的 VPC 連結
  • 安全群組不允許特定連接埠上的流量。
  • 網路存取控制清單 (ACL) 會封鎖流量。
  • 目標不會接聽目標連接埠。
  • 網域名稱憑證與啟用 TLS 的 Network Load Balancer (NLB) 或 Application Load Balancer (ALB) 不符。

如果 API 啟用 Amazon CloudWatch 記錄功能,則執行日誌中會顯示錯誤訊息,指出錯誤原因。

CloudWatch 日誌中的 HTTP 500 錯誤訊息範例

Thu Aug 04 17:48:21 UTC 2022 : Execution failed due to configuration error: There was an internal error while executing your request
Thu Aug 04 17:48:21 UTC 2022 : Method completed with status: 500

-或-

Thu Aug 04 19:50:21 UTC 2022 : Execution failed due to configuration error: Host name 'domain.com.com' 
does not match the certificate subject provided by the peer (CN=myinstance.com)
Thu Aug 04 19:50:21 UTC 2022 : Method completed with status: 500

解決方案

確認錯誤原因

如果您的 REST API 尚未開啟 CloudWatch 記錄功能,請將其開啟。務必設定執行記錄功能

秘訣:設定記錄設定時,請在 Log level (日誌層級) 中,選擇 INFO (資訊)。然後,選擇 Log full requests/responses data (記錄完整請求/回應資料)。

在 CloudWatch 中檢視 REST API 的執行日誌,找出導致錯誤的原因。

檢查執行日誌中是否有錯誤訊息,並按照以下解決步驟進行操作

"Execution failed due to configuration error: There was an internal error while executing your request (執行因組態錯誤而失敗:執行請求時出現內部錯誤)"

  • 確認 VPC 連結負載平衡器存在且未遭刪除。
  • 確認 VPC 連結處於 AVAILABLE (可用) 狀態。如果 VPC 連結處於 FAILED (失敗) 狀態,則您必須建立新的 VPC 連結並建立其與 API 之間的關聯。備註:請務必在修改整合請求之後部署 API。
  • 確認 VPC 連結的端點連線處於 AVAILABLE (可用) 狀態。
  • 如果參照的 VPC ID 中含有階段變數,請確認 VPC 連結 ID 是否正確。
  • 確認 VPC 連結負載平衡器會接聽請求所設定的 HTTP/HTTPS 連接埠。檢查接聽程式是否已設定正確的連接埠。檢查網路 ACL 並確保它們未封鎖請求。
  • 確認目標群組接受請求。檢查網路 ACL,確保允許流量傳入和傳出。檢查安全群組,確保已設定的連接埠允許流量傳入。
  • 如果請求傳回 500 錯誤,則連線可能會收到 TCP RST 封包。確認後端伺服器已啟動且在執行中。確認後端目標的服務正在目標連接埠上執行。確認後端目標正在接聽目標連接埠。

"Execution failed due to configuration error: Host name 'domain.com.com' does not match the certificate subject provided by the peer (CN=myinstance.com) (執行因組態錯誤而失敗:主機名稱 'domain.com.com' 與對等端 (cn=Myinstance.com) 提供的憑證主旨不符)"

請確保端點網域名稱與啟用 TLS 之負載平衡器目標傳回的憑證相符。

"Execution failed due to configuration error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (執行因組態錯誤而失敗:PKIX 路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:找不到請求之目標的有效憑證路徑)"

此錯誤表示 API Gateway 找不到根 CA。即使整合之 TlsConfig 屬性的insecureSkipVerification 設為 true,API Gateway 仍會執行基本的憑證驗證,包括:

  • 憑證到期日。
  • 主機名稱。
  • 是否有根憑證授權單位。

"Execution failed due to configuration error: Cannot verify ECDH ServerKeyExchange signature (執行因組態錯誤而失敗:無法驗證 ECDH ServerKeyExchange 簽署)"

此錯誤表示 TLS 交握因金鑰和對應的憑證不符而失敗。為了解決這個問題,請驗證用於您設定的憑證授權單位、憑證和金鑰的檔案內容。

"Execution failed due to an internal error (執行因內部錯誤失敗)"

發生此錯誤是因為負載平衡器上的目標重設,致使 Amazon API Gateway 無法透過 VPC 連結與負載平衡器連線。為了解決這個問題,請將目標的逾時值設為高於負載平衡器的預設逾時值 (350 秒)。

"Execution failed due to configuration error: Not a valid protocol version: {Text of string} (執行因組態錯誤而失敗:通訊協定版本無效:{Text of string})"

此錯誤表示整合所發出的 HTTP 回應無效,該回應不符合 HTTP 規格。這可能表示經過整合的後端傳回 Amazon API Gateway 的資料無效。

若要對此錯誤進行疑難排解,請執行以下操作:

  • 重現 Amazon API Gateway 發出的請求。建立連結至服務端點 ID 的 VPC 端點,藉此測試 Amazon API Gateway 所使用的服務端點。您也可以執行封包擷取,以檢閱從經過整合的後端傳回的回應。
  • 根據目標回應而將負載平衡器通訊協定變更為 TLS 或 TCP,以避免重複加密。
  • 確保整合之 TlsConfig 屬性的 insecureSkipVerification 設為 true