从EC2实例排查常见RDS连接问题
一份实用指南,用于诊断和解决Amazon EC2实例与RDS数据库之间的典型连接问题。了解系统化排查安全组、VPC路由、网络ACL和RDS配置设置中常见陷阱的方法,确保云应用通信可靠。
从EC2实例排查常见RDS连接问题
当EC2上的应用无法连接到RDS时,首先需要确定故障类型。超时通常意味着流量在路径某处被丢弃。快速出现连接被拒绝表示主机已到达但端口未接受连接。身份验证错误则说明网络路径可能正常,问题已转移到数据库用户、密码、SSL、IAM身份验证或授权上。
这种区分可以节省时间。不要为网络超时而重置密码,也不要为密码错误而开放安全组。从EC2实例向外排查:DNS、端口可达性、安全组、子网路由、NACL、RDS状态,再到数据库身份验证。
成功连接的前提条件
在深入排查之前,请确保以下基础元素配置正确:
- VPC对齐: EC2实例和RDS实例最好位于同一VPC内以实现最简单的配置,尽管通过VPC对等连接可以实现跨VPC连接。
- 可用区(AZ): 确保应用基础设施(EC2)能够跨可用区访问数据库基础设施(RDS),尽管路由通常会在VPC内处理此问题。
- 网络可达性: 确认EC2实例正在运行且具有活跃的网络连接(例如,它可以访问互联网或其他内部服务)。
步骤1:验证安全组配置(最常见的原因)
安全组充当EC2实例和RDS实例的虚拟防火墙。配置错误是绝大多数连接失败的根源。
A. EC2安全组检查
您的EC2实例需要出站规则允许流量通过数据库端口离开。默认情况下,大多数安全组允许所有出站流量(所有协议/端口的0.0.0.0/0),但最好验证一下。
B. RDS安全组入站规则检查
这是关键步骤。RDS安全组必须明确允许来自EC2实例的入站流量。
可操作检查:
- 导航到RDS控制台并选择您的数据库实例。
- 转到连接与安全选项卡,找到关联的安全组。
- 编辑入站规则。
- 确保有一条规则允许特定数据库端口(例如MySQL的3306,PostgreSQL的5432)的流量。
- 此规则的源必须是EC2实例的安全组ID,或者如果您不使用安全组引用,则为EC2实例的特定私有IP范围。
最佳实践: 始终引用源资源(EC2)的安全组ID,而不是在源字段中使用特定IP地址。这样即使EC2实例的私有IP发生变化(例如在扩展或重启期间),连接也能保持。
示例入站规则(PostgreSQL):
| 类型 | 协议 | 端口范围 | 源 |
|---|---|---|---|
| PostgreSQL | TCP | 5432 | sg-012345abcdef67890(您的EC2安全组ID) |
步骤2:确认RDS公共可访问性和端点
如果您的EC2实例不在私有子网中,或者需要通过公共互联网连接(通常不建议用于生产环境),则必须检查RDS公共可访问性。
A. 公共可访问性设置
- 在RDS控制台中,检查RDS实例的连接与安全选项卡。
- 如果公共可访问设置为否,则数据库只能通过私有网络路径访问,例如同一VPC内的资源,或通过对等连接、Transit Gateway、VPN或Direct Connect连接的网络(在路由和安全规则允许的情况下)。
- 如果公共可访问设置为是,不要将其视为生产访问的捷径。确认客户端具有有效的公共路由,并将RDS安全组限制为最小的实际源范围。同一VPC中的EC2实例通常应使用私有路径。
B. 端点验证
确保EC2实例上的应用使用正确的RDS端点(DNS名称)和正确的端口。不匹配会导致超时或连接被拒绝。
使用EC2实例上的telnet或nc(netcat)工具测试到RDS端点和端口的基本TCP可达性:
# 对于MySQL,端口3306
telnet your-rds-endpoint.rds.amazonaws.com 3306
# 对于PostgreSQL,端口5432
nc -zv your-rds-endpoint.rds.amazonaws.com 5432
成功连接会显示空白屏幕或立即显示连接消息。失败(超时或拒绝)表示网络阻塞,通常是安全组或子网路由问题。
步骤3:分析子网和路由配置
如果安全组看起来正确,问题可能出在子网之间的通信方式上。
A. 网络ACL(NACL)
网络ACL是在子网级别运行的无状态防火墙。如果您实施了自定义NACL,它们可能会阻止完成连接所需的返回流量。
- 检查EC2子网和RDS子网的NACL。
- 确保入站和出站规则都允许数据库端口和临时端口范围(1024-65535)的流量用于返回流量。
B. 跨VPC或混合路由
RDS数据库连接通常使用正常的VPC路由,而不是S3风格的网关端点。如果EC2和RDS位于不同的VPC中,或从本地网络连接,请验证两个方向的完整私有路由。VPC对等连接、Transit Gateway、VPN和Direct Connect都需要路由表条目以及兼容的安全组和NACL规则。
步骤4:数据库实例配置检查
如果网络连接已确认(步骤2成功),则问题出在数据库引擎本身。
A. 数据库凭据和授权
验证从EC2实例连接的应用使用的用户名、密码和数据库名称。RDS服务(如MySQL和PostgreSQL)强制执行严格的用户身份验证。
B. 参数组和数据库状态
- 数据库状态: 确保RDS实例状态为可用。如果它正在修改、备份或重启,连接将失败。
- 参数组: 检查应用于RDS实例的任何自定义参数组。某些设置(如某些MySQL配置中的
skip-networking,尽管在托管RDS中不太常见)可能会阻止连接。
C. IAM数据库身份验证(如果使用)
如果您使用IAM进行数据库身份验证而不是密码,请确保附加到EC2实例的IAM角色(或运行应用的用户配置文件)具有正确的权限(rds-db:connect),并且连接字符串正确包含必要的身份验证令牌。
排查流程
使用此优先级检查清单快速解决问题:
- 端口检查: EC2能否使用
telnet或nc访问RDS端口?不要依赖ICMP ping;RDS不是可以用那种方式排查的普通服务器。 - RDS安全组: 入站规则是否允许来自EC2安全组的流量到RDS端口?
- NACL: 入站和出站规则是否都开放了必要的端口(数据库端口+临时端口)?
- 端点/凭据: 连接字符串是否正确,凭据是否有效?
- 数据库状态: RDS实例是否可用?
如果端口测试失败,请停留在网络层直到成功。如果端口测试成功但数据库客户端失败,请停止更改VPC规则并仔细阅读数据库错误。大多数EC2到RDS的问题在将网络可达性和数据库身份验证视为独立问题后会变得更容易解决。