Lambda连接私有RDS实例及上报CloudWatch日志问题咨询
Lambda连接私有RDS及CloudWatch日志上报故障排查指南
网络连通性排查(占这类故障的70%以上)
- 先核对Lambda的VPC配置:必须和目标私有RDS在同一个VPC下,关联的子网要覆盖RDS部署的可用区,别只挂没有路由到RDS子网的孤立公有子网;如果是跨VPC访问RDS,必须提前配好VPC对等连接,两端路由表都要放通对端的地址段。
- 核对安全组规则:Lambda绑定的安全组出站规则,必须放通到RDS对应服务端口的访问(比如MySQL默认3306、PostgreSQL默认5432);RDS绑定的安全组入站规则,直接把Lambda的安全组ID设为放行源即可,别图省事直接放行0.0.0.0/0,既不安全也容易出现路由错配。
- 检查VPC网络ACL规则:子网关联的网络ACL不能拦截Lambda子网到RDS子网的业务端口流量,同时要放行高位临时端口的回包流量,很多人只放开了入向业务端口,忘了放回包导致连接超时。
- 配了VPC的Lambda默认没有公网访问能力,如果没部署NAT网关,必须给VPC添加对应服务的VPC端点,否则既可能连不上需要公网访问的依赖,也会导致日志没法上报到CloudWatch。
IAM与身份认证排查
- Lambda执行角色必须配齐两类基础权限,缺任何一类都会导致功能异常:一类是CloudWatch Logs写入权限,至少要包含
logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents三个动作,没这个权限你根本看不到Lambda的运行报错,排查全靠瞎猜;另一类是RDS访问相关权限,如果用IAM数据库认证连RDS,还要额外加rds-db:connect权限,资源范围匹配目标RDS实例。 - 如果用传统账号密码方式连RDS,先核对连接串、账号、密码、数据库名配置是否正确:如果密码存在Lambda环境变量里,重点检查有没有特殊字符没转义的问题——很多人栽在密码里带
#、&这类符号,代码读环境变量时被截断,报半天认证错误找不到原因。 - 用IAM认证连RDS的场景,要检查生成的认证Token是否在15分钟有效期内,连接串的配置参数是否匹配RDS的IAM认证要求,执行角色的信任策略有没有允许RDS服务的身份代入。
RDS实例侧排查
- 先确认RDS实例状态为
Available,没有处于重启、故障切换、维护窗口状态,私有RDS不要误填公网连接地址,连之前先核对RDS控制台给出的私有连接端点。 - 查看RDS的CloudWatch监控指标,重点看
DatabaseConnections指标有没有打到实例规格对应的max_connections上限,连接数打满时RDS会直接拒绝所有新连接请求,表现就是连接超时。 - 数据库层面要确认访问账号有对应库表的访问权限,没有配置库级别的IP白名单拦截Lambda的访问地址。
快速定位技巧
- 排查优先级先搞定CloudWatch日志上报:只要能拿到Lambda的完整运行报错,80%的问题10分钟内就能定位根因。如果日志完全上报不上去,先查Lambda执行角色的日志权限,再查VPC里有没有配CloudWatch Logs的VPC端点、子网路由是否通。
- 看到日志里报
Connection timed out,不用查别的,直接回头核对安全组、路由表、网络ACL的配置,100%是网络链路被拦截。 - 看到日志里报
Access denied for user,直接查账号密码、数据库权限、IAM认证配置,和网络没关系。 - 可以在Lambda同VPC同子网下临时起一台最小规格的EC2,绑定和Lambda一模一样的安全组,用相同的连接参数测RDS连通性,能快速区分是Lambda配置问题还是RDS侧问题。
排查前记得给现有安全组、路由表配置打个快照,别改到最后连原来的配置都找不回来。
内容的提问来源于stack exchange,提问作者stackdisplay
相关产品推荐
相关产品推荐

