Apigee 的存取路由問題

本頁內容適用於 Apigee 和 Apigee Hybrid。

查看 Apigee Edge 說明文件。

問題

在某些情況下,外部用戶端無法以所需方式存取/連線至 Apigee。包括網路連線失敗 (TLS 握手失敗) 或 Apigee 的 4xx/5xx 回應。

錯誤訊息

從用戶端傳送 API 要求至 Apigee 時,您會看到 TLS 握手失敗或 4xx/5xx 回應,即使 API Proxy 在 Apigee UI 中看似正常運作也一樣。

可能原因

原因 說明 錯誤代碼
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 虛擬私有雲對等互連。 502 Server error
作為區域擴充的一部分而建立的新 Apigee 實例上的未附加環境 建立新執行個體 (例如第二個區域) 後,您必須將環境附加至該執行個體,否則執行個體無法回應 API 要求。 503 error response

原因:HTTPS 負載平衡器發生 TLS 錯誤

診斷

  1. 找到與負載平衡器關聯的 TLS 憑證。
    1. 使用 Google Cloud 控制台:
      1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

        前往「Load balancing」(負載平衡)

      2. 點選負載平衡器 名稱。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。

      3. 在 Frontend 區域的 IP:Port 列中,透過驗證其 IP 位址和端口,確保您正在查看正確的負載平衡器。
      4. 在 憑證 欄位中,按一下憑證名稱以查看 TLS 憑證。
    2. 使用 gcloud 指令:
      1. 使用下列 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: 
      2. 使用下列 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

        Make sure that the common name (中國) in the certificate matches the主機名稱configured in Apigee>行政>環境>團體。確認憑證有效且未過期。您可以使用 openssl 來執行這些檢查。

  2. 若要檢查負載平衡器傳回的 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

  3. 如果步驟 1和步驟 2 的憑證相符 (即 md5 值相符),請繼續在用戶端收集 packet capture ,以調查 TLS 交握失敗問題。您可以使用 Wireshark、tcpdump 或任何其他可靠的工具,在用戶端擷取封包。
  4. 依照 在現有後端服務上啟用日誌記錄 中的說明,在負載平衡器上啟用日誌記錄。
  5. 查看負載平衡器 記錄檔,瞭解是否有任何錯誤。

解析度

  1. 如果負載平衡器上的自管理憑證已過期或 CN/SAN 值不正確,則可能需要 來取代負載平衡器上的憑證。
  2. 如果步驟 1 中負載平衡器傳回的憑證與步驟 2 中的憑證不符,可能表示負載平衡器提供過時/不正確的憑證,請向 Google Cloud Customer Care提出支援要求。
  3. 如果 tcpdump 表示 TLS 握手失敗,請調查連線失敗的原因是負載平衡器還是用戶端。
    • 如果失敗或連線重設是來自用戶端,請檢查用戶端應用程式,瞭解發生異常行為的原因。舉例來說,您可以檢查用戶端網路設定,或確認用戶端應用程式是否能連線至 Apigee。
    • 如果負載平衡器本身發生失敗/重設情形,請參閱「 排解一般連線問題」,並視需要向 Google Cloud Customer Care 提交支援單。
  4. 如果您在負載平衡器日誌中看到錯誤,請參閱 未解釋的 5XX 錯誤,並根據需要向 Google Cloud Customer Care 提交支援單。

如果您仍然需要協助,請參閱必須收集診斷資訊。

原因:Cloud Armor 封鎖要求

診斷

如果根據 Cloud Armor 設定,您看到 403、404 或 502 錯誤回應,請檢查負載平衡器和 MIG 設定,確認設定正確且狀態良好。

  1. 如果您在 Google Cloud 環境中使用 Google Cloud Armor,請檢查 Google Cloud Armor 設定,找出可能封鎖要求的規則。安全性政策位於「 設定 Google Cloud Armor 安全性政策」一節。
  2. 如果不確定是哪項規則拒絕流量,可以嘗試在負載平衡器啟用記錄功能,如「 在現有後端服務上啟用記錄功能」一文所述。
  3. 啟用記錄後,請執行記錄查詢,找出遭 Google Cloud Armor 政策封鎖的要求:

    1. 前往 Google Cloud 控制台的「Logs Explorer」頁面。

      前往「Logs Explorer」頁面

    2. 將下列內容貼到「查詢」窗格:

      jsonPayload.enforcedSecurityPolicy.outcome="DENY"
    3. 點選「執行查詢」
    4. 強制執行的政策名稱會顯示在「Query results」(查詢結果) 窗格的 jsonPayload.enforcedSecurityPolicy.name 中:

