我在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 DB实例在不同的VPC中,您可能正在使用VPC对等连接两个VPC。但在你的情况下,两者都在同一个VPC中。很好。确保RDS DB实例在私有子网中启动,EC2实例在公有子网中启动。
在EC2实例中连接RDS DB实例
在RDS DB Instance security group中,需要打开EC2实例的流量。
从RDS仪表板中单击DB Security Group。单击入站选项卡。编辑按钮用于从安全组添加或删除规则。
为EC2实例添加规则以访问数据库。比方说,您已经在数据库实例中启动了MySQL数据库引擎。您需要为EC2实例打开3306端口。您可以使用EC2实例的私有IP连接RDS DB实例。
SSH到EC2实例中,安装mysql-server包。您需要使用mysql-server连接RDS DB实例。
mysql --host=<my-hostname> --port=3306 --user=<user> --password=<password>用于连接RDS DB实例的命令。
在MySQL WorkBench中连接RDS DB实例
在MySQL WorkBench中,单击Setup New Connection。
提供连接名称。选择标准(TCP/IP)而不是SSH。您需要提供SSH主机名、用户名和密钥文件以及MySQL主机名、端口、用户名和密码。
SSH凭据与EC2实例凭据完全不同。对于Keyfile,您必须浏览KeyPair(.pem)文件。在RDS主机名中,必须提供RDS仪表板中提供的端点。
要验证连接,请单击“测试连接”按钮。
选择标准(TCP/IP)而不是SSH的原因是通过EC2实例连接RDS DB实例。首先,它将连接到一个EC2实例,然后访问RDS DB实例,因为DB实例没有internet访问权限,并且它位于私有子网中。
确保在java web应用程序中,您提到的RDS主机名、端口、用户名和密码都是正确的。在应用程序中不需要提到EC2主机名。

07-24 09:39
查看更多