无法从EC2实例连接到RDS实例

时间:2013-05-30 13:38:57

标签: mysql amazon-web-services amazon-ec2 amazon-rds

从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实例。我试过各种论坛解决方案,但那些没有帮助。

8 个答案:

答案 0 :(得分:66)

当我旋转新的EC2实例时,我遇到了类似的问题,但是没有更改允许连接到我的RDS实例的端口3306的入站IP地址的RDS安全组中的设置。

令人困惑的位是RDS仪表板中的一个选项,称为安全组。你不需要它来解决问题。

您真正需要的是转到RDS实例列表,单击您尝试连接的实例,然后单击中间选项卡,找到安全和网络部分,然后单击安全名称组。

Screenshot of RDS Dashboard

这应该打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信息。 找到底部的多个标签,选择入站标签,然后点击修改按钮。

Screenshot of VPC Security groups

将值更改为EC2实例或IPv4 CIDR块的IP地址,例如

174.33.0.0/16

要获得此值,您可以ssh进入您的实例并运行 ifconfig 或在浏览器中运行EC2 Manager并在实例详细信息中找到私有IP 的值。 / p>

答案 1 :(得分:29)

尝试连接到RDS或RedShift时可能遇到类似问题的人员的其他信息:

1)检查安全组

验证RDS实例的安全组是否允许从源服务器所属的安全组进行访问(或者如果在AWS外部,则直接添加其IP)。您应该查看的安全组是RDS控制台UI(名为“安全组”)的RDS实例属性中指定的安全组。

注意:数据库安全组可能与AWS EC2安全组不同。如果您的RDS实例位于经典/公共EC2中,则应该检查RDS UI的“数据库安全组”部分。对于VPC用户,安全组将是普通的VPC安全组(名称sg-xxx将列在RDS实例的属性中)。

2)确认DNS不是问题。

亚马逊使用拆分DNS,因此AWS外部的DNS查找将返回公共IP,而AWS内部的查找将返回私有IP。如果您怀疑它是DNS问题,您是否确认从不同的可用区域返回了不同的IP?如果不同的AZ获得不同的IP,您需要联系AWS支持。

3)通过建立套接字连接来确认网络连接。

tracepath和traceroute等工具可能无济于事,因为RDS目前会丢弃ICMP流量。

尝试在端口3306(mysql或5432 for postgres)上建立与RDS实例的套接字连接,以测试端口连接。首先找到RDS实例的IP并使用telnet或nc:

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306

a)如果连接尝试失败并立即失败,则端口可能被阻止或远程主机未在该端口上运行服务。您可能需要聘请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时建立连接,但在使用mysql客户端时看到“SYN”状态,则可能会遇到MTU问题。

在编写本文时,RDS可能不支持用于PMTUD(https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD)的ICMP数据包。如果您尝试通过ClassicLink从经典ec2实例访问VPC中的RDS或RedShift,则可能会出现问题。尝试使用以下内容降低MTU,然后再次测试:

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400

如果较低的MTU有效,请务必跟进AWS客户支持部门寻求帮助,并提及您在尝试连接到RDS实例时遇到MTU问题。如果TCP数据包被封装用于隧道传输,则会发生这种情况,从而导致分组数据/有效负载的可用MTU较低。降低源服务器上的MTU允许包装的数据包仍然适合限制。

如果它不起作用,请将您的MTU恢复为默认值,并聘请AWS支持人员进行进一步的故障排除。

答案 2 :(得分:10)

虽然Mark的问题似乎与多AZ路由有关,但是EC2经典,我今天碰到了同样的问题。

要解决此问题,我通过添加来自EC2实例的两个私有IP地址,修改了使用我的RDS实例自动创建的安全组。

Adding inbound rules to my RDS instance

这是一个相当明显的问题,但我一般都是AWS的新手,所以希望这对像我这样的人有用。

答案 3 :(得分:3)

显然,多AZ会搞砸一切。由于默认的多可用区配置将我的数据库放在us-east-1d区域,而我的EC2实例位于us-east-1a区域,因此DNS无法正确路由。我将RDS实例重新创建为非多重AZ,并将其设置为us-east-1a,并且一切都很开心。

如果有关于使用RDS,ELB和多可用区域功能的AWS上的DNS路由有任何超级天才,那么知道如何执行此操作将非常棒,因为亚马逊的任何地方都没有记录Web Service的文档。

答案 4 :(得分:1)

看起来在上次发布和发布之间的某个时间,亚马逊修复了DNS路由问题,因为现在一切正常,对于多AZ rds ......

答案 5 :(得分:1)

当我的EC2实例突然失去对RDS实例的访问权限并且Wordpress停止工作时,我今天遇到了类似的问题。安全组是正确的,我甚至可以从EC2实例上的控制台连接到MySQL,但不能从PHP连接到MySQL。出于某种原因,重启EC2服务器帮助了我。

答案 6 :(得分:1)

苦苦挣扎了 3 天后,我终于找到了为什么我的无法连接...

在您的EC2实例上为3306端口添加出站规则,并在您的RDS服务器上的3306端口添加入站规则。入站值应该是EC2实例的安全性

示例:

  • 您的 EC2 安全组是 - sg.ec2
  • RDS 安全组是 - sg.rds

所以去编辑 sg.ec2 的出站规则并在端口 3306 和目的地添加自定义 TCP 到 0.0.0.0/0

然后编辑sg.rds的入站规则,在3306端口添加入站规则,源为sg.ec2

答案 7 :(得分:-3)

根据Amazon doc,我们应该使用:

PROMPT> mysql -h <endpoint> -P 3306 -u <mymasteruser> -p

端点 mymasteruser (用户名)来自您的RDS实例。

我直接使用IP公共地址(端点)而不是端点(****。us-east-1.rds.amazonaws.com)解决了这个问题。你可以使用“ping”来获取ip公共地址“命令(ping ****。us-east-1.rds.amazonaws.com)