You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为私有API Gateway创建execute-api接口VPC端点致VPC内公有API全403

问题描述

我尝试将账号内一个API Gateway设为私有并接入VPN,根据AWS文档,需创建execute-api接口类型VPC端点,已通过以下Terraform代码完成配置:

data "aws_vpc_endpoint_service" "execute-api" {
  service = "execute-api"
}

resource "aws_vpc_endpoint" "gateway-endpoint" {
  vpc_id              = data.aws_vpc.shared.id
  service_name        = data.aws_vpc_endpoint_service.execute-api.service_name
  vpc_endpoint_type   = "Interface"
  private_dns_enabled = true

  subnet_ids         = toset(data.aws_subnets.private.ids)
  security_group_ids = toset([data.aws_security_group.default.id])
}

完成私有API Gateway的资源策略等配置后,团队成员反馈其他未修改的公有Edge Optimized类型API Gateway全部返回403错误,仅将关联Lambda移出VPC才可恢复访问。为何创建该VPC端点会影响所有API Gateway?

原因分析及解决方案
  • 核心问题出在配置的private_dns_enabled = true。这个参数会修改VPC内部的DNS解析规则,把所有指向execute-api.<region>.amazonaws.com的请求,都强制路由到你创建的私有VPC端点,而非AWS的公网Edge节点。
  • 那些未修改的公有Edge Optimized API Gateway,原本依赖公网Edge节点处理请求,但VPC内的Lambda调用这些API时,DNS解析走VPC内部规则,请求被转到了私有VPC端点。而这些公有API并没有配置允许该VPC端点访问的资源策略,因此直接返回403拒绝访问。
  • 当把Lambda移出VPC后,它的DNS解析切换为公网解析,请求会正常打到AWS的Edge节点,API访问也就恢复了正常。

针对这个问题,有两种处理方式:

  1. 关闭私有DNS解析:将Terraform配置中的private_dns_enabled改为false。这样只有私有API Gateway的专属域名会指向VPC端点,公有API的请求依然通过公网Edge节点处理,不会受影响。这是最直接的解决方案。
  2. 更新公有API的资源策略:给所有公有Edge Optimized类型的API Gateway添加资源策略,允许来自该VPC端点的访问。但这种方式需要维护大量API的策略,会增加后续运维成本,仅适合有特殊访问需求的场景。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:13:22