AWS:无法从我的计算机连接到RDS数据库。

102
EC2实例/线上网站可以正常连接RDS数据库。但当我想在本地机器中调试代码时,无法连接到数据库并收到以下错误信息:
 

OperationalError: (2003, "无法连接到MySQL服务器'aa9jliuygesv4w.c03i1   ck3o0us.us-east-1.rds.amazonaws.com'(10060)")

我已将.pem和.ppk密钥添加到.ssh,并已配置EB CLI。我不知道还应该怎么做了。
FYI:此应用程序是基于Django的。

1
我猜AWS有一个官方支持渠道,那里的人会为像你这样的问题付费回答。无论我多么想帮助你,没有访问你的AWS账户很难重现问题 - 这使得问题在这里有点不相关。 - Paulo Scardine
3
请检查您的安全组 - 在创建数据库时,您是否将“公开访问”选项设置为是? - Frederic Henri
15个回答

269

原来这并不难,只需按照以下步骤操作:

  1. 进入 EC2 控制台
  2. 切换至“安全组”选项卡
  3. 选择 RDS 数据库的安全组,注意只选择该安全组,您将在底部看到该安全组的详细信息
  4. 点击“入站规则”选项卡
  5. 点击“编辑”按钮
  6. 添加类型:MYSQL/Aurora;协议:TCP;范围:3306;来源:0.0.0.0/0

步骤


51
将您的MySQL实例开放给0.0.0.0/0(所有人?)存在安全风险,对吗? - kafka
1
这对我有用!但是你能解释一下这是否是允许外部访问RDS的标准方式吗? - Raheel
1
在我的情况下,我只需要添加EC2实例的“私有IP”。 - Nil Llisterri
5
如果你在测试数据库上进行调试,那没问题,否则你可能需要将IP范围限制在一个受信任的IP地址范围内(比如公司的IP地址)。这种情况下,你可以写X.X.X.X/32,只允许一个IP地址。顺带一提:创建DB安全组时,Amazon RDS向导似乎会将规则设置为“当前IP”。我现在意识到这一点,因为我回家了,我在办公室测试的连接不再起作用了。 - coconup
现在有一个类似于“添加我的IP”的按钮,它只允许来自您的计算机的连接。 - user7111260
显示剩余7条评论

139

7
然后您可以添加一个安全组,其中包含您的Web服务器IP和开发者访问IP地址。 - kintsukuroi
如果我这样做,人们还需要密码吗?还是任何人都可以访问? - Kailegh
他们仍然需要你的凭据和下载的密钥才能通过ssh访问你的数据库。 - Anthony R
注意:无服务器实例不能配置为公共实例,但不会通知您这一事实。 - fastmultiplication
如果在将公共可访问性设置为“是”之前,在安全组入站规则中允许访问您的(或任何)IP,则无法正常工作。您必须在允许公共可访问性后立即编辑规则并重新保存。 - jbn1981
显示剩余3条评论

29

接受来自任何IP地址的流量

创建RDS实例后,我的安全组入站规则被设置为特定的IP地址。 我必须编辑入站规则以允许来自任何IP地址的访问。

  • “安全组规则”
  • 选择一个安全组
  • 点击“入站规则”
  • 点击“编辑入站规则”
  • 在“来源”下拉菜单中选择“任何地方”
  • ::0或0.0.0.0/0应该出现。
  • 点击“保存规则”

我把它们都加上了,现在它可以工作了 ;) - Aguid
如果您将其设置为公共访问并期望它正常工作,那么这就是正确的答案,但仍需要将规则添加到入站表中。 - Joel Davey

15

我刚刚花了两个小时仔细研究了这个页面中的很好的解决方案。现在是回答问题的时候了!

我重新设置了我的安全组、虚拟私有云(VPC)、路由表、子网和网关...但仍然不行。我从AWS控制台复制粘贴了URL,这种情况下可能会出现 隐藏的尾部空格 。端点位于一个 <div> 元素中,浏览器在复制时会添加一个 \n。将其粘贴到Intellij数据库连接器中会将其强制转换为空格。

只有在将URL粘贴到源代码中的引号字符串中后,我才注意到这个问题。

隐藏空格

IDE中的隐藏空格


2
对于那些看到这篇文章的人...我不得不尝试这个页面上发布的三种解决方案。1)我必须按照@aminah的说明添加一个入站规则,2)我必须确保按照AnythonR的说明设置了公共可访问性,最后3)从aws控制台复制文本时主机名末尾有一个空格...最后一个问题花了我很长时间才解决...希望他们像Azure一样为所有内容提供“复制到剪贴板”按钮。 - Stanton

8
确保您的VPC和子网足够宽广。
以下CIDR配置适用于两个子网:
- VPC - `10.0.0.0/16` - `10.0.0.0 — 10.0.255.255 (65536个地址)`
- 子网1 - `10.0.0.0/17` - `10.0.0.0 — 10.0.127.255 (32768个地址,一半)`
- 子网2 - `10.0.128.0/17` - `10.0.128.0 — 10.0.255.255 (32768个地址,另一半)`
如果需要三个子网,请进行相应调整。
我无法连接到我的RDS数据库。我已经手动检查了所有细节,一切都没问题。没有任何问题的迹象,而且在文档中找不到任何相关信息。我的VPC配置为窄CIDR:10.0.0.0/22,每个子网有255个地址。当我将CIDR更改为10.0.0.0/16并完全分割为两个子网时,我的RDS连接开始工作。我能够找到问题的源头纯属运气,因为对我来说这毫无意义。

2
如果您已经尝试了以上所有答案,请尝试以下方法... 重新创建数据库...
AWS 在数据库创建时提供了一个选项,允许公共/私有访问。

enter image description here


您无需重新创建数据库即可更改公共访问权限,这可以在创建后进行修改。 - Joel Davey

2
几乎每个人都指出了答案,我会从不同的角度来解释一下,以便您能够理解。
连接到AWS RDS有两种方式:
1. 在同一VPC和子网中配置实例。安装Workbench后,您将能够连接到数据库。您不需要使其公开访问。例如:您可以在同一VPC组中配置一个Windows实例,并安装Workbench,然后通过端点连接到数据库。 2. 另一种方法是仅向您的IP公开访问数据库,以防止未经授权的访问。您可以更改数据库安全组,以允许DB端口流量仅限于您的IP。通过这种方式,您的数据库将对您公开可见。这是我们为各种AWS服务添加其安全组的方式。
如果两种选项都不起作用,则错误可能在VPC路由表中。您可以检查它是否与子网相关联,以及是否附加了Internet网关。
您可以观看这个视频,它会解决您的疑惑:

https://youtu.be/e18NqiWeCHw


1

理想的调试清单如下:

  • 实例的“公共可访问”属性应启用
  • 附加到实例的安全组应具有开放的入站规则(尽可能开放)
  • 有趣的是,如果您无法访问它,则问题肯定与您的实例位于相应 VPC 的私有子网中有关。

然而,还有更安全的访问 RDS 实例的方法。最好的选择是不要使其公开可访问,锁定安全组并具有 P2P 中继节点(类似 Tailscale)。


1

我甚至无法从EC2实例内部连接。

经过查阅AWS RDS选项,发现EC2实例只能连接到它们所在的同一VPC中的RDS。

当在与RDS相同的VPC中创建EC2实例时,我可以按预期访问它。


1

不要忘记检查您的VPN或防火墙是否阻止连接。


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