Apigee 的存取路由問題

您目前查看的是 ApigeeApigee 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. 按一下負載平衡器的「名稱」。「負載平衡器詳細資料」頁面隨即開啟。

      3. 在「Frontend」(前端) 區域的「IP:Port」(IP:通訊埠) 欄中,確認您查看的負載平衡器 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

        請確認憑證中的一般名稱 (CN) 與 Apigee 中設定的主機名稱相符 (依序點選「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. 將下列內容貼入「查詢」窗格:

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

解析度

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

原因:Apigee Proxy 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"

    有一組 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-proxy VM 是使用執行個體範本建立,範本會定義連線至 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 使用者介面中,依序點選「管理」>「執行個體」
      2. 「IP addresses」(IP 位址) 欄會列出 IP 位址:

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

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

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

      2. 按一下負載平衡器的「名稱」。「負載平衡器詳細資料」頁面隨即開啟。
      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. 確認是否已設置輸入防火牆規則,允許透過 443 TCP 通訊埠,從 130.211.0.0/2235.191.0.0/16 等來源 IP 範圍,輸入 gke-apigee-proxytarget-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」(虛擬私有雲網路對等互連) 頁面。

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

    2. 您的 VPC 網路中列出的 servicenetworking-googleapis-com 值,應與 API 呼叫傳回的值相同。例如:default
  3. 如果您使用共用 VPC,請確認 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」(負載平衡) 頁面。

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

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

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

    6. 確認這裡的「主要網路」authorizedNetwork 值相同。例如:default
    7. 按一下「總覽」分頁標籤。
    8. 在「Instance Group Members」(執行個體群組成員) 區段中,按一下執行個體的名稱。系統隨即會顯示「詳細資料」頁面。
    9. 捲動至「網路介面」部分:

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

解析度

  1. 如果在步驟 2步驟 3 中,authorizedNetwork 值與對等互連的 servicenetworking 網路不同,請按照「 步驟 4:設定服務網路」中的步驟,確認您已將正確的虛擬私有雲網路與 servicenetworking 對等互連。
  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」(負載平衡) 頁面。

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

      2. 按一下負載平衡器的「名稱」。「負載平衡器詳細資料」頁面隨即開啟。
      3. 在「後端」下方,您應該會看到兩個 MIG,分別對應區域 1 和區域 2。確認兩者皆為正常運作狀態:

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

解析度

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

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

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

必須收集診斷資訊

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

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