Lambda访问Amazon RDS数据库实例时出现timeout errors如何解决
Lambda连接VPC内RDS超时排查方案
优先级最高的排查点
- 先确认VPC的DNS配置是否正确:检查你使用的默认VPC是否同时开启了
enableDnsHostnames和enableDnsSupport两个参数,只有这两个参数都开启的前提下,VPC内的服务才能正确解析RDS域名到内网IP。如果解析到公网IP,部署在VPC内的Lambda默认没有公网访问权限,自然无法连接。 - 检查你填写的安全组规则是否存在笔误:你补充的规则里协议写的是TPC,而PostgreSQL实际使用的是
TCP协议,协议配置错误会导致规则完全不生效,直接修改为TCP即可。 - 确认Lambda函数的超时配置:你的数据库连接超时设为20秒,如果Lambda函数本身的执行超时时间小于20秒,连接还未建立就会被Lambda强制终止,直接调整函数超时时间为30秒以上测试即可。
次优先级排查点
- 确认Lambda部署的子网属性:如果Lambda部署在VPC的公有子网,默认没有分配公网IP,就算RDS解析到公网IP也无法访问,两种解决方案:
- 把Lambda迁移到和RDS同VPC的私有子网,走内网链路连接,符合你不公开RDS的需求
- 在Lambda所在公有子网的路由表中配置NAT网关,让Lambda获得公网访问能力
- 检查网络ACL配置:安全组是实例级访问控制,子网级的网络ACL如果拦截了5432端口的入站/出站流量,也会导致连接超时,确认对应子网的网络ACL放通了PostgreSQL相关流量。
- 确认安全组出站规则:默认安全组出站是全放通,如果你手动修改过出站规则,需要确保允许Lambda访问RDS的5432端口。
快速验证方法
你可以在Lambda代码中加入域名解析逻辑,确认RDS域名的解析结果是否符合预期:
import socket # 打印RDS域名解析到的IP print("RDS解析IP:", socket.gethostbyname(rds_host))
如果打印的是公网IP,说明DNS解析配置异常,优先修复VPC的DNS参数即可。如果是VPC内网IP,再按照上面的步骤排查网络连通性即可。
另外如果你的需求是不公开RDS,完全可以把RDS的Publicly Accessible参数改为No,走内网连接不需要开启公网访问,安全性更高。
内容的提问来源于stack exchange,提问作者bananabread76
相关产品推荐
相关产品推荐

