为私有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访问也就恢复了正常。
针对这个问题,有两种处理方式:
- 关闭私有DNS解析:将Terraform配置中的
private_dns_enabled改为false。这样只有私有API Gateway的专属域名会指向VPC端点,公有API的请求依然通过公网Edge节点处理,不会受影响。这是最直接的解决方案。 - 更新公有API的资源策略:给所有公有Edge Optimized类型的API Gateway添加资源策略,允许来自该VPC端点的访问。但这种方式需要维护大量API的策略,会增加后续运维成本,仅适合有特殊访问需求的场景。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

