当我从 Amazon Virtual Private Cloud (Amazon VPC) 调用我的 Amazon API Gateway 公共 API 时,我收到 HTTP“403 Forbidden”错误。
简短描述
由于 Amazon VPC 接口端点仅会将流量路由到私有 API,因此当您尝试访问 API Gateway 公共 API 时,可能会收到 HTTP“403 Forbidden”错误。
当您尝试从启用了私有 DNS 名称的 VPC 访问 API Gateway 公共 API 时,将会出现 HTTP“403 Forbidden”错误。如果您启用私有 DNS 名称,则从 Amazon VPC 发送到 API Gateway API 的所有请求都将解析到接口 VPC 端点。
但是,您无法使用接口 VPC 端点连接到公共 API,因为该端点的私有 DNS 名称的格式为 *.execute-api.{region}.amazonaws.com。* 字符是 API ID 的占位符。此格式与公共和私有 API 的 API Gateway 默认调用 URL 相匹配。
当启用私有 DNS 名称时,对 *.execute-api.{region}.amazonaws.com 格式的 API Gateway API URL 的调用将解析到接口 VPC 端点的私有 IP 地址。对于公共 API 和私有 API,此设置均会通过接口 VPC 端点将所有流量路由到 API Gateway。
当您使用 AWS Direct Connect 调用默认的 execute-api URL,以从本地网络连接到私有 API 时,也会收到“403 Forbidden”错误。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
检查您的 Amazon VPC 是否使用私有 DNS 设置
要解决 HTTP“403 Forbidden”错误,请首先确定您的 Amazon VPC 使用的是私有 DNS 设置还是公有 DNS 设置。您可以使用 AWS CLI 或 Amazon VPC 控制台。
AWS CLI
运行以下 describe-vpc-endpoints 命令:
export VPC_ID=YOUR_VPC_ID
export REGION=YOUR_REGION
aws ec2 describe-vpc-endpoints \
--filters "Name=vpc-id,Values=${VPC_ID}" \
"Name=service-name,Values=com.amazonaws.${REGION}.execute-api" \
--query 'Amazon VPC endpointndpoints[].{Name:Tags[?Key==`Name`].Value|[0],Amazon VPC endpointndpointId:Amazon VPC endpointndpointId,PrivateDnsEnabled:PrivateDnsEnabled}' \
--output table
**注意:**请将 YOUR_VPC_ID 替换为您的 VPC ID,将 YOUR_REGION 替换为您的 AWS 区域。
Amazon VPC 控制台
检查您是否在接口 VPC 端点配置中启用了私有 DNS 名称。此外,请检查您的 VPC 中是否有用于访问私有 REST API 的接口 VPC 端点。如果有接口 VPC 端点,请检查您是否启用了 DNS 属性。
在私有 DNS 名称启用的情况下连接到公共 API
如果启用了私有 DNS,请设置边缘优化自定义域名或区域自定义域名,以连接到您的公共 API。然后,您可以使用自定义域名(例如 api.example.com)调用 API Gateway 公共 API。与您的私有 REST API 的连接将继续通过私有 REST API 端点运行。
如果客户端从本地网络连接,请设置一个 Amazon Route 53 Resolver 入站端点。要使用 execute-api 调用 URL,请将来自本地网络的所有私有 DNS 查询转发到该入站端点。
**注意:**您的 VPC 资源必须具有互联网连接才能连接到您的公共 API。
在私有 DNS 名称关闭的情况下连接到公共 API
要允许出站流量流向您的公共 API,请为您的 VPC 使用安全组。此外,请修改附加到您的 API 的资源策略,以允许从 VPC 进行访问。
如果您的 VPC 有权访问您的公共 REST API,请使用默认的 execute-api 命令连接到您的公共 REST API。您也可以使用自定义域名连接到您的公共 REST API。有关详细信息,请参阅在 API Gateway 中控制和管理对 REST API 的访问。
如果您关闭接口 VPC 端点的私有 DNS 名称,则默认的 execute-api 调用 URL 将不再连接到私有 REST API。
要调用私有 REST API,请执行以下操作之一:
-
使用以您的 Amazon VPC 端点作为 DNS 的主机标头,如以下示例所示:
curl -H "Host: {your-api-id}.execute-api.{region}.amazonaws.com" \
https://Amazon VPC endpoint-xxxxx-xxxxx.execute-api.{region}.Amazon VPC endpoint.amazonaws.com/stage/path
-
为 execute-api.{region}.amazonaws.com 创建私有托管区。在私有托管区中,为您的 API 标识符添加 A 记录。将 A 记录指向接口 VPC 端点的 IP 地址,以便您可以使用私有 REST API 的默认 execute-api 调用 URL。
更改接口 VPC 端点的私有 DNS 属性
您可以更改接口端点的私有 DNS 属性。这些更改会影响 API 阶段 URL 解析到接口 VPC 端点的私有 IP 地址的方式。此外,这些更改还会影响从 VPC 连接到私有 API 和公共 API 的方式。有关详细信息,请参阅 VPC 中的 DNS 属性。
相关信息
使用接口 VPC 端点访问 AWS 服务