【问题标题】:What would prevent me from connecting to a MySQL server on AWS RDS from an AWS EC2 VM?什么会阻止我从 AWS EC2 虚拟机连接到 AWS RDS 上的 MySQL 服务器?
【发布时间】:2015-11-16 10:55:09
【问题描述】:

我在 AWS 中有一个已正确设置的 MySQL RDS 实例。

我在 AWS 中也有一个 Linux EC2 实例。

但是,我无法从 EC2 实例连接到我的 RDS 实例。

但是,我可以从我自己的笔记本电脑连接到 RDS 实例。

我怀疑这是四件事之一

  • RDS 实例的接口绑定 - 它正在侦听外部接口而不是内部接口
  • RDS 实例的防火墙 - 允许从 AWS 网络外部进行连接,但不允许从内部进行连接
  • EC2 实例的防火墙 - 它不允许连接到 RDS 实例
  • EC2 实例上的名称解析 - 由于某种原因,RDS 实例的名称未解析到正确的 IP 地址

不过,据我所知,我已经检查了所有这些,并且它们似乎都井然有序。

我应该看什么?

更新 1:在@mbaird 提出问题后,我检查了 EC2 实例和 RDS 实例是否在同一个 VPC 上。这有什么影响?

更新2:在用户@“Michael - sqlbot”提出问题后,当我说无法连接时,在命令行运行mysql时,使用

mysql --host=<my-hostname> --port=3306 --user=<user> --password=<password>

我可以从我自己的笔记本电脑连接,但是当我尝试从我的 EC2 实例连接时,它只是坐在那里无所事事。过了一会儿,我收到了消息

ERROR 2003 (HY000): Can't connect to MySQL server on '<my-hostname>' (110)

此外,当尝试从我的 Java 应用程序服务器连接到它时,我在堆栈跟踪中得到以下信息

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
...
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
...
Caused by: java.net.ConnectException: Connection timed out

更新 3:DNS 解析会有所不同,具体取决于我是 AWS 内部还是外部。

nslookup <my-hostname>

在我的笔记本电脑上会产生一个 IP 地址 52.11.*.* 范围,而在我的 EC2 实例上执行相同操作会产生一个 IP 地址在 172.31.*.* 范围内。

【问题讨论】:

  • EC2实例和RDS实例是否在同一个VPC内?
  • 是的。碰巧,它们都在同一个 VPC 上
  • 您的安全组是如何配置的?具体来说,是 RDS 实例的安全组。
  • 确定是否是数据库安全组问题的简单方法是暂时允许所有入站流量。另请注意,来自同一 VPC 内其他实例的 EC2 实例的 DNS 解析会产生私有 IP,而来自您的笔记本电脑或 VPC 之外的任何其他地方的 DNS 解析会产生公共 IP。 (尚未验证 RDS 实例是否属于这种情况,但怀疑它)
  • 在您首先查看错误消息之前,您不应该查看这些内容。 “我无法连接”是不够的。请发布确切的错误消息。这应该为我们提供足够的信息,以避免猜测和猜测并查明问题。

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


【解决方案1】:

如果您的 EC2 实例和 RDS 数据库实例位于不同的 VPC 中,您可能正在使用 VPC 对等连接来连接两个 VPC。但在您的情况下,两者都在同一个 VPC 中。那挺好的。确保 RDS 数据库实例在私有子网中启动,EC2 实例在公有子网中启动。

在 EC2 实例中连接 RDS 数据库实例

  1. 在 RDS DB Instance 安全组中,您需要为 EC2 实例打开流量。
  2. 单击 RDS 仪表板中的 数据库安全组。点击入站标签。编辑按钮用于在安全组中添加或删除规则。
  3. 为 EC2 实例添加规则以访问您的数据库。假设您在数据库实例中启动了 MySQL 数据库引擎。您需要为 EC2 实例打开 3306 端口。您可以使用 EC2 实例的私有 IP 连接 RDS 数据库实例。
  4. SSH 进入 EC2 实例,安装 mysql-server 包。您需要使用mysql-server 连接RDS DB Instance。
  5. mysql --host=&lt;my-hostname&gt; --port=3306 --user=&lt;user&gt; --password=&lt;password&gt; 用于连接 RDS 数据库实例的命令。

在 MySQL WorkBench 中连接 RDS 数据库实例

  1. 在 MySQL WorkBench 中,点击 Setup New Connection

  2. 给出连接名称。选择基于 SSH 的标准 (TCP/IP)。您需要提供 SSH 主机名、用户名和密钥文件以及 MySQL 主机名、端口、用户名和密码。

  3. SSH 凭证与 EC2 实例凭证无关。对于 Keyfile,您必须浏览 KeyPair(.pem) 文件。在 RDS 主机名中,您必须提供 RDS 仪表板中可用的端点。

  4. 要验证连接,请单击测试连接按钮。

    您选择 标准 (TCP/IP) over SSH 的原因是通过 EC2 实例连接 RDS 数据库实例。首先,它将连接到 EC2 实例,然后访问 RDS 数据库实例,因为数据库实例无法访问 Internet,并且位于私有子网中。

确保在 Java Web 应用程序中,您提到的 RDS 主机名、端口、用户名和密码正确。无需在应用程序中提及 EC2 主机名。

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 2020-10-19
    • 2021-05-07
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2016-01-20
    • 2016-05-17
    • 2020-12-26
    相关资源
    最近更新 更多