无法从 EC2 实例连接到 RDS 实例
Posted
技术标签:
【中文标题】无法从 EC2 实例连接到 RDS 实例【英文标题】:Can't connect to RDS instance from EC2 instance 【发布时间】:2013-05-26 03:00:18 【问题描述】:我正在尝试从 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
错误 2003 (HY000):无法连接到“mysql.************.us-east-1.rds.amazonaws.com”上的 MySQL 服务器 (110)
我可以使用与上面相同的行从本地计算机很好地连接到 RDS 实例。我尝试了各种论坛解决方案,但都没有帮助。
【问题讨论】:
ec2 盒子的安全组上的端口是否打开以允许连接到 rds? 是的,我已经将EC2实例的安全组(sg-**)添加到RDS安全组了。 如果我从 EC2 到 RDS 主机名进行跟踪路由,则会超时:traceroute mysql.****.us-east-1.rds.amazonaws.com traceroute to mysql.*** *.us-east-1.rds.amazonaws.com (10.206.**.***),最大 30 跳,60 字节数据包^C 1 * * * 2 * * * 3 * * * 4 * * * 5 * * * 这让我相信这是一个 DNS/防火墙问题。但是,我有一条规则让 RDS 安全组允许来自该 EC2 安全组的连接。 我还将 CIDR 0.0.0.0/0 添加到 RDS 安全组,以确认所有人都可以访问该 mysql 数据库。还是不行。这告诉我 DNS 没有从我的 EC2 实例路由到正确的 RDS 主机名。其他人有这个问题吗? 所以我从 AWS 外部和 EC2 实例内部对主机名进行了“挖掘”。它似乎从 EC2 实例正确路由到其内部 IP,但从外部 IP 路由到外部 IP。是否有任何诊断标志可以添加到 mysql 连接字符串中以查看实际发生的情况或其他一些详细的日志记录?这非常令人沮丧。 【参考方案1】:当我创建一个新的 EC2 实例时,我遇到了类似的问题,但没有更改 RDS 安全组中允许连接到我的 RDS 实例的端口 3306 的入站 IP 地址的设置。
令人困惑的是 RDS 仪表板中的一个选项,称为安全组。你不需要它来解决问题。
你真正需要的是:
转到 RDS 实例列表 单击您尝试连接的实例 点击安全组规则部分这应该会打开一个新的浏览器选项卡或窗口,其中包含安全组的详细信息。 在底部找到几个选项卡,选择入站规则选项卡并单击编辑按钮。
将值更改为您的 EC2 实例或 IPv4 CIDR 块的 IP 地址,例如
174.33.0.0/16
要获取此值,您可以通过 ssh 进入您的实例并运行 ip addr 或在浏览器中运行 EC2 Manager 并在您的实例详细信息中找到 Private IPs 的值。
【讨论】:
谢谢,效果很好!我想知道为什么只是创建一个新的安全组对我不起作用。我想我误解了安全组的实际作用。 哇!!!!非常感谢你,我的朋友,经过几个小时处理这些事情没有成功,我只是按照你说的做了,'瞧',它正在工作!!!!!!谢谢!!我正在保存你的答案,所以当我再次遇到这个问题时,我会在这里:) 正是我想要的。现在我的 Web 应用程序已连接到数据库。 对我来说,这里的关键是关于私有 IP 而不是公共 IP - 它在 VPC 内连接,而不是通过外部流量与公共 IP 连接。 我想从本地 MySqlWorkbench 连接我的 mysql rds。我添加了入站规则以允许 Internet 流量,但来自本地计算机的 telnet 仍然无法正常工作。它一直在“尝试 65.1.164.97...”..【参考方案2】:苦苦挣扎了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
【讨论】:
【参考方案3】:今天我的 EC2 实例突然无法访问 RDS 实例并且 Wordpress 停止工作时,我遇到了类似的问题。安全组是正确的,我什至可以从 EC2 实例上的控制台连接到 MySQL,但不能从 php。出于某种原因,重新启动 EC2 服务器对我有帮助。
【讨论】:
【参考方案4】:虽然 Mark 的问题似乎与多可用区路由和 EC2 经典有关,但我今天遇到了同样的问题。
为了解决这个问题,我修改了使用我的 RDS 实例自动创建的安全组,方法是添加我的 EC2 实例中的两个私有 IP 地址。
这是一个相当明显的问题,但总的来说我是 AWS 新手,所以希望这对像我这样的其他人有用。
【讨论】:
我在自定义 IP 下方找到了“我的 IP”选项,在选择后获取了解决问题的我的 IP。感谢@sapenove 之前和之前提供的上述提示。【参考方案5】:根据Amazon doc,我们应该使用:
PROMPT> mysql -h <endpoint> -P 3306 -u <mymasteruser> -p
其中 endpoint 和 mymasteruser(用户名)来自您的 RDS 实例。
我直接使用IP公共地址(端点)而不是端点(****.us-east-1.rds.amazonaws.com)解决了这个问题。您可以使用“ping”获取IP公共地址" 命令(ping ****.us-east-1.rds.amazonaws.com)
【讨论】:
你会做什么?如果您的 RDS 数据库实例位于私有子网中【参考方案6】:针对在尝试连接 RDS 或 RedShift 时可能遇到类似问题的人的其他信息:
1) 检查安全组
验证 RDS 实例的安全组是否允许从您的源服务器所属的安全组(或者如果在 AWS 外部,则直接添加其 IP)进行访问。您应该查看的安全组是在 RDS 控制台 UI 的 RDS 实例属性中指定的安全组(名为“安全组”)。
注意:数据库安全组可能与 AWS EC2 安全组不同。如果您的 RDS 实例在经典/公共 EC2 中,您应该检查 RDS UI 的“数据库安全组”部分。对于 VPC 用户,安全组为普通 VPC 安全组(名称 sg-xxx 将列在 RDS 实例的属性中)。
2) 确认 DNS 没有问题。
Amazon 使用拆分 DNS,因此 AWS 外部的 DNS 查找将返回公共 IP,而 AWS 内部的查找将返回私有 IP。如果您怀疑是 DNS 问题,您是否确认从不同的可用区返回不同的 IP?如果不同的 AZ 获得不同的 IP,则需要联系 AWS 支持。
3) 通过建立套接字连接来确认网络连接。
tracepath 和 traceroute 等工具可能无济于事,因为 RDS 目前会丢弃 ICMP 流量。
通过尝试在端口 3306(mysql 或 postgres 的 5432)上建立与 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) 如果你的socket连接测试成功了,但是你无法连接mysql客户端(CLI、workbench、app等),看看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 支持以进行进一步的故障排除。
【讨论】:
这是一个绝妙的答案!谢谢!【参考方案7】:看起来在上次发布和这次发布之间的某个时间,亚马逊修复了 DNS 路由问题,因为现在对于多可用区 rds 一切正常......
【讨论】:
当我使用 Multi-AZ 时,我仍然遇到与您相同的问题,它无法公开访问。【参考方案8】:显然,多可用区搞砸了一切。由于默认的多可用区配置将我的数据库放置在区域 us-east-1d 中,并且我的 EC2 实例位于区域 us-east-1a 中,因此 DNS 路由不正确。我将 RDS 实例重新创建为非多可用区,并将其置于 us-east-1a 中,一切都很顺利。
如果在 AWS 上具有 RDS、ELB 和多可用区功能的 DNS 路由方面有任何超级天才,那么知道如何做到这一点会非常棒,因为这在 Amazon 的任何地方都没有记录Web Service 的文档。
【讨论】:
我在 2019 年的今天也遇到了这个问题! @ChadVanDeHey ha - 这并不让我感到惊讶! :P以上是关于无法从 EC2 实例连接到 RDS 实例的主要内容,如果未能解决你的问题,请参考以下文章
使用 MySQL Workbench 通过 EC2 实例连接到 Amazon RDS 实例