首页 文章

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

提问于
浏览
34

从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 回答

  • 27

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

    为了解决这个问题,我修改了使用我的RDS实例自动创建的安全组,方法是添加EC2实例中的两个私有IP地址 .

    Adding inbound rules to my RDS instance

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

  • 50

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

  • 1

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

  • -3

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

    如果有关于使用RDS,ELB和多可用区功能的AWS上的DNS路由有任何超级天才,那么知道如何执行此操作将非常棒,因为在Amazon Web Service的文档中没有记录任何内容 .

  • 8

    我有一个类似的问题,当我旋转一个新的EC2实例,但没有改变RDS安全组中允许连接到我的RDS实例的端口3306的入站IP地址的设置 .

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

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

    Screenshot of RDS Dashboard

    这应该打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信找到底部的几个选项卡,选择 Inbound 选项卡,然后单击 Edit 按钮 .

    Screenshot of VPC Security groups

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

    174.33.0.0/16

    要获得此值,您可以ssh到您的实例并运行ifconfig或在浏览器中运行EC2 Manager并在实例详细信息中找到 Private IPs 的值 .

  • 3

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

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

    其中 endpointmymasteruser (用户名)来自您的RDS实例 .

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

  • 1

    尝试连接到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:

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

    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,然后再次测试:

    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支持人员联系以进行进一步的故障排除 .

相关问题