如何排查与 API Gateway 私有 API 终端节点的连接问题?

上次更新日期:2020 年 10 月 28 日

我在 Amazon Virtual Private Cloud (Amazon VPC) 中连接 Amazon API Gateway 私有 API 终端节点时收到“Forbidden”错误消息,或者遇到其他问题。如何解决这些问题?

简短描述

您的 Amazon VPC 中可能包含 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 AWS Lambda 函数等 AWS 资源。如果这些资源无法连接到私有 API 终端节点,可能是因为:

如果您无法从外部客户端(例如其他 AWS 账户中的 Amazon VPC 或本地网络)连接到私有 API 终端节点,可能是资源策略或使用的 DNS 名称存在问题。

解决方法

如果尚未设置 API 执行日志记录,请进行设置。配置日志记录设置时,为日志级别选择 INFO。同时选择记录完整请求/响应数据。使用这些设置生成的日志可以帮助您进一步排查问题产生的原因。

注意:如果尝试访问私有 API 终端节点后未显示日志内容,则表明请求并未到达终端节点。请确保私有 API 的调用 URL 格式正确

资源策略

如果附加的 API Gateway 资源策略配置不正确,在您尝试访问私有 API 终端节点时,可能会出现错误消息 Forbidden

如果资源策略未正确配置为允许流量从接口 VPC 终端节点传输到私有 API 终端节点,将会显示错误消息 User: anonymous is not authorized to perform: execute-api:Invoke on resource:...

要解决这些错误,请确保创建并附加一个已正确配置可进行访问的资源策略。将这些示例资源策略用作指导原则。

更改资源策略后,请重新部署 API,使更改生效。

VPC 终端节点策略

如果对接口 VPC 终端节点使用 VPC 终端节点策略且该策略限制访问,也会显示错误消息 User: anonymous is not authorized to perform: execute-api:Invoke on resource:...

确保 VPC 终端节点策略允许发出请求的客户端访问私有 API。有关更多信息,请参阅 VPC 终端节点策略示例

VPC 安全组

错误 Connection timed out 可能表示 Amazon VPC 安全组的规则配置不正确。

从请求访问私有 API 的客户端运行以下命令,进行测试:

注意:vpce-id 替换为您的 VPC 终端节点 ID。将 region 替换为您的接口 VPC 终端节点的 AWS 区域。

$ telnet vpce-id.execute-api.region.vpce.amazonaws.com 443

如果连接超时,请检查您的 VPC 配置以确保:

  • 发出请求的 AWS 资源的安全组配置正确。必须具有安全组规则,允许 TCP 端口 443 向接口 VPC 终端节点的 IP 地址范围或安全组传输出站流量。
  • 接口 VPC 终端节点的安全组配置正确。必须具有规则,允许 TCP 端口 443 从发出请求的 AWS 资源的 IP 地址范围或安全组接收入站流量。

有关更多信息,请参阅使用安全组

调用 URL格式/私有 DNS

调用私有 API,调用 URL 的格式必须正确。具体的正确格式取决于您是否为接口 VPC 终端节点启用了私有 DNS

对于禁用的私有 DNS,请使用特定于终端节点的公有 DNS 主机名来访问私有 API。

注意:您可以随时在 Amazon VPC 控制台中为接口 VPC 终端节点启用私有 DNS。在“终端节点”窗格中,选择您的接口 VPC 终端节点。选择操作,然后选择修改私有 DNS 名称。选中启用私有 DNS 名称复选框,然后选择修改私有 DNS 名称

对于启用的私有 DNS,请使用私有 DNS 名称访问私有 API

通过测试确认私有 API 终端节点域正确解析到接口 VPC 终端节点的 IP 地址。从请求访问私有 API 的客户端运行以下命令:

注意:restapi-id 替换为您的私有 API 的 ID。将 region 替换为您的私有 API 的 AWS 区域。

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

输出应为接口 VPC 终端节点的私有 IP 地址。

然后,运行以下命令:

注意:vpce-id 替换为您的 VPC 终端节点 ID。将 region 替换为您的接口 VPC 终端节点的 AWS 区域。

$ nslookup vpce-id.execute-api.region.vpce.amazonaws.com

比较每个命令输出中的 IP 地址。如果 IP 地址相同,则表明接口 VPC 终端节点在正常访问私有 API 终端节点。

外部访问

要在其他 AWS 账户中使用 Amazon VPC 访问私有 API,请执行以下操作:

  1. 在其他账户中创建接口 VPC 终端节点
  2. 创建资源策略并将其附加到您的私有 API。策略必须允许来自其他账户的 VPC 终端节点 ID 或 VPC ID 的传入流量

其他账户的 Amazon VPC(或使用其接口 VPC 终端节点)中的资源可以使用特定于终端节点的公有 DNS 主机名访问私有 API。

注意:其他账户中的私有 API 和接口 VPC 终端节点必须位于同一 AWS 区域内。要从其他区域访问私有 API,必须具有 VPC 对等连接

在本地网络中,使用 AWS Direct Connect 连接到 VPC。然后,您可以使用特定于终端节点的公有 DNS 主机名访问私有 API。