Apigee 的存取路由問題

您正在查看 ApigeeApigee 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 錯誤

診斷

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

        前往負載平衡

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

      3. 在「前端」區域的「IP:Port」欄中,確認 IP 位址和通訊埠是否正確,以便查看正確的負載平衡器。
      4. 在「Certificate」欄中,按一下憑證名稱,即可查看 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

        請確認憑證中的一般名稱 (CN) 與在 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 握手失敗問題。您可以使用 Wiresharktcpdump 或其他可靠工具,在用戶端擷取封包。
  4. 按照「 啟用現有後端服務的記錄功能」一文中的操作說明,為負載平衡器啟用記錄功能。
  5. 查看負載平衡器的 記錄,瞭解是否有任何錯誤。

解決方法

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

如果仍需要協助,請參閱「必須收集診斷資訊」一文。

原因:Cloud Armor 封鎖要求

診斷

如果您看到 Cloud Armor 設定中的 403404502 錯誤回應,請檢查負載平衡器和 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. 將下列內容貼到「Query」窗格:

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

解決方法

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

原因:Apigee 代理程式 VM 無法將流量轉送至 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"

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

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

      前往負載平衡

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

    3. 在「Backend」區段中,確認所有負載平衡器後端在「Healthy」欄中顯示綠色勾號。

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

    apigee-proxy VM 是使用執行個體範本建立的。範本會定義 ENDPOINT IP 位址,用於連線至 Apigee 執行個體 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 UI 取得 Apigee 執行個體 IP 位址:

      1. Apigee UI 中,依序按一下「管理」>「執行個體」
      2. 「IP 位址」欄會列出 IP 位址:

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

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

        前往負載平衡

      2. 按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
      3. 在「Backend」區域中,按一下後端服務名稱。
      4. 在「Instance group members」區域中,按一下「Template」名稱。

      5. 在範本頁面上,捲動至「自訂中繼資料」,您會看到「ENDPOINT」IP 位址:

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

解決方法

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

    前往「Firewall」(防火牆)

  3. 請確認防火牆規則中包含 target-tag 和來源 IP 範圍,例如 gke-apigee-proxy130.211.0.0/2235.191.0.0/16,並透過 443 TCP 通訊埠傳送:

    如果 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. 您的 VPC 網路中列出的 servicenetworking-googleapis-com 值應與 API 呼叫傳回的值相同。例如:default
  3. 如果您使用共用虛擬私有雲,請確認 authorizedNetwork 值具有與 servicenetworking 配對的主機專案中實際 VPC 的值。

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

      前往共用虛擬私有雲

    2. 選取主專案。
    3. 您的 VPC 網路中列出的 servicenetworking-googleapis-com 值應與 API 呼叫傳回的 authorizedNetwork 值相同。例如 default
  4. 確認與負載平衡器相關聯的執行個體群組與 authorizedNetwork 值位於相同的網路:

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

      前往負載平衡

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

    3. 按一下執行個體群組的名稱。系統會顯示執行個體群組的「總覽」頁面。
    4. 按一下 [Details] (詳細資料) 分頁標籤。
    5. 捲動至「網路」部分:

    6. 確認這裡的「Primary network」authorizedNetwork 值相同。例如:default
    7. 按一下「總覽」分頁標籤。
    8. 在「Instance Group Members」部分,按一下執行個體名稱。系統隨即會顯示「Details」(詳細資料) 頁面。
    9. 捲動至「Network Interfaces」部分:

    10. 確認「Network」值與 authorizedNetwork 值相同。例如:default
    11. 前往「總覽」分頁,然後針對「Instance Group Members」部分中的每個執行個體,重複執行步驟 h步驟 j

解決方法

  1. 如果在步驟 2步驟 3中,authorizedNetwork 值與與 servicenetworking 建立對等連線的網路不同,請按照 步驟 4:設定服務網路中的步驟,確認您已與 servicenetworking 建立正確的 VPC 網路對等連線。
  2. 如果在步驟 4f4j 中,網路值與 authorizedNetwork 值不一致,請確認 authorizedNetwork 是與 servicenetworking. 配對的網路。如果配對正確,但網路仍與 authorizedNetwork, 不一致,表示建立的執行個體群組有誤,您應與 Google Cloud 客戶服務團隊聯絡。

原因:在為區域擴充功能建立的新 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 的執行個體已連結至兩個環境:devprod

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

        前往負載平衡

      2. 按一下負載平衡器的「名稱」。「Load balancer details」(負載平衡器詳細資料) 頁面隨即開啟。
      3. 在「Backend」下方,您應該會看到兩個 MIG,一個用於區域 1,另一個用於區域 2。確認兩者皆為正常狀態:

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

解決方法

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

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

  2. 如果 MIG 處於不良狀態,請參閱「Apigee 代理 VM 無法將流量轉送至 Apigee 執行個體」中的「診斷」和「解決方法」。

必須收集診斷資訊

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

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