Apigee 的访问路由问题

您正在查看 ApigeeApigee Hybrid 文档。
此主题没有等效的 Apigee Edge 文档。

症状

在某些情况下,外部客户端无法以所需的方式访问/连接到 Apigee。这包括网络连接失败(TLS 握手失败)或来自 Apigee 的 4xx/5xx 响应。

错误消息

从客户端向 Apigee 发送 API 请求时,即使 API 代理在 Apigee 界面中可能看起来运行状况良好,您也会看到 TLS 握手失败或 4xx/5xx 响应。

可能的原因

原因 说明 错误代码
HTTPS 负载均衡器上的 TLS 错误 您可以管理 HTTPS 负载均衡器的 TLS 配置。调查 HTTPS 负载均衡器日志中的任何 TLS 错误。 负载均衡器 IP 地址中的 TLS 握手错误
Google Cloud Armor 阻止请求 如果您使用的是 Google Cloud Armor,则可能存在规则阻止请求。 API 响应代码可能会因 Google Cloud Armor 配置而异。拒绝规则可能会返回 HTTP 403 (Unauthorized)、404 (Access Denied)、502 (Bad Gateway) 响应,甚至是其他响应代码。
Apigee 代理虚拟机无法将流量转发到 Apigee 实例 您需要调查 Apigee API 流量路由器代理配置及其运行状况 502 Server Error
网络配置不正确 确保正确的网络与 Apigee VPC 对等互连。 502 Server error
在区域扩展中创建的新 Apigee 实例上的未关联环境 创建新实例(例如第二个区域)后,您必须将环境关联到该实例,否则该实例无法响应 API 请求。 503 error response

原因:HTTPS 负载均衡器上的 TLS 错误

诊断

  1. 找到与负载均衡器关联的 TLS 证书。
    1. 使用 Google Cloud 控制台:
      1. 在 Google Cloud 控制台中,转到负载均衡页面。

        转到“负载均衡”

      2. 点击负载均衡器名称负载均衡器详情页面随即打开。

      3. 前端区域的 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 > 管理 > 环境 >中配置的主机名匹配。确保证书有效且未过期。您可以使用 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 Customer Care 提交工单。
  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 控制台中,转到日志浏览器页面。

      转到日志浏览器

    2. 将以下内容粘贴到查询窗格中:

      jsonPayload.enforcedSecurityPolicy.outcome="DENY"
    3. 点击运行查询
    4. 强制执行政策的名称显示在查询结果窗格中的 jsonPayload.enforcedSecurityPolicy.name 中:

解决方法

修改 Google Cloud Armor 规则/配置,以满足您的需求。如果您需要帮助,请与 Google Cloud Customer Care 联系。

原因:Apigee 代理虚拟机无法将流量转发到 Apigee 实例

诊断

  1. 如果 API 客户端收到 HTTP 502 错误,并显示以下错误消息,则表示 Apigee API 流量路由器代理虚拟机可能处于运行状况不佳的状态。

    客户端可能会收到 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) 中运行一组虚拟机(具有 apigee-proxy 前缀),将流量转发到 Apigee 实例。如果您看到上述消息,请按照以下步骤检查实例组中 apigee-proxy 虚拟机的运行状况:

    1. 在 Google Cloud 控制台中,转到负载均衡页面。

      转到“负载均衡”

    2. 点击负载均衡器名称负载均衡器详情页面随即打开。

    3. 后端部分中,验证所有负载均衡器后端在运行状况良好列中是否带有绿色对勾标记。

  2. 验证 MIG 模板中的端点 IP 地址是否与 Apigee 实例 IP 地址匹配。

    apigee-proxy 虚拟机是使用实例模板创建的。模板定义用于连接到 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 地址列列出了 IP 地址:

    3. 从模板获取 ENDPOINT IP 地址:

      1. 在 Google Cloud 控制台中,转到负载均衡页面。

        转到“负载均衡”

      2. 点击负载均衡器名称负载均衡器详情页面随即打开。
      3. 后端区域,点击后端服务名称。
      4. 实例组成员区域中,点击模板名称。

      5. 在模板页面上,滚动到自定义元数据,您将在其中看到端点 IP 地址:

    确保 ENDPOINT IP 地址与第 2 步中返回的 Apigee IP 地址匹配。如果不匹配,请转到解决方法

