我已经在一个公共子网中创建了一个EC2实例(这样我就可以从我的家庭网络访问它(,并且我已经在我的VPC的私有子网内创建了一些Lambda。
我的第一个lambda可以自由访问互联网(通过NAT网关(并完成它的工作。这就是从互联网上获取一个文件并上传到S3,每天一次。
我的第二个lambda应该从S3中检索这个文件(它这样做没有问题(读取文件&然后将数据上传到EC2实例上运行的MySQL。它无法连接到数据库(使用EC2的公用或专用IP(,Cloudwatch日志显示会话超时,这让我认为这是一个网络问题。
我有一个第三个lambda,它也需要与EC2/DB实例交互。
我的安全组允许来自我的家庭网络IP的所有传入流量,NAT网关&VPC IP范围。允许所有出站流量。
我很感激在公共子网中以这种方式设置EC2/DB并不常见,但我更喜欢在家中使用Sequel Pro以这种方式与它交互。
然而,我的设置可能吗?例如,我的私有子网lambdas可以与公用子网ec2实例交互吗?如果是的话,有人知道我该怎么做吗?
您的情况似乎是:
- 在公共子网中运行的AmazonEC2实例,带有MySQL
- EC2实例有一个安全组,允许来自家庭网络IP、NAT网关和VPC IP范围的所有传入流量
- 连接到同一VPC的私有子网的AWS Lambda函数
- 允许私有子网连接到Internet的NAT网关
- Lambda函数无法连接EC2实例上运行的MySQL数据库
此场景的正常安全配置为:
- Lambda函数(
Lambda-SG
(上的安全组,允许所有出站访问(不需要入站( - EC2实例(
EC2-SG
(上的一个安全组,允许从端口3306上的Lambda-SG
进行入站访问,再加上您希望通过SSH访问实例的任何入站权限,等等
鉴于您的安全组包括";VPC IP范围";,这应该足以允许入站访问。
Lambda函数应通过其私有IP地址引用EC2实例,以保持VPC内的流量。默认情况下,VPC内的所有子网都可以相互通信,除非网络ACL已被修改(通常应保留为默认值(。
这意味着剩下的唯一解释是MySQL数据库不接受来自VPC IP范围的流量。(我不是MySQL的人,但我知道PostgreSQL需要定义传入的IP范围,所以MySQL也可能是这样。(
要诊断网络中可能发生的情况,我建议:
- 在公用子网中启动另一个Amazon EC2实例
- 连接到新实例并尝试通过私有IP地址连接到MySQL数据库
- 如果有效,请从专用子网中的EC2实例重复该过程。要使用它,您需要连接到"public"EC2实例,然后从那里连接到"private"EC2示例。然后,尝试从那个私有实例连接到MySQL
这些步骤将逐步让您确定网络问题的位置。让我们知道您的发现!