AWS Lambda访问公网API返回503 Service Unavailable超时排查
根因定位
你的故障判断方向完全准确,所有现象都指向VPC接入模式下的Lambda缺少公网出口路由配置,匹配的故障特征如下:
- 本地Docker模拟Lambda环境不接入真实AWS VPC网络,公网请求无限制,因此本地运行正常、数秒返回结果
- 不需要访问公网的Lambda不依赖出网链路,因此运行无异常
- 代码执行到公网请求阶段后,网络包被丢弃无响应,最终触发Lambda执行超时;API Gateway在后端Lambda超时后默认返回
503 {"message": "Service Unavailable"},和你看到的响应完全一致 - 你已经完成了VPC接入的基础配置(安全组绑定、子网指定、ENI操作权限配置),缺失的是子网层面的公网出口路由规则。
根因技术细节
当Lambda配置为接入VPC运行时,服务会在你指定的子网中创建弹性网卡(ENI)作为Lambda的网络接入点,网络行为完全遵循对应子网的路由规则:
如果Lambda挂载在私有子网(绝大多数生产场景的默认选择),私有子网默认没有指向互联网网关(IGW)的路由,所有发往公网的TCP请求会被直接丢弃,表现为请求挂起直到超时。
很多人会误以为配了安全组、给了ENI权限就能出公网,实际上路由规则才是决定公网访问能力的核心配置。
修复方案
根据你的使用场景二选一即可:
方案1:配置NAT网关(生产环境推荐)
这是AWS官方推荐的VPC内Lambda访问公网的标准方案:
- 确认Lambda当前绑定的子网为私有子网(未配置指向IGW的默认路由)
- 在同VPC下创建公有子网,为VPC绑定互联网网关(IGW),给公有子网关联的路由表添加
0.0.0.0/0目标指向IGW的路由规则 - 在公有子网内创建NAT网关,为NAT网关绑定一个弹性公网IP(EIP)
- 找到Lambda所在私有子网关联的路由表,添加
0.0.0.0/0目标指向刚创建的NAT网关的路由规则 - 确认Lambda绑定的安全组出方向规则允许443端口访问公网(默认安全组全放行,如果你之前做过出方向收敛需要补全规则)
- 重新调用接口即可正常返回结果
方案2:将Lambda部署到公有子网(仅测试场景使用,不推荐生产)
如果是临时测试环境,可以用更轻量化的配置:
- 将Lambda的绑定子网替换为公有子网(已配置指向IGW的
0.0.0.0/0路由) - 为该公有子网开启「自动分配公网IP」配置
- 确认安全组出方向放开443端口访问
注意:该方案依赖Lambda弹性网卡自动获取公网IP,在Lambda并发扩容、多AZ弹性网卡调度时容易出现网络不稳定问题,禁止用于生产环境。
配置后校验点
配置完成后如果还是不通,按以下顺序排查:
- 确认NAT网关部署在公有子网,不要把NAT放到私有子网里,否则NAT本身无法访问公网
- 确认路由表关联关系正确:私有子网默认路由指向NAT网关,公有子网默认路由指向IGW,不要配反
- 确认Lambda执行角色已包含弹性网卡操作权限:
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface,不需要额外的网络权限 - 如果你在VPC内配置了自定义DNS,确认公网域名(比如你调用的reqbin.com域名)没有被错误解析到内网地址,导致请求无法路由到公网
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