解析度

修改 Google Cloud Armor 規則/設定,以符合您的需求,解決這個問題。如果您需要這方面的協助,請聯絡 Google Cloud Customer Care。

原因:Apigee 代理虛擬機器無法將流量轉送至 Apigee 執行個體。

診斷

  1. 如果 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"

    有一組 VM (前置字元為 apigee-proxy) 在代管執行個體群組 (MIG) 中執行,負責將流量轉送至 Apigee 執行個體。如果看到上述訊息,請按照下列步驟檢查執行個體群組中 apigee-proxy VM 的健康狀態:

    1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

      前往「Load balancing」(負載平衡)

    2. 按一下負載平衡器的「名稱」。開啟 負載平衡器詳細資料 頁面。

    3. 在「Backend」(後端) 區段中,確認所有負載平衡器後端的「Healthy」(健康狀態良好) 欄都顯示綠色勾號。

  2. 確認 MIG 範本中的端點 IP 位址與 Apigee 執行個體 IP 位址相符。

    apigee-proxyVM 是使用執行個體範本建立。此範本定義了用於連接到 Apigee 實例 IP 位址的 ENDPOINT IP 位址。

    1. 取得 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。
    2. 或者,您也可以使用 Apigee 使用者介面取得 Apigee 執行個體 IP 位址:

      1. 在 Apigee UI 中,依序點選「管理」>「執行個體」。
      2. IP 位址列列出了 IP 位址:

    3. 從範本取得 ENDPOINT IP 位址:

      1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

        轉到負載平衡

      2. 按一下負載平衡器的「名稱」。「負載平衡器詳細資料」頁面隨即開啟。
      3. 在「Backend」(後端) 區域中,按一下後端服務名稱。
      4. 在 實例組成員 區域中,按一下 範本 名稱。

      5. 在範本頁面中,捲動至「自訂中繼資料」,即可查看「ENDPOINT」IP 位址:

    確認 ENDPOINT IP 位址與步驟 2 中傳回的 Apigee IP 位址相符。如果不相符,請前往「解決方法」。

解析度

  1. 如果執行個體群組中的 apigee-proxy VM 顯示健康狀態不良,請確認您已設定防火牆規則,允許負載平衡 IP 位址範圍 130.211.0.0/22 和 35.191.0.0/16 存取 MIG。
  2. 前往 Google Cloud 控制台的「Firewall」(防火牆) 頁面。

    前往「Firewall」(防火牆) 頁面

  3. 確認是否已設置輸入防火牆規則,允許透過 443 TCP 通訊埠,從 130.211.0.0/22 和 35.191.0.0/16 等來源 IP 範圍,使用 gke-apigee-proxy 等通訊協定傳輸 target-tag:

    如果 MIG 的標記與 gke-apigee-proxy 不同,請確認標記已新增至防火牆規則中的 target-tag。

    如果沒有,請新增防火牆規則。

  4. 如果 ENDPOINT IP 位址與 Apigee 實例 IP 位址不匹配,則可能是該實例已被刪除並重新創建,導致 IP 位址與範本中的 IP 位址不再匹配。如要更新範本以使用新的 IP 位址,請按照「 變更執行個體 IP」一文中的操作說明進行。

原因:網路設定錯誤

