同VPC内EC2可访问S3/SQS但Lambda需VPC端点才可访问的原因
问题根因
阻止VPC内Lambda访问S3、SQS的核心原因是两类资源的VPC公网访问逻辑存在本质差异,具体如下:
- 绑定EIP的EC2天然具备通过IGW访问公网的能力
你部署的EC2实例绑定了弹性公网IP,所在子网路由表又配置了0.0.0.0/0路由指向互联网网关(IGW)。当EC2访问S3、SQS的默认公网服务端点时,IGW会自动将出站流量的源私有IP转换为EC2绑定的公网EIP地址,流量符合公网路由规则可正常转发,因此不需要额外配置就能连通S3和SQS。 - VPC内运行的Lambda默认没有可用公网出口
当Lambda被配置为在VPC内运行时,Lambda服务会在指定子网中创建仅绑定私有IP的弹性网卡(ENI)作为网络载体,这类ENI不会自动分配公网IP,也不支持手动绑定EIP。而VPC的IGW有强制转发规则:所有发往公网的出站流量,源地址必须是公网IP,否则直接丢弃。
也就是说,就算你把Lambda放在路由指向IGW的公网子网里,它发往公网的流量到了IGW就会被直接丢弃,根本不存在真正的公网访问能力。你提到的“测试时可正常获取公网文件”属于认知偏差,大概率是测试时访问的目标存在特殊内部路由、或是Lambda的VPC配置当时未生效,在没有NAT网关/实例、没有VPC端点的前提下,VPC内Lambda不可能打通公网出站链路。 - 配置VPC端点后流量绕开了公网链路所以恢复访问
配置S3网关端点时,VPC路由表会自动添加对应区域S3服务的前缀路由,访问S3的流量不再经过IGW走公网,而是通过AWS内部骨干网直接转发到S3服务,全程用私有IP通信即可。
配置SQS接口端点时,AWS会在指定子网内创建带有私有IP的ENI作为SQS的私有访问入口,Lambda访问SQS的流量会直接通过VPC内部路由发到这个私有ENI,同样不需要公网出口,自然就能正常连通。
内容的提问来源于stack exchange,提问作者ack_inc
相关产品推荐
相关产品推荐

