跨VPC通过VPC Peering用pymysql从Python Lambda连接RDS超时问题
Lambda跨VPC Peering连RDS超时的排查与解决
逐条排查点
1. 确认Lambda子网的路由表配置
- 检查VPC B里Lambda绑定的所有子网对应的路由表,必须都有
172.31.0.0/16 -> pcx-xxxxxxx这条路由。别只看VPC默认路由表,要是Lambda关联的子网绑了其他没配置的路由表,流量根本发不出去。
2. 核对RDS的安全组与子网路由
- 再确认RDS所在VPC A的子网路由表,确实有
10.1.0.0/16 -> pcx-xxxxxxx的路由,并且状态生效。 - RDS的入站安全组规则里,
10.1.0.0/16的3306端口允许规则要确保是挂在RDS实例上的,别搞成了其他没用的安全组。另外把RDS的「公有访问」关掉,避免流量走公网。
3. 补全Lambda安全组的入站规则
- 虽然VPC B的出站规则开了,但TCP是双向的,RDS的响应流量得能进Lambda的安全组。给Lambda用的SG加一条入站规则:TCP协议,端口选
1024-65535(Lambda的临时端口段),源设为172.31.0.0/16。
4. VPC Peering状态与跨配置验证
- 再确认Peering连接状态是
Active,如果是跨区域或跨账户的Peering,两边的路由表和安全组都要配置到位,别漏了对方账户的接受步骤。
5. RDS终端节点接口的正确配置
- 要是用终端节点,得确保:
- 终端节点建在VPC A里,关联的安全组允许
10.1.0.0/16访问3306端口。 - VPC B要开DNS解析和DNS主机名(VPC设置里的两个选项都设为Yes),Lambda连接时用终端节点的DNS名,别写错。
- 终端节点建在VPC A里,关联的安全组允许
6. 用EC2做连通性测试
- 在VPC B里开一台和Lambda同子网、同安全组的EC2,装pymysql连RDS试试:
- 要是EC2能连,说明问题在Lambda权限——检查Lambda执行角色有没有
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface这三个权限,没有的话加上。 - 要是EC2也超时,那还是网络层(路由、安全组)的问题,回去重新核对。
- 要是EC2能连,说明问题在Lambda权限——检查Lambda执行角色有没有
7. 检查DNS解析
- 在VPC B的EC2上跑
nslookup <RDS端点>,看返回的IP是不是172.31.0.0/16段的私有IP。要是返回公网IP,要么是RDS开了公有访问,要么是VPC DNS解析有问题。
内容的提问来源于stack exchange,提问作者Akshit Sharma
相关产品推荐
相关产品推荐

