如何排查连接至 API 网关私有 API 端点时出现的问题?

上次更新日期:2022 年 2 月 25 日

我在 Amazon Virtual Private Cloud (Amazon VPC) 中连接至 Amazon API Gateway 私有 API 端点时遇到问题。我该如何排查此问题?

简短描述

您的 Amazon VPC 中的 AWS 资源可能因以下任何原因而无法连接到私有 API 端点

如果您的 API 已激活 Amazon CloudWatch 日志记录,则执行日志中将显示一条错误消息,指明引起错误的原因。

如果激活日志记录后 API 请求未生成任何 CloudWatch 日志,则该请求未到达端点。如果您的 API 请求未到达端点,请确保私有 API 的调用 URL 格式正确

注意:对于来自外部客户端(例如另一个 AWS 账户或本地部署的网络中的 Amazon VPC)的连接问题:该问题可能是由错误配置的 API 网关资源策略或私有 API 端点的调用 URL 中的 DNS 名称不正确引起的。

解决方法

确认引起错误的原因

1.    如果您尚未为您的私有 REST API 启用 CloudWatch 日志记录,请启用。务必配置执行日志记录

提示:配置日志记录设置时,请执行以下操作:
对于日志级别,选择 INFO
然后,选择记录完整请求/响应数据

2.    查看 CloudWatch 中 REST API 的执行日志,确定导致错误的原因。如果 API 请求到达终端节点,则会显示类似于以下示例之一的错误消息:

  • "User: anonymous is not authorized to perform: execute-api:Invoke on resource:"
  • "Connection timed out"

如果激活日志记录后 API 请求未生成任何 CloudWatch 日志,请确保私有 API 的调用 URL 格式正确。有关说明,请参阅本文的如果在激活日志记录后 API 请求未生成任何 CloudWatch 日志部分。

有关更多信息,请参阅如何在我的 CloudWatch 日志中找到 API Gateway REST API 错误?

如要解决 "User: anonymous is not authorized to perform: execute-api:Invoke on resource:" 错误

1.    验证私有 API 端点的 API Gateway 资源策略是否允许从接口 VPC 终端节点或源 VPC 到私有 API 终端节点的流量。如需资源策略示例,请参阅示例:允许基于源 VPC 或 VPC 终端节点的私有 API 流量

2.    验证 VPC 终端节点策略是否允许客户端访问私有 API 端点。有关 VPC 终端节点策略示例,请参阅 VPC 终端节点策略示例

有关如何测试 API 网关资源策略的说明,请参阅以下文章的测试资源策略部分:如何仅允许特定 IP 地址访问我的 API Gateway REST API?

重要提示:如果您修改 API 的资源策略,则必须部署 API 才能提交更改。

如要解决 "Connection timed out" 错误

验证您的 Amazon VPC 安全组的规则是否正确配置。

如要测试您的 Amazon VPC 的安全组

从向私有 API 终端节点发出请求的客户端运行以下命令:

重要提示:{public-dns-hostname} 替换为包含您的 API 的 VPC 终端节点 ID 的公有 DNS 主机名。将 {region} 替换为您的接口 VPC 终端节点所在的 AWS 区域。

$ telnet {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com 443

如果连接超时,则说明您的 Amazon VPC 安全组的规则配置不正确。

提示:如果连接超时,请确保验证以下内容:

  • 请求资源具有安全组规则,允许 TCP 端口 443 向接口 VPC 终端节点的 IP 地址范围或安全组传输出站流量。
  • VPC 终端节点有一个安全组规则,允许来自请求资源的 IP 地址范围或安全组的 TCP 端口 443 入站流量。

有关更多信息,请参阅使用安全组控制流向资源的流量

如果激活日志记录后 API 请求未生成任何 CloudWatch 日志

1.    验证私有 API 端点的 API Gateway 资源策略配置是否正确。有关更多信息,请参阅本文的以下部分:如要解决 "User: anonymous is not authorized to perform: execute-api:Invoke on resource:" 错误

2.    验证您的私有 API 的调用 URL 的格式是否正确。

注意:正确的格式取决于是否为 VPC 终端节点激活了私有 DNS。如果私有 DNS 未激活,则必须使用终端节点特定的公有 DNS 主机名来访问私有 API 端点。如果激活了私有 DNS,则必须使用私有 DNS 名称来访问私有 API 端点。有关更多信息,请参阅如何调用私有 API

如要测试私有 API 端点域是否正确解析到接口 VPC 终端节点的 IP 地址

1.    从向私有 API 终端节点发出请求的客户端运行以下 nslookup 命令:

重要提示:{restapi-id} 替换为您的私有 API 的 ID。将 {region} 替换为您的私有 API 终端节点所在的 AWS 区域。

$ nslookup {restapi-id}.execute-api.{region}.amazonaws.com

成功的输出将显示 VPC 终端节点的私有 IP 地址。

2.    运行以下 nslookup 命令:

重要提示:{public-dns-hostname} 替换为包含您的 API 的 VPC 终端节点 ID 的公有 DNS 主机名。将 {region} 替换为您的接口 VPC 终端节点所在的 AWS 区域。

$ nslookup {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com

成功的输出将显示 VPC 终端节点的私有 IP 地址。

3.    比较每个命令输出中的 IP 地址。如果每个命令输出的 IP 地址匹配,则说明安装程序按预期工作。

注意:通过执行以下操作,您可以随时在 Amazon VPC 控制台中为您的 VPC 终端节点激活私有 DNS:
端点窗格中,选择您的接口 VPC 终端节点。
选择操作
选择修改私有 DNS 名称
选中启用私有 DNS 名称复选框。然后选择保存更改
选择修改私有 DNS 名称