您正在查看 Apigee 和 Apigee Hybrid 說明文件。
這個主題沒有對應的
Apigee Edge 說明文件。
問題
在某些情況下,外部用戶端無法以預期的方式存取/連線至 Apigee。包括網路連線失敗 (TLS 握手失敗) 或 Apigee 的 4xx/5xx
回應。
錯誤訊息
從用戶端傳送 API 要求至 Apigee 時,即使 API Proxy 在 Apigee UI 中看起來正常,您仍會看到 TLS 握手失敗或 4xx/5xx
回應。
可能原因
原因 | 說明 | 錯誤代碼 |
---|---|---|
HTTPS 負載平衡器的 TLS 錯誤 | 您可以管理 HTTPS 負載平衡器的 TLS 設定。調查 HTTPS 負載平衡器記錄中的任何 TLS 錯誤。 | 負載平衡器 IP 位址的 TLS 握手錯誤 |
Google Cloud Armor 封鎖要求 | 如果您使用 Google Cloud Armor,可能有規則會封鎖要求。 |
API 回應代碼可能因 Google Cloud Armor 設定而異。拒絕規則可以傳回 HTTP 403 (未授權)、404 (存取權遭拒) 或 502 (不良閘道) 回應,甚至是其他回應碼。 |
Apigee Proxy VM 無法將流量轉送至 Apigee 執行個體 | 需要調查 Apigee API 流量路由器 Proxy 設定及其健康狀態 | 502 Server Error |
網路設定不正確 | 確認正確的網路已與 Apigee VPC 建立對等連線。 | 502 Server error |
在區域擴充作業中建立的新 Apigee 執行個體上,未連結的環境 | 建立新例項 (例如第二個區域) 後,您必須將環境附加至該例項,否則無法回應 API 要求。 | 503 error response |
原因:HTTPS 負載平衡器發生 TLS 錯誤
診斷
- 找出與負載平衡器相關聯的 TLS 憑證。
- 使用 Google Cloud 控制台:
-
前往 Google Cloud 控制台的「負載平衡」頁面。
-
按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
- 在「前端」區域的「IP:Port」欄中,確認 IP 位址和通訊埠是否正確,以便查看正確的負載平衡器。
- 在「Certificate」欄中,按一下憑證名稱,即可查看 TLS 憑證。
-
-
使用 gcloud 指令:
-
使用下列
gcloud 指令列出負載平衡器。這個指令也會顯示與各負載平衡器相關聯的
SSL_CERTIFICATES
。gcloud compute target-https-proxies list --project=PROJECT_NAME
將
PROJECT_NAME
替換為您的專案名稱。系統會傳回類似以下的內容:
NAME: example-proxy-https-proxy SSL_CERTIFICATES: example-ssl-cert URL_MAP: example-proxy-url-map REGION: CERTIFICATE_MAP:
-
使用下列
gcloud 指令查看 TLS 憑證 (假設您已在機器上安裝
jq
或類似工具):gcloud compute ssl-certificates describe CERTICATE_NAME \ --project PROJECT_NAME --format json | jq -r '.certificate' | openssl x509 -text -noout
請將 CERTIFICATE_NAME 替換為憑證名稱。例如:
example-ssl-cert
。系統會傳回類似以下的內容:
certCertificate: Data: Version: 3 (0x2) Serial Number: 51:3b:a4:60:fe:49:34:a2:09:af:14:85:96:a2:4f:d9 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, O = Google Trust Services LLC, CN = GTS CA 1D4 Validity Not Before: Jul 11 11:51:52 2023 GMT Not After : Oct 9 12:44:45 2023 GMT Subject: CN = 34.149.207.105.nip.io Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) . . Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Basic Constraints: critical CA:FALSE X509v3 Subject Key Identifier: A5:DB:7C:6A:8B:0B:7A:22:45:52:1E:85:29:32:77:18:A3:9D:87:76 X509v3 Authority Key Identifier: keyid:25:E2:18:0E:B2:57:91:94:2A:E5:D4:5D:86:90:83:DE:53:B3:B8:92 Authority Information Access: OCSP - URI:http://ocsp.pki.goog/s/gts1d4/qMhEcTt7LjA CA Issuers - URI:http://pki.goog/repo/certs/gts1d4.der X509v3 Subject Alternative Name: DNS:34.149.207.105.nip.io X509v3 Certificate Policies: Policy: 2.23.140.1.2.1 Policy: 1.3.6.1.4.1.11129.2.5.3 X509v3 CRL Distribution Points: Full Name: URI:http://crls.pki.goog/gts1d4/LjtNmxrQfWE.crl
請確認憑證中的一般名稱 (CN) 與在 Apigee 中>「管理」>「環境」>「群組」中設定的主機名稱相符。請確認憑證有效且未過期。您可以使用
openssl
執行這些檢查。
-
使用下列
gcloud 指令列出負載平衡器。這個指令也會顯示與各負載平衡器相關聯的
- 使用 Google Cloud 控制台:
-
如要檢查負載平衡器傳回的 TLS 憑證,請在用戶端電腦上執行下列
openssl
指令。檢查這張憑證是否與上述步驟 1中傳回的憑證相符。openssl s_client -connect LB_HOSTNAME_OR_IP:443 -servername LB_HOSTNAME -showcerts
更改下列內容:
-
LB_HOSTNAME_OR_IP:負載平衡器主機名稱或 IP 位址。例如:
my-load-balancer
。 -
LB_HOSTNAME:負載平衡器主機名稱。例如:
my-hostname
。
如要確認憑證是否相符,請在用戶端執行下列指令:
echo | openssl s_client -connect HOST_NAME:443 -servername HOST_NAME | openssl x509 -noout -text | openssl md5
將 HOST_NAME 替換為在 Apigee 中設定的主機名稱 (依序點選「管理」>「環境」>「群組」)。
然後執行下列 gcloud 指令,確認
md5
是否相符:gcloud compute ssl-certificates describe CERTIFICATE_NAME --project PROJECT_NAME --format json | jq -r '.certificate' | openssl x509 -noout -text | openssl md5
將 CERTIFICATE_NAME 替換為憑證名稱。例如:
my-certificate
-
LB_HOSTNAME_OR_IP:負載平衡器主機名稱或 IP 位址。例如:
-
如果步驟 1 和步驟 2 憑證相符 (也就是
md5
值相符),請繼續在用戶端收集packet capture
,以調查 TLS 握手失敗問題。您可以使用 Wireshark、tcpdump 或其他可靠工具,在用戶端擷取封包。 - 按照「 啟用現有後端服務的記錄功能」一文中的操作說明,為負載平衡器啟用記錄功能。
- 查看負載平衡器的 記錄,瞭解是否有任何錯誤。
解決方法
- 如果負載平衡器上的自行管理憑證已過期或 CN/SAN 值不正確,您可能需要 更換負載平衡器上的憑證。
-
如果負載平衡器在步驟 1 中傳回的憑證與步驟 2中的憑證不符,可能表示負載平衡器提供的是過時/錯誤的憑證,您應向 Google Cloud 客戶服務提交支援單。
-
如果
tcpdump
指出 TLS 握手失敗,請調查連線失敗是否來自負載平衡器或用戶端。- 如果失敗或連線重設是來自用戶端,請檢查用戶端應用程式,瞭解其異常行為的原因。舉例來說,您可以檢查用戶端的網路設定,或驗證用戶端應用程式是否可與 Apigee 連線。
- 如果您發現負載平衡器本身發生失敗/重設問題,請參閱 排解一般連線問題,並視需要向 Google Cloud Customer Care 提交支援單。
- 如果您在負載平衡器記錄中看到錯誤,請參閱「 無法解釋的 5XX 錯誤」,並視需要向 Google Cloud Customer Care 提交支援單。
如果仍需要協助,請參閱「必須收集診斷資訊」一文。
原因:Cloud Armor 封鎖要求
診斷
如果您看到 Cloud Armor 設定中的 403
、404
或 502
錯誤回應,請檢查負載平衡器和 MIG 設定,確認設定正確且運作正常。
- 如果您在 Google Cloud 環境中使用 Google Cloud Armor,請檢查 Google Cloud Armor 設定,找出可能封鎖要求的規則。安全性政策可在「 設定 Google Cloud Armor 安全性政策」一文中找到。
- 如果您不確定哪個規則會拒絕流量,可以嘗試按照「 在現有後端服務中啟用記錄」一文的說明,在負載平衡器中啟用記錄功能。
-
啟用記錄功能後,請執行記錄查詢,找出遭 Google Cloud Armor 政策封鎖的任何要求:
-
前往 Google Cloud 控制台的「Logs Explorer」頁面。
-
將下列內容貼到「Query」窗格:
jsonPayload.enforcedSecurityPolicy.outcome="DENY"
- 點選「執行查詢」
-
強制執行的政策名稱會顯示在「查詢結果」窗格中的
jsonPayload.enforcedSecurityPolicy.name
中:
-
解決方法
請修改 Google Cloud Armor 規則/設定,以符合您的需求,解決這個問題。如需這方面的協助,請與 Google Cloud Customer Care 團隊聯絡。
原因:Apigee 代理程式 VM 無法將流量轉送至 Apigee 執行個體
診斷
-
如果 API 用戶端收到
HTTP 502
錯誤,且顯示以下錯誤訊息,則 Apigee API 流量路由器 Proxy VM 可能處於不健康狀態。客戶端可能會收到以下
502
錯誤:<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>502 Server Error</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Server Error</h1> <h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2> <h2></h2> </body></html>
查看負載平衡器記錄,找出下列類似的錯誤訊息:
statusDetails: "failed_to_pick_backend" severity: "WARNING"
在代管執行個體群組 (MIG) 中執行的 VM 有
apigee-proxy
前置字串,可將流量轉送至 Apigee 執行個體。如果您看到上述訊息,請按照下列步驟檢查執行個體群組中apigee-proxy
VM 的健康狀態:-
前往 Google Cloud 控制台的「負載平衡」頁面。
-
按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
-
在「Backend」區段中,確認所有負載平衡器後端在「Healthy」欄中顯示綠色勾號。
-
-
確認 MIG 範本中的端點 IP 位址是否與 Apigee 執行個體 IP 位址相符。
apigee-proxy
VM 是使用執行個體範本建立的。範本會定義ENDPOINT
IP 位址,用於連線至 Apigee 執行個體 IP 位址。-
取得 Apigee 執行個體的 IP 位址:
curl -s -H "Authorization: Bearer (gcloud auth print-access-token)" \ "https://apigee.googleapis.com/v1/organizations/ORG_NAME/instances/INSTANCE_NAME"
更改下列內容:
-
ORG_NAME:機構名稱。例如:
my-org
。 -
INSTANCE_NAME:執行個體名稱。例如:
apigee-proxy-example
。
-
ORG_NAME:機構名稱。例如:
-
或者,您也可以使用 Apigee UI 取得 Apigee 執行個體 IP 位址:
- 在 Apigee UI 中,依序按一下「管理」>「執行個體」。
-
「IP 位址」欄會列出 IP 位址:
-
從範本取得
ENDPOINT
IP 位址:-
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
- 在「Backend」區域中,按一下後端服務名稱。
-
在「Instance group members」區域中,按一下「Template」名稱。
-
在範本頁面上,捲動至「自訂中繼資料」,您會看到「ENDPOINT」IP 位址:
-
請確認「ENDPOINT」IP 位址與 步驟 2 中傳回的 Apigee IP 位址相符。如果不相符,請參閱「解決方法」。
-
取得 Apigee 執行個體的 IP 位址:
解決方法
-
如果執行個體群組中的
apigee-proxy
VM 顯示不健康狀態,請確認您已設定防火牆規則,讓負載平衡 IP 位址範圍130.211.0.0/22
和35.191.0.0/16
存取 MIG。 -
前往 Google Cloud 控制台的「Firewall」頁面。
-
請確認防火牆規則中包含
target-tag
和來源 IP 範圍,例如gke-apigee-proxy
、130.211.0.0/22
和35.191.0.0/16
,並透過443 TCP
通訊埠傳送:如果 MIG 的標記與
gke-apigee-proxy
不同,請確認標記已新增至防火牆規則中的target-tag
。如果沒有防火牆規則,請新增。
- 如果 ENDPOINT IP 位址與 Apigee 執行個體 IP 位址不符,可能是因為執行個體已刪除並重新建立,導致 IP 位址不再與範本中的 IP 位址相符。如要更新範本以使用新的 IP 位址,請按照「 變更執行個體 IP 位址」中的操作說明進行。
原因:網路設定錯誤
診斷
-
執行下列 API 呼叫,找出
authorizedNetwork
的值:curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME"
系統會傳回類似以下的內容:
{ "name": "apigee-example-org", "createdAt": "1621287579456", "lastModifiedAt": "1674063833580", "environments": [ "test" ], "properties": { "property": [ { "name": "features.mart.connect.enabled", "value": "true" }, { "name": "features.hybrid.enabled", "value": "true" } ] }, "analyticsRegion": "us-west1", "authorizedNetwork": "default", "runtimeType": "CLOUD", "subscriptionType": "PAID", "caCertificate": "certificate-number", "runtimeDatabaseEncryptionKeyName": "projects/apigee-example-org/locations/us-west1/keyRings/my-database-key-ring/cryptoKeys/my-database-key", "projectId": "apigee-example-org", "state": "ACTIVE", "billingType": "SUBSCRIPTION", "addonsConfig": { "advancedApiOpsConfig": {}, "integrationConfig": {}, "monetizationConfig": {} }, "apigeeProjectId": "l09587a43efde330cp-tp" }
在這個範例中,
authorizedNetwork
的值為預設值。 -
確認
authorizedNetwork
值與與servicenetworking
配對的網路相同:-
在主專案的 Google Cloud 控制台中,前往「VPC network peering」頁面。
-
您的 VPC 網路中列出的
servicenetworking-googleapis-com
值應與 API 呼叫傳回的值相同。例如:default
。
-
-
如果您使用共用虛擬私有雲,請確認
authorizedNetwork
值具有與servicenetworking
配對的主機專案中實際 VPC 的值。-
在 Google Cloud 控制台中,前往「Shared VPC」(共用 VPC) 頁面。
- 選取主專案。
-
您的 VPC 網路中列出的
servicenetworking-googleapis-com
值應與 API 呼叫傳回的authorizedNetwork
值相同。例如default
。
-
-
確認與負載平衡器相關聯的執行個體群組與
authorizedNetwork
值位於相同的網路:-
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
-
按一下負載平衡器名稱。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。「後端」區域會顯示執行個體群組清單:
- 按一下執行個體群組的名稱。系統會顯示執行個體群組的「總覽」頁面。
- 按一下 [Details] (詳細資料) 分頁標籤。
-
捲動至「網路」部分:
-
確認這裡的「Primary network」 與
authorizedNetwork
值相同。例如:default
。 - 按一下「總覽」分頁標籤。
- 在「Instance Group Members」部分,按一下執行個體名稱。系統隨即會顯示「Details」(詳細資料) 頁面。
-
捲動至「Network Interfaces」部分:
-
確認「Network」值與
authorizedNetwork
值相同。例如:default
。 - 前往「總覽」分頁,然後針對「Instance Group Members」部分中的每個執行個體,重複執行步驟 h 至 步驟 j。
-
解決方法
-
如果在步驟 2或步驟 3中,
authorizedNetwork
值與與servicenetworking
建立對等連線的網路不同,請按照 步驟 4:設定服務網路中的步驟,確認您已與servicenetworking
建立正確的 VPC 網路對等連線。 -
如果在步驟 4f 和 4j 中,網路值與
authorizedNetwork
值不一致,請確認authorizedNetwork
是與servicenetworking.
配對的網路。如果配對正確,但網路仍與authorizedNetwork,
不一致,表示建立的執行個體群組有誤,您應與 Google Cloud 客戶服務團隊聯絡。
原因:在為區域擴充功能建立的新 Apigee 執行個體上未連結環境
診斷
-
您在用戶端看到
503
錯誤。例如:HTTP/2 503 date: Thu, 08 Jun 2023 07:22:15 GMT content-length: 0 via: 1.1 google alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
-
如果在
區域擴充後,第二個區域立即出現
503
錯誤,請採取以下做法:-
執行下列
API 呼叫,確認環境已附加至新執行個體:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/instances/NEW_INSTANCE/attachments"
例如:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/apigee-example-org/instances/apigee-proxy-example/attachments"
系統會傳回類似以下的內容:
{ "attachments": [ { "name": "9ed157df-5ef2-4cdc-b1d5-2643b480eb33", "environment": "dev", "createdAt": "1628153855420" }, { "name": "a9e04dff-4ca4-4749-902f-5058e28c26a5", "environment": "prod", "createdAt": "1664517347106" } ] }
在這個範例中,名為
apigee-proxy-example
的執行個體已連結至兩個環境:dev
和prod
。 -
確認已建立第二個區域的代管執行個體群組 (MIG),且顯示為健康狀態:
-
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
-
在「Backend」下方,您應該會看到兩個 MIG,一個用於區域 1,另一個用於區域 2。確認兩者皆為正常狀態:
- 按照「Apigee 代理 VM 無法將流量轉送至 Apigee 執行個體」一文中的步驟驗證第二個 MIG。
-
-
執行下列
API 呼叫,確認環境已附加至新執行個體:
解決方法
-
如果新執行個體未連結至環境,請按照「 將環境連結至新執行個體」一文中的指示,將執行個體連結至環境。
另一個做法是確保負載平衡器將要求轉送至已連結環境的正確後端。例如非生產環境。您可能只想將此項目附加至一個區域,但負載平衡器可能會將要求轉送至錯誤的區域。您需要更新負載平衡器設定,確保負載平衡器會將流量導向正確的區域。
- 如果 MIG 處於不良狀態,請參閱「Apigee 代理 VM 無法將流量轉送至 Apigee 執行個體」中的「診斷」和「解決方法」。
必須收集診斷資訊
如果問題在您按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡:
- Apigee 組織
- 發生問題的環境和 API Proxy
- 下載的偵錯工作階段 (如果問題是間歇性發生)
- 失敗要求的詳細 curl 輸出內容。
- 負載平衡器已設定為將 API 呼叫傳送至 Apigee