本頁面說明如何排解對您的 API 要求所回應的錯誤。
BAD_GATEWAY
如果您收到錯誤代碼 13 和訊息 BAD_GATEWAY,這表示可擴充服務 Proxy (ESP) 無法連線到服務後端。請確認下列事項:
- 確認後端服務正在執行,操作方式取決於您使用的後端。
-
在 App Engine 彈性環境中,
BAD_GATEWAY訊息的錯誤代碼可能是502,詳情請參閱App Engine 彈性環境的特有錯誤一節。 - 如為 Compute Engine,請參閱「在 Compute Engine 上排解 Cloud Endpoints 的問題」一文。
-
對於 GKE,您需要用 SSH 來存取 pod 並使用
curl,詳情請參閱在 Google Kubernetes Engine 中排解 Endpoints 的問題。
-
在 App Engine 彈性環境中,
- 後端服務正確的 IP 位址通訊埠如下所述:
-
對於 GKE,請檢查部署資訊清單檔案 (經常稱為
deployment.yaml) 中的 ESP--backend標記值 (短選項為-a)。 -
對於 Compute Engine,請檢查
docker run指令中的 ESP--backend標記值 (短選項為-a)。
-
對於 GKE,請檢查部署資訊清單檔案 (經常稱為
reset reason: connection failure
如果您收到 HTTP 代碼 503 或 gRPC 代碼 14 和訊息 upstream connect error or disconnect/reset before headers. reset reason: connection failure,表示 ESPv2 無法連線到服務後端。
如要排解問題,請仔細檢查下列項目。
後端位址
請使用正確的後端位址設定 ESPv2。常見問題包括:
- 後端位址的配置應與後端應用程式類型相符。
OpenAPI 後端應為
http://,gRPC 後端應為grpc://。 - 如果 ESPv2 部署在 Cloud Run 上,後端位址的架構應為
https://或grpcs://。s會告知 ESPv2 設定與後端的 TLS。
DNS 查詢
根據預設,ESPv2 會嘗試將網域名稱解析為 IPv6 位址。如果 IPv6 解析失敗,ESPv2 會改用 IPv4 位址。
部分電視網的備援機制可能無法正常運作。
不過,您可以透過 --backend_dns_lookup_family 標記,強制 ESPv2 使用 IPv4 位址。
如果您為部署在 Cloud Run 上的 ESPv2 設定無伺服器 VPC 連接器,就很容易發生這個錯誤。虛擬私有雲不支援 IPv6 流量。
API is not enabled for the project
如果您在要求中傳送 API 金鑰,系統會顯示「API my-api.endpoints.example-project-12345.cloud.goog is not enabled for the project」(專案未啟用 API) 等錯誤訊息,表示 API 金鑰是在與 API 不同的專案中建立。 Google Cloud如要修正這個問題,您可以在與 API 相關聯的 Google Cloud 專案中建立 API 金鑰,也可以在建立 API 金鑰的 Google Cloud 專案中啟用 API。
Service control request failed with HTTP response code 403
如果您收到錯誤代碼 14 和訊息 Service control request failed
with HTTP response code 403,表示 Service Control API (servicecontrol.googleapis.com) 未在專案中啟用。
Method doesn't allow unregistered callers
當您已在 OpenAPI 文件的 security 區段指定 API 金鑰,但傳給 API 的要求卻未將 API 金鑰指派給名稱為 key 的查詢參數時,ESP 就會傳回錯誤 Method doesn't allow unregistered callers。
如要產生 API 金鑰以呼叫 API,請參閱建立 API 金鑰。
Method does not exist
Method does not exist 這則回應表示系統找不到指定網址路徑上的 HTTP 方法 (GET、POST 等)。如要排解問題,請比對檢查您已部署的服務設定,以確保方法名稱和您在要求中傳送的網址路徑相符:
在 Google Cloud 控制台中,前往專案的「Endpoints Services」頁面。
如果您有多個 API,請選取您傳送要求的 API。
按一下 [Deployment history] (部署記錄) 分頁標籤。
選取最新的部署以查看服務設定。
如果您沒在 OpenAPI 文件的 paths 區段看到您呼叫的方法,請新增該方法,或在該檔案的頂層新增 x-google-allow 標記:
x-google-allow: all
這個標記的意思是,您可以避免在 OpenAPI 文件中列出您後端支援的所有方法。使用 all 時,所有包含或未包含 API 金鑰或使用者驗證的呼叫,都會透過 ESP 傳遞到您的 API。詳情請參閱 x-google-allow。
App Engine 彈性環境的特有錯誤
本節說明來自部署在 App Engine 彈性環境的 API 的錯誤回應。
錯誤代碼 502 或 503
App Engine 可能需要幾分鐘的時間才能成功回應要求。如果您在傳送要求後收到 HTTP 502、503 或其他伺服器錯誤,請稍後再重新提出要求。
錯誤訊息 BAD_GATEWAY
錯誤訊息為 BAD_GATEWAY 的錯誤代碼 502 通常表示 App Engine 因記憶體容量不足而終止了應用程式。在預設情況下,App Engine 彈性 VM 只有 1GB 的記憶體容量,其中只有 600MB 是供應用程式容器使用。
如要排解錯誤代碼 502:
前往 Google Cloud 控制台的「Logging」頁面:
選取頁面頂端的適用 Google Cloud 專案。
選取「Google App Engine Application」並開啟
vm.syslog。尋找類似下列內容的記錄項目:
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB如果您在記錄中看見
Out of memory項目:將下列內容新增到您的
app.yaml檔案,以增加預設 VM 的記憶體容量:resources: memory_gb: 4重新部署您的 API:
gcloud app deploy
如果您已在 app.yaml 檔案的 endpoints_api_service 區段指定 rollout_strategy: managed 選項,請使用下列指令來重新部署 API:
gcloud app deploy
詳情請參閱「部署您的 API 和 ESP」。
檢查 Cloud Logging 記錄檔
如要使用 Cloud Logging 記錄來協助排解回應錯誤:
在 Google Cloud 控制台中,前往「Logging」頁面。
選取頁面頂端的 Google Cloud 專案。
在左側的下拉式選單中,選取 [Produced API] (產生的 API) > [YOUR_SERVICE_NAME]。
調整時間範圍直到您看見顯示回應錯誤的資料列。
展開 JSON 酬載並尋找
error_cause。如果
error_cause設為application,這表示程式碼內容有問題。如果
error cause設為其他選項,且您無法修正問題,請匯出記錄,並附在您與 Google 的任何通訊訊息中。
詳情請參閱下列說明文章:
如要進一步瞭解 Logs Explorer 中的記錄結構,請參閱 Endpoints 記錄參考資料。
開始使用記錄檔探索工具。
使用進階記錄查詢功能進行進階篩選,例如取得延遲時間大於 300 毫秒的所有要求。
Invoke-WebRequest 範例的問題
在某些版本的 Windows PowerShell 中,教學課程中的 Invoke-WebRequest 範例會執行失敗。我們也收到回報,指出回應包含一系列未指定位元組,而這些位元組必須轉換成字元。如果 Invoke-WebRequest 範例沒有傳回預期的結果,請嘗試使用另一個應用程式傳送要求。請參考下列建議:
- 啟動 Cloud Shell,然後依照您用來傳送要求的教學課程中的 Linux 步驟操作。
安裝第三方應用程式,例如 Chrome 瀏覽器擴充功能 Postman (由
www.getpostman.com提供)。在 Postman 中建立要求時:- 選取
POST做為 HTTP 動詞。 - 選取
content-type鍵和application/json值做為標頭。 - 針對主體,請輸入:
{"message":"hello world"} 在網址中使用實際的 API 金鑰,而非環境變數。例如:
- 在 App Engine 彈性環境中:
https://example-project-12345.appspot.com/echo?key=AIza... - 在其他後端中:
http://192.0.2.0:80/echo?key=AIza...
- 在 App Engine 彈性環境中:
- 選取
下載並安裝以命令提示字元執行的
curl。由於 Windows 不會處理包在單引號中的雙引號,因此您必須將範例中的--data選項改成:--data "{\"message\":\"hello world\"}"