从本地计算机连接到AWS上的MySQL

44

我正在尝试在本地机器上设置开发环境,访问托管在AWS上的MySQL数据库,但是我一直收到“无法连接”的消息。

mysql_connect('xxx.xxx.xxx.xxx:3306', 'USERNAME', 'PASSWORD');

我也在my.cnf文件中注释掉了bind-address,并授予连接的IP地址权限。

有人成功地将此设置工作过吗?


只是我的个人意见:您是否允许在您的AWS主机安全组中打开端口3306,并公开IP? - dweeves
不,我的意思是我家里的电脑,需要进行远程连接。 - Jeffrey Hunter
请检查答案:您需要在相关安全组中打开MySQL端口。 - jsalonen
可能为了安全起见,MySQL 的 TCP 连接被禁用了?请检查 /etc/mysql/my.cnf 中的 skip-networking 选项。 - Stephan B
7个回答

52

我在2013年8月通过Elastic Beanstalk创建的RDS实例经历如下:

0) 假设RDS实例已经被创建
1) 登录管理控制台:https://console.aws.amazon.com/console/home
2) 选择服务->VPC
3) 选择安全组(在左侧)
4) 选择其描述为“RDS DB...的安全组”
5) 在底部的所选安全组面板中,选择“入站”
6) 选择MySQL作为规则。
7) 输入我的本地机器的IP地址,例如145.23.32.15/32
8) 点击添加规则并应用规则更改

这样做后,我就可以使用mysql从我的本地机器连接到数据库。

a) 从管理控制台选择服务->RDS
b) 点击DB实例(我只有一个),然后选择所需实例的“转到详细信息页面”
c) 从端点获取主机和端口
d) 从终端会话中执行类似以下的操作:mysql --host blah.blah.blah.us-west-2.rds.amazonaws.com --port 3306 -u my-user-name -p


我做了那个。然后在终端中,我输入了:ssh database.blablabla.us-west-2.rds.amazonaws.com:3306,但它显示“连接到主机 blablabla 的操作超时”。 - coolcool1994
1
尝试使用mysql命令连接到blah-blah-blah.us-west-2.rds.amazonaws.com主机,端口为3306,用户名为<我的用户名>,密码为-p。 - mikemay
6
还有一件要检查的事情:当您从AWS控制台创建RDS实例时,您必须将“公开可用”设置为是。这必须额外完成,除了在安全组中打开入站端口之外。 - GentlemanCoder
五年后,这仍然是这个问题的简单而最佳答案。是的,数据库必须设置为公开可用。 - Steer360
对我来说运行得非常好。 - Evan Brooks

31

如果您在AWS上通过RDS实例使用MySql,则必须将要连接的IP地址添加到“DB安全组”中。要执行此操作,请转到AWS管理控制台并选择RDS。
1. 在左侧面板中选择“DB安全组”
2. 选择“默认”
3. 从下拉框中选择“CIDR / IP”,并输入您工作站的公共IP地址。 例如:
23.234.192.123/32 (不要忘记为单个ip添加/32)
4. 点击“添加”
5. 等待几分钟以使其生效,然后连接您的MySql客户端。

这仅适用于RDS实例,如果您正在使用安装在EC2实例上的MySql,则与从任何远程计算机访问MySql的指令相同。


2
不必费力地将客户端的IP地址添加到RDS实例中,我只需连接到一个可以连接到RDS的运行中的EC2实例。因此,在MySQL WB的“管理DB连接”对话框中,您的连接方法是“通过SSH的标准TCP/IP”,然后指定SSH参数,最重要的是MySQL主机名,即RDS主机名。 - mblackwell8
@mblackwell8 有人提到 MySQL WB 吗?我们正在尝试从本地的 php 应用程序连接。 - Neo
3
现在已经过时了,因为左侧面板中没有“DB安全组”部分。 - Ed S.

15

使用PHP怎么样?mysql_connect()函数呢? - Jeffrey Hunter
上面的博客文章使用3307作为本地端口,以便不会干扰本地mysql。您可以通过隧道连接到AWS,然后使用mysql_connect('localhost:3307', $user, $pw) - Stephan B
谢谢,我用MySQL Workbench搞定了...但是mysql_connect还有些问题,我会继续尝试的。 - Jeffrey Hunter
1
链接已失效,请始终将相关部分放在答案中,而不仅仅提供链接。 - Bas van Stein

4
我正在使用 Windows 7 计算机,为了能够连接 AWS RDB,我需要进行以下三项更改:
  1. 在 AWS 控制台中更新 VPC 安全组(类似于 mikemay 上面的内容)

    • https://console.aws.amazon.com 进入,点击左上角的“服务”,选择 VPC。
    • 然后选择安全组。
    • 单击具有描述“Security Group for RDS DB…”的安全组。
    • 在“入站”选项卡中,在“创建新规则”下拉列表中选择“MYSQL”。
    • 以 CIDR 格式添加您的 IP 地址,然后单击“添加规则”。
    • 单击“应用规则更改”。
  2. 本地 MySQL 配置中 my.cnf 更新

    • 将“bind-address = 127.0.0.1”更改为“bind-address = 0.0.0.0”。
    • 注释掉“skip-networking”。
  3. 关闭 Windows 防火墙

    • 进入控制面板/系统与安全/Windows 防火墙,并关闭 Windows 防火墙。
这些更改之后,我可以通过两种方式进行连接。
  • MySQL WorkBench using Database->Connect to Database
  • Command Prompt with

    mysql.exe -h <AWS DB Endpoint> -U <UserName> -P <Port Number, likely 3306> -p
    

2
我一直在使用MySQL Workbench http://www.mysql.com/products/workbench/与RDS一起工作,效果很好。非常容易创建和保存新的数据库服务实例。在“服务器管理”下点击“新建服务器实例”,按照提示操作。您需要输入AWS RDS网页上提供的该实例的信息(例如它的端点)。

注意:为了确保连接成功,您必须将您的IP地址添加到“DB安全组”中。该链接位于左侧栏目中,标题为“导航”。我使用“CIDR/IP”选项(另一个选项是EC2安全组)。请务必在IP之后包含“/##”,例如他们在示例中使用的“/32”(您将在页面上看到它)。几秒钟后,IP地址应该得到授权。

完成以上步骤后,请返回MySQL Workbench并完成新服务器实例的创建过程。

要使用该连接,您的代码可能会像这样(这是我Java代码的摘录):

String url = "jdbc:mysql://yourdatabasename.foo.us-east-1.rds.amazonaws.com:3306/";
String userName = "your_user_name";
String password = "your_password";
String dbName = "your_db_name";
String driver = "com.mysql.jdbc.Driver";
Connection connection = DriverManager.getConnection(url + dbName, userName, password);

1

当我们创建RDS时,需要配置防火墙以接受来自本地或其他实例的MySQL连接,因此数据包在防火墙级别被丢弃。要解决这个问题,您需要:

  • 登录到您的AWS控制台,进入RDS

enter image description here

记录下你的MySQL服务器的安全组(在我的情况下是awseb-e)

  • 点击安全组
  • 在中心菜单中点击你的组awseb
  • 点击入站选项卡

从列表中选择MySQL,添加客户端服务器的详细信息并保存规则

输入图像描述 注意:一旦你选择了我的IP,AWS会选择你的IP,如果你需要其他IP,请使用

https://www.whatismyip.com/my-ip-information/

并添加您的IP4 IP

enter image description here


0

1
根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接