Node.js AWS Lambda使用mysql连接RDS出现Handshake inactivity timeout错误求助
可行排查方向
VPC网络层排查
- 检查Lambda执行角色的VPC权限:必须包含
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface三个权限,缺少权限时Lambda无法在VPC内创建弹性网卡,无法访问同VPC的RDS资源。 - 检查VPC网络访问控制列表(NACL):确认Lambda和RDS所在子网关联的NACL,入站规则允许3306端口的TCP流量,出站规则允许1024-65535区间临时端口的TCP流量。NACL为无状态规则,仅放开入站不放开出站会导致握手包无法返回,触发超时。
- 检查子网路由表配置:确认Lambda、RDS所在子网的路由表中,VPC内网CIDR的下一跳为
local,没有将RDS的访问流量错误路由到NAT网关或互联网网关。 - 验证RDS域名解析结果:在Lambda的测试代码中加入RDS域名的DNS解析逻辑,打印解析得到的IP,确认返回的是VPC内网IP而非公网IP。若RDS开启了公开访问,mysql包可能优先解析到公网IP,而部署在VPC内的Lambda默认没有公网出口,无法访问公网IP的RDS。
MySQL连接配置排查
- 调整连接超时参数:Lambda冷启动阶段执行速度较慢,默认的握手超时阈值可能过小,可在创建连接时显式调大超时配置,参考示例:
const mysql = require('mysql'); const connection = mysql.createConnection({ host: process.env.RDS_HOST, user: process.env.RDS_USER, password: process.env.RDS_PASSWORD, database: process.env.RDS_DATABASE, connectTimeout: 60000, // 连接超时调整为60秒 acquireTimeout: 60000, timeout: 60000 });
- 检查RDS SSL强制配置:如果RDS开启了强制SSL连接,未携带SSL证书的连接会被RDS主动拒绝,可在连接配置中添加
ssl: "Amazon RDS"开启官方SSL验证。 - 核对RDS参数组配置:检查RDS参数组中
connect_timeout参数值,默认值通常为10秒,冷启动场景下握手过慢会被RDS主动断开连接,可临时调大到30秒验证。
Lambda运行时&基础配置排查
- 调整Lambda资源配置:Lambda的CPU性能与内存配额成正比,内存过小会导致冷启动阶段代码执行过慢,可先将Lambda内存调整为1024MB、执行超时调整为2分钟,排除资源不足导致的握手超时。
- 排除上层框架干扰:暂时完全禁用TypeORM的自动初始化逻辑,仅运行你编写的原生mysql测试代码,避免TypeORM的连接池、重试逻辑和Lambda执行生命周期冲突导致的异常。
- 横向对比验证:临时创建一台和Lambda同子网、同安全组的EC2实例,在EC2中运行相同的原生mysql测试代码。如果EC2也无法连接,可排除Lambda本身的问题,聚焦VPC/RDS层配置;如果EC2可以正常连接,可锁定问题出在Lambda的权限或运行时配置上。
内容的提问来源于stack exchange,提问作者IRCraziestTaxi
相关产品推荐
相关产品推荐