診斷

  1. 執行下列 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 的值為預設值。

  2. 確認 authorizedNetwork 值與對等互連的 servicenetworking 網路相同:

    1. 在主機專案的 Google Cloud 控制台中,前往虛擬私有雲網路對等連接頁面。

      前往「VPC network peering」(虛擬私有雲網路對等互連) 頁面

    2. 「您的虛擬私有雲網路」中列出的 servicenetworking-googleapis-com 值,應與 API 呼叫傳回的值相同。例如:default。
  3. 如果您使用 Shared VPC,請確認 authorizedNetwork 值具有主專案中實際 VPC 的值,該 VPC 與 servicenetworking 對等互連。

    1. 前往 Google Cloud 控制台的「Shared VPC」(共用 VPC) 頁面。

      前往 Shared VPC

    2. 選取主專案。
    3. 您的虛擬私有雲網路 中 servicenetworking-googleapis-com 列出的值應與 API 呼叫傳回的值 authorizedNetwork 相同。例如:default。
  4. 驗證與負載平衡器關聯的實例組是否與 authorizedNetwork 值屬於同一網路:

    1. 在 Google Cloud 控制台中,前往負載平衡頁面。

      前往「Load balancing」(負載平衡)

    2. 按一下負載平衡器名稱。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。「後端」區域會顯示執行個體群組清單:

    3. 按一下實例組的名稱。系統隨即顯示執行個體群組的「總覽」頁面。
    4. 點按「Details」(詳細資料) 分頁標籤。
    5. 捲動到聯網部分:

    6. 確認這裡的「主要網路」與 authorizedNetwork 值相同。例如:default。
    7. 按一下「總覽」分頁標籤。
    8. 在Instance Group Members在對應部分,按一下實例名稱。頁面顯示詳情。
    9. 捲動到“網路介面”部分:

    10. 驗證 Network 值是否與 authorizedNetwork 值相同。例如:default。
    11. 前往「Overview」(總覽) 分頁,然後針對「Instance Group Members」(執行個體群組成員) 區段中的每個執行個體,重複步驟 h 至步驟 j。

解析度

  1. 如果在 步驟 2 或 步驟 3 中,authorizedNetwork 值與 servicenetworking 對等的網路不同,請依照 步驟 4:設定服務網路 中的步驟,確保已將正確的虛擬私有雲網路與 servicenetworking 對等。
  2. 如果在步驟 4f 和 4j 中,網路值與 authorizedNetwork 值不同,請確認 authorizedNetwork 是與 servicenetworking. 對等互連的網路。如果對等互連正確,但網路仍與 authorizedNetwork, 不同,表示執行個體群組建立有誤,請與 Google Cloud Customer Care聯絡。

原因:在區域擴充過程中建立的新 Apigee 實例上存在未附加的環境

診斷

  1. 用戶端顯示 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
  2. 如果在區域擴展後,第二個區域立即顯示 503 錯誤:
    1. 執行以下 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。

    2. 確認第二個區域的代管執行個體群組 (MIG) 已建立,且顯示為健康狀態良好:
      1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

        轉到負載平衡

      2. 按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
      3. 在「後端」下方,您應該會看到兩個 MIG,分別對應區域 1 和區域 2。確認兩者健康狀態良好:

      4. 按照「Apigee Proxy VM 無法將流量轉送至 Apigee 執行個體」一文中的步驟,驗證第二個 MIG。

解析度

  1. 如果新執行個體未連結至環境,請按照「 將環境連結至新執行個體」一文中的操作說明,將執行個體連結至環境。

    另一種方法是確保負載平衡器將請求路由到已連接環境的正確後端。例如,在非生產環境中。您可能只想將這項設定附加至一個區域,但負載平衡器可能會將要求轉送至錯誤的區域。您需要更新負載平衡器設定,確保負載平衡器將流量導向正確的區域。

  2. 如果 MIG 狀況不佳,請參閱「診斷」和「解決方法」,瞭解 Apigee 代理 VM 無法將流量轉送至 Apigee 執行個體的原因。

必須收集診斷資訊

如果按照上述操作說明後問題仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡:

  • Apigee 組織
  • 發生問題的環境和 API Proxy
  • 下載的偵錯工作階段 (如果問題斷斷續續發生)
  • 失敗請求的詳細 curl 輸出。
  • 負載平衡器已設定為將 API 呼叫傳送至 Apigee