从EC2实例i-78a8df00,我正在尝试连接到RDS实例mysql . ************ . us-east-1.rds.amazonaws.com . 他们都在美国东部地区 . 我将EC2实例的安全组(sg - ********)添加到RDS安全组,但这没有帮助 . 它似乎是防火墙/ DNS问题,因为它在运行此命令时超时:
ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com
ERROR 2003(HY000):无法连接到mysql上的MySQL服务器 . ************ . us-east-1.rds.amazonaws.com'(110)
我可以使用与上面相同的行从本地计算机连接到RDS实例 . 我尝试了各种论坛解决方案,但那些没有帮助 .
7 回答
虽然Mark的问题似乎与多AZ路由和EC2经典有关,但我今天遇到了同样的问题 .
为了解决这个问题,我修改了使用我的RDS实例自动创建的安全组,方法是添加EC2实例中的两个私有IP地址 .
这是一个相当明显的问题,但我一般都是AWS的新手,所以希望这对像我这样的人有用 .
看起来在上次发布和发布之间的某个时间,亚马逊修复了DNS路由问题,因为现在一切正常用于多AZ rds ......
当我的EC2实例突然失去对RDS实例的访问并且Wordpress停止工作时,我今天遇到了类似的问题 . 安全组是正确的,我甚至可以从EC2实例上的控制台连接到MySQL,但不能从PHP连接到MySQL . 出于某种原因,重启EC2服务器帮助了我 .
显然,多AZ将一切都搞砸了 . 由于默认的多可用区配置将我的数据库放在us-east-1d区域,而我的EC2实例位于us-east-1a区域,因此DNS无法正确路由 . 我重新创建了RDS实例作为非多重AZ,并使其在us-east-1a中生效,并且一切都很开心 .
如果有关于使用RDS,ELB和多可用区功能的AWS上的DNS路由有任何超级天才,那么知道如何执行此操作将非常棒,因为在Amazon Web Service的文档中没有记录任何内容 .
我有一个类似的问题,当我旋转一个新的EC2实例,但没有改变RDS安全组中允许连接到我的RDS实例的端口3306的入站IP地址的设置 .
令人困惑的位是RDS仪表板中的一个选项,称为安全组 . 你不需要它来解决问题 .
您真正需要的是转到RDS实例列表,单击您尝试连接的实例,然后单击中间选项卡,找到 Security and Network 部分并单击安全组的名称 .
这应该打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信找到底部的几个选项卡,选择 Inbound 选项卡,然后单击 Edit 按钮 .
将值更改为EC2实例或IPv4 CIDR块的IP地址,例如
174.33.0.0/16
要获得此值,您可以ssh到您的实例并运行ifconfig或在浏览器中运行EC2 Manager并在实例详细信息中找到 Private IPs 的值 .
根据Amazon doc,我们应该使用:
其中 endpoint 和 mymasteruser (用户名)来自您的RDS实例 .
我直接使用IP公共地址( endpoints )而不是 endpoints (**** . us-east-1.rds.amazonaws.com)解决了这个问题 . 你可以使用“ping”命令获取ip公共地址( ping **** . us-east-1.rds.amazonaws.com)
尝试连接到RDS或RedShift时可能遇到类似问题的人员的其他信息:
1) Check security groups
验证RDS实例的安全组是否允许从源服务器所属的安全组进行访问(或者如果在AWS外部,则直接添加其IP) . 您应该查看的安全组是RDS控制台UI(名为“安全组”)的RDS实例属性中指定的安全组 .
NOTE :数据库安全组可能与AWS EC2安全组不同 . 如果您的RDS实例位于经典/公共EC2中,则应该检查RDS UI的"database security group"部分 . 对于VPC用户,安全组将是普通的VPC安全组(名称sg-xxx将列在RDS实例的属性中) .
2) Confirm DNS isn't an issue.
Amazon使用拆分DNS,因此AWS外部的DNS查找将返回公共IP,而AWS内部的查找将返回私有IP . 如果您怀疑它是DNS问题,您是否确认从不同的可用区域返回了不同的IP?如果不同的AZ获得不同的IP,则需要联系AWS支持 .
3) Confirm network connectivity by establishing a socket connection.
像tracepath和traceroute这样的工具可能无济于事,因为RDS目前会丢弃ICMP流量 .
通过尝试在端口3306(mysql或5432 for postgres)上 Build 到RDS实例的套接字连接来测试端口连接 . 首先找到RDS实例的IP并使用telnet或nc:
a) 如果您的连接尝试未在该端口上运行服务't successful and immediately fails, the port is likely blocked or the remote host isn' . 您可能需要聘请AWS支持人员进一步排除故障 . 如果从AWS外部连接,首先尝试从AWS内的另一个实例进行连接(因为您的防火墙可能会阻止这些连接) .
b) 如果连接不成功并且超时,则防火墙可能会丢弃/忽略数据包,或者数据包在不同的网络路径上返回 . 您可以通过运行
netstat -an | grep SYN
(在运行并等待telnet / nc命令超时时从其他CLI窗口/会话运行)来确认这一点 . SYN状态下的连接意味着您收到了任何回复(SYN_ACK或拒绝/阻止) . 通常这意味着防火墙或安全组忽略或丢弃数据包 .检查以确保您没有在主机和RDS实例之间使用iptables或NAT网关 . 如果您在VPC中,还要确保允许来自源主机的出口/出站流量 .
c) 如果您的套接字连接测试成功,但无法连接mysql客户端(CLI,工作台,应用程序等),请查看netstat的输出以查看连接的状态(替换xxxx与RDS实例的实际IP地址):
netstat -an | grep x.x.x.x
如果在使用telnet或NC时 Build 连接,但在使用mysql客户端时看到“SYN”状态,则可能会遇到MTU问题 .
写入时,RDS可能不支持用于PMTUD的ICMP数据包(https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD) . 如果您通过ClassicLink从经典ec2实例的VPC中进行're trying to access RDS or RedShift that',则可能会出现问题 . 尝试使用以下内容降低MTU,然后再次测试:
如果较低的MTU有效,请务必跟进AWS客户支持部门寻求帮助,并提及您在尝试连接到RDS实例时遇到MTU问题 . 如果TCP数据包被封装用于隧道传输,则会发生这种情况,从而导致分组数据/有效负载的可用MTU较低 . 降低源服务器上的MTU允许包装的数据包仍然适合限制 .
如果它不起作用,请将您的MTU恢复为默认值,并与AWS支持人员联系以进行进一步的故障排除 .