无法连接到公共可访问的AWS RDS

时间:2020-03-20 09:15:12

标签: amazon-web-services aws-lambda amazon-rds amazon-vpc subnet

我正在VPC内的lambda上运行无服务器Web应用程序,并连接到Aurora-MySQL RDS实例,并具有入站规则以允许来自lambda的安全组的流量 连接工作正常,但是lambda冷启动经常给我超时。 经过一些研究,我发现在VPC上运行lambda会带来额外的启动成本,并且我建议不要在多个地方使用该lambda,以避免在VPC上使用lambda,除非您严格需要访问VPC中的某些资源。

因此,我决定将RDS移至可公开访问的实例,以便我的Lambda可以通过Internet进行访问并将Lambda从VPC中删除。

因此,我将RDS Public accessibility选项更改为Yes,并编辑了安全组以允许来自任何IP的入站连接。 我还从Lambda中删除了VPC,因此Lambda不再在VPC上运行 我以为就足够了。

但是后来我的lambda开始无法连接到数据库 我尝试使用本地客户端进行连接,再次失败

尝试ping主机名,请求超时

深入研究之后,我发现具有某些私有子网的数据库实例子网组可能是一个问题(?) 因此,我创建了一个仅具有公共子网的新子网组,并尝试将数据库实例移至该新子网组...但是得到了以下消息:

You cannot move DB instance my-instance to subnet group my-new-group. The specified DB subnet group and DB instance are in the same VPC.

好吧,看来我无法移至同一VPC中的其他子网,我开始尝试创建一个新的VPC,但这似乎不合适,我敢肯定我还有其他东西在这里不见了。

我还阅读了有关网络ACL的信息,并认为这可能是问题所在,但我的规则似乎还不错,默认规则允许任何流量(规则*表示拒绝)

ALL Traffic ALL ALL 0.0.0.0/0 ALLOW

我的RDS网络设置

Subnet group
default

Subnets
subnet-11111111
subnet-22222222
subnet-33333333
subnet-44444444
subnet-55555555
subnet-66666666

Security
VPC security groups
default (sg-111111)
( active )

Public accessibility
Yes

我的安全组入站规则

Type Protocol Port range    Source  Description - optional
All traffic All All 0.0.0.0/0   -
All traffic All All ::/0    -

仍然无法连接,无法与本地客户端连接,甚至无法ping通:

通过我的本地客户端连接

Can't connect to MySQL server on 'my-instance.xxxxxxxxxx.us-east-1.rds.amazonaws.com' 
ping my-instance.xxxxxxx.us-east-1.rds.amazonaws.com
PING ec2-xx-xx-xx-xx.compute-1.amazonaws.com (xx.xx.xx.xx): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2

我在这里想念什么吗?

更新

我的VPC可以访问Internet(我可以从中访问Internet服务,这不是问题),我有Internet网关和NAT网关。

我正在使用Zappa进行lambda部署,这需要创建一个保持温暖的功能……但是,我知道并发请求仍然可能是个问题

lambda中的VPC的问题在于它可以在冷启动时增加10s,这对于我的一些用例来说是不可行的: https://www.freecodecamp.org/news/lambda-vpc-cold-starts-a-latency-killer-5408323278dd/

2 个答案:

答案 0 :(得分:2)

除了在RDS实例上启用“公共访问”之外,您还需要使用Internet网关启用到VPC的Internet连接。将其连接到VPC之后,需要将数据从数据库子网路由到Internet网关。 Check here

但是我不建议您像这样公开您的数据库。如果您在lambda冷启动方面遇到问题,则应创建一个keep it warm事件。

答案 1 :(得分:1)

您需要做的是:

  • 使用默认VPC创建新的子网组
  • 为可用性区域分配两个子网
  • 然后修改您的RDS实例
  • 将子网组更改为新创建的组
  • 将“公共可访问性”标记为“是”。
  • 检查您的VPC是否正在使用Internet网关。

检查lambda安全组是否已打开以打开数据库端口的出站连接。

无需为RDS创建其他VPC。使用默认VPC。

按照@stargazer的建议,请尝试不公开公开或在VPC之外公开。它在VPC中运行良好。