如何调试Elastic Beanstalk新环境的RDS PostgreSQL连接超时故障
问题排查方案
一、通用RDS连接失败排查(网络可达、连接参数正确前提下)
- 操作系统层面出站规则限制:Amazon Linux 2默认自带
firewalld服务,初代Amazon Linux默认使用iptables且默认开放全部出站流量,首先排查EB实例上firewalld是否放行5432端口出站,执行firewall-cmd --list-all查看是否有允许5432端口的规则,临时关闭测试可执行systemctl stop firewalld。 - Node.js版本与PostgreSQL客户端兼容性问题:Node 10配套的pg模块版本可能与Node 14不兼容,比如旧版本pg不支持新的SSL默认校验规则,如果RDS开启了SSL强制验证,旧客户端未配置SSL参数会握手失败卡住。可以检查package.json中的pg依赖版本,升级到适配Node 14的版本,测试时可在数据库连接配置中显式指定
ssl: { rejectUnauthorized: false },生产环境建议配置RDS官方根证书。 - Nginx长连接配置缺失:移除的旧Nginx自定义配置可能包含长连接超时配置,PostgreSQL默认使用长连接,Amazon Linux 2默认的Nginx配置
proxy_timeout阈值如果小于数据库连接超时时间,会主动切断连接。可以查看/var/log/nginx/error.log确认是否有相关报错。 - 应用负载均衡器配置差异:应用负载均衡器(ALB)的健康检查阈值、超时时间默认与经典负载均衡器(CLB)不同,确认ALB目标组的健康检查路径、端口配置是否正确,是否将数据库长连接误判为异常流量切断。
二、子网B实例无法连通RDS的专项排查
注意:Reachability Analyzer仅验证正向网络路径的连通性,不会校验回程路由、无状态ACL规则、服务层面访问限制、VPC端点策略这类配置,所以会出现判定可达但实际不通的情况
- 路由表配置错误:检查子网B关联的路由表,是否有到子网A网段(10.0.2.x/掩码位)的路由,下一跳是否为VPC本地(local)。如果子网B的路由表错误将10.0.2.x的流量指向了NAT网关或其他非本地路由,会导致流量绕路无法到达RDS,可以在子网B的EB实例上执行
ip route查看实际生效的路由规则。 - RDS子网组未包含子网B:确认RDS所属的子网组是否同时绑定了子网A和子网B,如果RDS子网组仅绑定子网A,跨子网访问时RDS的返回流量无法正确路由回子网B,会出现单向不通的问题。
- 网络ACL无状态规则遗漏:VPC网络ACL是无状态的,检查子网B关联的网络ACL,入站规则是否允许RDS(10.0.2.x)的5432端口回程流量,出站规则是否允许到10.0.2.x的5432端口流量,仅开放出站未开放入站回程规则会导致TCP握手失败。
- RDS访问白名单限制:如果RDS使用了自定义参数组,检查
pg_hba.conf配置是否仅放通了10.0.2.x网段的访问,未包含10.0.1.x的子网B网段,这种情况网络可达但数据库层面会直接拒绝连接。 - VPC端点策略限制:如果VPC配置了RDS的VPC端点,检查端点策略是否只允许子网A的IP访问RDS,限制了子网B的流量,Reachability Analyzer默认不会校验VPC端点的策略内容。
内容的提问来源于stack exchange,提问作者JHH
相关产品推荐
相关产品推荐

