跳至内容

如何解决连接到 API Gateway 私有 API 端点时出现的问题?

3 分钟阅读
0

我想解决连接到 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon API Gateway 私有 API 端点时出现的问题。

简短描述

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

要确定原因,您可以为您的 API 激活 Amazon CloudWatch Logs,然后查看这些日志。

如果激活 CloudWatch Logs 后 API 请求未生成日志,则表示请求未到达端点。如果您的 API 请求未到达端点,请检查您是否正确配置了私有 API 的调用 URL。
有关详细信息,请参阅如何在我的 CloudWatch 日志中找到 API Gateway REST API 错误?

**注意:**如果私有 API 端点的调用 URL 中的 API Gateway 资源策略配置不正确或 DNS 名称不正确,则可能会导致连接问题。

解决方法

确认出现问题的原因

完成以下步骤:

  1. 为您的私有 REST API 启用 CloudWatch Logs
  2. 对于 Log level(日志级别),选择 INFO,然后选择 Log full requests/responses data(记录完整的请求/响应数据)。
  3. 在 CloudWatch 中查看 REST API 的执行日志,以确定出现问题的原因。

如果 API 请求到达端点,则会显示一条类似于以下示例之一的错误消息:

  • “用户 anonymous 无权对以下资源执行 execute-api:Invoke:”
  • “SSL:没有其他证书主题名称与目标主机名 custom-domain.com/resource 相匹配”
  • “连接超时”
  • “无法解析主机:https://example.com/resource”

“用户 anonymous 无权对以下资源执行 execute-api:Invoke:”

要解决此问题,请配置以下策略:

  • 私有 API 的 API Gateway 资源策略必须允许来自接口 VPC 端点或源 VPC 的流量流向 API 端点。
  • VPC 端点策略必须允许客户端访问私有 API 端点。这是用于 execute-api 服务的资源策略。
  • 自定义域名的资源策略必须允许访问您的 VPC 端点,以调用您的私有自定义域名。默认情况下,API Gateway 在预置自定义域名时,会在自定义域名的资源策略中包含显式拒绝规则。有关详细信息,请参阅教程: 为私有 API 创建和调用自定义域名
    **重要事项:**如果您修改了 API 的资源策略,请将您的 API 部署到阶段以保存更改。

“SSL:没有其他证书主题名称与目标主机名 custom-domain.com/resource 相匹配”

要解决此问题,请检查您是否为私有 VPC 端点创建了私有自定义域名访问关联,以用于 execute-api 服务。

“连接超时”

要解决连接超时问题,请完成以下步骤:

  1. 验证托管客户端的 VPC 中是否存在 API Gateway execute-api VPC 端点。然后,确保该端点与私有 API 位于同一 AWS 区域。如果端点不存在,请为 API Gateway execute-api 创建一个接口 VPC 端点。

  2. 使用 traceroute 来验证调用私有 API 的客户端是否存在于同一 VPC 中,或者是否可以通过 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 的跟踪。请将 VPC-endpoint IP-address 替换为您的 VPC 端点的 IP 地址。

  3. 验证您是否正确配置了 Amazon VPC 安全组的规则。
    要测试您的 Amazon VPC 安全组,请从向私有 API 端点发出请求的客户端运行以下命令:

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

    **注意:**请将 public-dns-hostname 替换为包含 API 的 VPC 端点 ID 的公共 DNS 主机名。此外,请将 region 替换为您的接口 VPC 端点所在的区域。

    或者,从向私有 API 自定义域名发出请求的客户端运行以下命令:

    telnet custom-domain-name 443

    **注意:**请将 custom-domain-name 替换为您的私有 API 自定义域名。

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

请求资源必须具有安全组规则,以允许 TCP 端口 443 出站流量流向 VPC 端点的 IP 地址范围或安全组。此外,VPC 端点必须具有安全组规则,以允许来自请求资源的 IP 地址范围或安全组的 TCP 端口 443 入站流量。

有关详细信息,请参阅 How do I restrict traffic to and from Amazon VPC resources?

“无法解析主机:https://www.example.com/resource”

要解决此问题,请执行以下操作:

测试私有 API 端点的域是否正确解析为 VPC 端点的 IP 地址

**注意:**确保客户端位于 execute-api VPC 端点所在的 VPC 内。

完成以下步骤:

  1. 从向私有 API 端点发出请求的客户端运行以下 nslookup 命令:
    nslookup restapi-id.execute-api.region.amazonaws.com
    **注意:**请将 restapi-id 替换为您的私有 API 的 ID,将 region 替换为您的私有 API 端点所在的区域。
  2. 从向私有 API 自定义域名发出请求的客户端运行以下 nslookup 命令:
    nslookup custom-domain-name
    **注意:**请将 custom-domain-name 替换为您的私有 API 的自定义域名。成功的输出将显示 VPC 端点的私有 IP 地址。
  3. 运行以下 nslookup 命令:
    nslookup public-dns-hostname.execute-api.region.vpce.amazonaws.com
    **注意:**请将 public-dns-hostname 替换为包含 API 的 VPC 端点 ID 的公共 DNS 主机名。请将 region 替换为您的接口 VPC 端点所在的区域。成功的输出将显示 VPC 端点的私有 IP 地址。
  4. 比较每个命令输出中的 IP 地址。如果每个命令输出中的 IP 地址均匹配,则设置将按预期运行。

要为您的 VPC 端点激活私有 DNS,请完成以下步骤。

  1. 打开 Amazon VPC 控制台
  2. Endpoints(端点)窗格中,选择您的接口 VPC 端点。
  3. 选择 Actions(操作)。
  4. 选择 Modify Private DNS names(修改私有 DNS 名称)。
  5. 选择 Enable Private DNS Name(启用私有 DNS 名称),然后选择 Save Changes(保存更改)。

激活 CloudWatch Logs 后,API 请求未生成任何 CloudWatch 日志

要解决此问题,请执行以下操作:

  • 正确配置私有 API 端点的 API Gateway 资源策略。
  • 正确设置您的私有 API 的调用 URL 的格式,以访问私有 API 端点。
    **注意:**如果您激活了私有 DNS,则必须使用特定于端点的公共 DNS 主机名。如果您未激活私有 DNS,请使用私有 DNS 名称。
  • 将私有 API 自定义域名映射到正确的 API 阶段。

相关信息

如何使用接口 VPC 端点访问另一个账户中的 API Gateway 私有 REST API?

当我从 VPC 连接到 API Gateway API 时,为什么会收到 HTTP 403 Forbidden(HTTP 403 禁止访问)错误?

如何使用流日志监控 VPC 中的流量?

如何启用 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行故障排除?