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

上次更新日期:2022 年 9 月 22 日

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

简短描述

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

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

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

注意:连接问题可能是由错误配置的 API Gateway 资源策略或私有 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" 错误

1.    验证 VPC 中是否存在 API Gateway execute-api VPC 端点。还要验证端点是否与私有 API 位于同一 AWS 区域中。如果不存在,请为 API Gateway execute-api 创建接口 VPC 端点

2.    验证调用私有 API 端点的客户端是否位于同一 VPC 中,或者可以通过 VPC 端点访问 VPC。您可以使用 traceroute 工具对此进行测试。

注意:私有 API 可从 VPC 中的客户端或与 VPC 具有网络连接的客户端访问。

要安装 traceroute,请运行以下命令:

Amazon Linux:

$ sudo yum install traceroute

Ubuntu:

$ sudo apt-get install traceroute

要使用 traceroute 来测试连接性,请执行以下操作:

$ sudo traceroute -n -T -p 443 <VPC-endpoint IP-address>

-T -p 443 -n 参数在端口 443 上执行基于 TCP 的跟踪。

3.    验证您的 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 终端节点。
选择 Actions(操作)。
选择 Modify Private DNS names(修改私有 DNS 名称)。
选中启用私有 DNS 名称复选框。然后选择保存更改
选择 Modify Private DNS names(修改私有 DNS 名称)。