您正在查看 Apigee 和 Apigee 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 错误
诊断
- 找到与负载均衡器关联的 TLS 证书。
- 使用 Google Cloud 控制台:
-
在 Google Cloud 控制台中,转到负载均衡页面。
-
点击负载均衡器名称。负载均衡器详情页面随即打开。
- 在前端区域的 IP:端口列中,通过验证 IP 地址和端口来确保正在查看正确的负载均衡器。
- 在证书列中,点击证书名称以查看 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 Customer Care 提交工单。
-
如果
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 控制台中,转到日志浏览器页面。
-
将以下内容粘贴到查询窗格中:
jsonPayload.enforcedSecurityPolicy.outcome="DENY"
- 点击运行查询。
-
强制执行政策的名称显示在查询结果窗格中的
jsonPayload.enforcedSecurityPolicy.name
中:
-
解决方法
修改 Google Cloud Armor 规则/配置,以满足您的需求。如果您需要帮助,请与 Google Cloud Customer Care 联系。
原因:Apigee 代理虚拟机无法将流量转发到 Apigee 实例
诊断
-
如果 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
虚拟机的运行状况:-
在 Google Cloud 控制台中,转到负载均衡页面。
-
点击负载均衡器名称。负载均衡器详情页面随即打开。
-
在后端部分中,验证所有负载均衡器后端在运行状况良好列中是否带有绿色对勾标记。
-
-
验证 MIG 模板中的端点 IP 地址是否与 Apigee 实例 IP 地址匹配。
apigee-proxy
虚拟机是使用实例模板创建的。模板定义用于连接到 Apigee 实例 IP 地址的ENDPOINT
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 界面获取 Apigee 实例 IP 地址:
- 在 Apigee 界面中,点击管理 > 实例。
-
IP 地址列列出了 IP 地址:
-
从模板获取
ENDPOINT
IP 地址:-
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击负载均衡器名称。负载均衡器详情页面随即打开。
- 在后端区域,点击后端服务名称。
-
在实例组成员区域中,点击模板名称。
-
在模板页面上,滚动到自定义元数据,您将在其中看到端点 IP 地址:
-
-
获取 Apigee 实例 IP 地址:
解决方法
-
如果
apigee-proxy
实例组中的虚拟机显示运行状况不佳,则请确保您实施了允许负载均衡 IP 地址范围的防火墙规则,该规则让130.211.0.0/22
和35.191.0.0/16
可访问 MIG。 -
在 Google Cloud 控制台中,转到防火墙页面。
-
确保
443 TCP
端口上存在带有target-tag
(如gke-apigee-proxy
)和源 IP 范围(如130.211.0.0/22
和35.191.0.0/16
)的入口防火墙规则:如果 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 网络对等互连页面。
-
您的 VPC 网络中列出的
servicenetworking-googleapis-com
值应与从 API 调用返回的值相同。例如default
。
-
-
如果您使用的是共享 VPC,请确保
authorizedNetwork
值跟与servicenetworking
对等互连的宿主项目中的实际 VPC 的值相同。-
在 Google Cloud 控制台中,进入共享 VPC 页面。
- 选择宿主项目。
-
您的 VPC 网络中为
servicenetworking-googleapis-com
列出的值应与 API 调用返回的值authorizedNetwork
相同。例如,default
。
-
-
验证与负载均衡器关联的实例组与
authorizedNetwork
值是否位于同一网络中:
解决方法
-
如果在第 2 步或第 3 步中,
authorizedNetwork
值跟与servicenetworking
对等互连的网络不同,则请按照步骤 4:配置服务网络中的步骤操作,确保您已将正确的 VPC 网络与servicenetworking
对等互连。 -
如果在步骤 4f 和 4j 中,网络值与
authorizedNetwork
值不同,请验证authorizedNetwork
是否为与servicenetworking.
对等互连的网络。如果正确对等互连,并且网络仍然与authorizedNetwork,
不同,这意味着实例组创建不正确,您应该与 Google Cloud Customer Care 联系。
原因:在区域扩展中创建的新 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 控制台中,转到负载均衡页面。
- 点击负载均衡器名称。负载均衡器详情页面随即打开。
-
在后端下,您应该会看到两个 MIG:一个用于区域 1,一个用于区域 2。验证两者是否运行正常:
- 按照 Apigee 代理虚拟机无法将流量转发到 Apigee 实例中的步骤验证第二个 MIG。
-
-
通过运行以下 API 调用,确保环境已连接到新实例:
解决方法
-
如果新实例未附加到环境,请按照将环境关联到新实例中的说明将实例附加到环境。
另一种方法是确保负载均衡器将请求路由到环境已关联的正确后端。例如,非生产环境。您可能希望仅将其关联到一个区域。但是,负载均衡器可能将请求路由到了错误的区域。您需要更新负载均衡器配置,以确保它路由到正确区域。
- 如果 MIG 运行状况不佳,请参阅 Apigee 代理虚拟机无法将流量转发到 Apigee 实例中的诊断和解决方案。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud Customer Care 联系:
- Apigee 组织
- 发生问题的环境和 API 代理
- 已下载调试会话(如果问题为间歇性问题)
- 失败请求的详细 curl 输出。
- 配置为向 Apigee 发送 API 调用的负载均衡器