解决方法

  1. 如果 apigee-proxy 实例组中的虚拟机显示运行状况不佳,则请确保您实施了允许负载均衡 IP 地址范围的防火墙规则,该规则让 130.211.0.0/2235.191.0.0/16 可访问 MIG。
  2. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙”

  3. 确保 443 TCP 端口上存在带有 target-tag(如 gke-apigee-proxy)和源 IP 范围(如 130.211.0.0/2235.191.0.0/16)的入口防火墙规则:

    如果 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 网络对等互连页面。

      进入“VPC 网络对等互连”

    2. 您的 VPC 网络中列出的 servicenetworking-googleapis-com 值应与从 API 调用返回的值相同。例如 default
  3. 如果您使用的是共享 VPC,请确保 authorizedNetwork 值跟与 servicenetworking 对等互连的宿主项目中的实际 VPC 的值相同。

    1. 在 Google Cloud 控制台中,进入共享 VPC 页面。

      转到共享 VPC

    2. 选择宿主项目。
    3. 您的 VPC 网络中为 servicenetworking-googleapis-com 列出的值应与 API 调用返回的值 authorizedNetwork 相同。例如, default
  4. 验证与负载均衡器关联的实例组与 authorizedNetwork 值是否位于同一网络中:

    1. 在 Google Cloud 控制台中,转到负载均衡页面。

      转到“负载均衡”

    2. 点击负载均衡器名称。负载均衡器详情页面随即打开。后端区域会显示实例组列表:

    3. 点击一个实例组的名称。实例组概览页面随即显示。
    4. 点击详情标签页。
    5. 滚动到网络部分:

    6. 验证此处的主要网络是否与 authorizedNetwork 值相同。例如 default
    7. 点击概览标签页。
    8. 实例组成员部分中,点击实例的名称。详细信息页面随即显示。
    9. 滚动到网络接口部分:

    10. 验证网络值是否与 authorizedNetwork 值相同。例如 default
    11. 转到概览标签页,然后为实例组成员部分中的每个实例重复步骤 h步骤 j

解决方法

  1. 如果在第 2 步第 3 步中,authorizedNetwork 值跟与 servicenetworking 对等互连的网络不同,则请按照步骤 4:配置服务网络中的步骤操作,确保您已将正确的 VPC 网络与 servicenetworking 对等互连。
  2. 如果在步骤 4f4j 中,网络值与 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 的实例附加到两个环境:devprod

    2. 确保第二个区域的代管式实例组 (MIG) 已创建并且运行状况良好:
      1. 在 Google Cloud 控制台中,转到负载均衡页面。

        转到“负载均衡”

      2. 点击负载均衡器名称负载均衡器详情页面随即打开。
      3. 后端下,您应该会看到两个 MIG:一个用于区域 1,一个用于区域 2。验证两者是否运行正常:

      4. 按照 Apigee 代理虚拟机无法将流量转发到 Apigee 实例中的步骤验证第二个 MIG。

解决方法

  1. 如果新实例未附加到环境,请按照将环境关联到新实例中的说明将实例附加到环境。

    另一种方法是确保负载均衡器将请求路由到环境已关联的正确后端。例如,非生产环境。您可能希望仅将其关联到一个区域。但是,负载均衡器可能将请求路由到了错误的区域。您需要更新负载均衡器配置,以确保它路由到正确区域。

  2. 如果 MIG 运行状况不佳,请参阅 Apigee 代理虚拟机无法将流量转发到 Apigee 实例中的诊断解决方案

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud Customer Care 联系:

  • Apigee 组织
  • 发生问题的环境和 API 代理
  • 已下载调试会话(如果问题为间歇性问题)
  • 失败请求的详细 curl 输出。
  • 配置为向 Apigee 发送 API 调用的负载均衡器