私有子网内的 lambda 如何访问公有子网中的 EC2?

Chr*_*rst 3 amazon-ec2 amazon-web-services amazon-vpc aws-lambda

我在公共子网内创建了一个 EC2 实例(以便我可以从家庭网络访问它),并在 VPC 的私有子网内创建了一些 Lambda。

我的第一个 lambda 可以自由访问互联网(通过 NAT 网关)并完成其工作。即每天一次从互联网获取文件并将其上传到 S3。

我的第二个 lambda 应该从 S3 检索该文件(它没有问题)读取该文件,然后将数据上传到在 EC2 实例上运行的 MySQL。它无法连接到数据库(使用 EC2 的公共或私有 IP),并且 Cloudwatch 日志显示会话超时,这让我认为这是一个网络问题。

我有一个第三个 lambda,它还需要与 EC2/数据库实例交互。

我的安全组允许来自我的家庭网络 IP、NAT 网关和 VPC IP 范围的所有传入流量。允许所有出站流量。

我很欣赏在公共子网中以这种方式设置 EC2/DB 的情况并不常见,但我更喜欢在家中使用 Sequel Pro 与它进行交互。

但是,我的设置可能吗?例如,我的私有子网 lambda 可以与公共子网 ec2 实例交互吗?如果是这样,有人知道我如何才能做到这一点吗?

Joh*_*ein 6

看来你的情况是:

  • 在公有子网中运行的 Amazon EC2 实例,带有 MySQL
    • EC2 实例有一个安全组,允许来自您的家庭网络 IP、NAT 网关和 VPC IP 范围的所有传入流量
  • 连接到同一 VPC 的私有子网的 AWS Lambda 函数
  • NAT 网关允许私有子网连接到 Internet
  • Lambda 函数无法连接 EC2 实例上运行的 MySQL 数据库

此场景的正常安全配置是:

  • Lambda 函数 ( Lambda-SG) 上的安全组允许所有出站访问(不需要入站)
  • EC2 实例 ( ) 上的安全组EC2-SG允许从Lambda-SG端口 3306 进行入站访问,以及通过 SSH 等访问实例所需的任何入站权限。

鉴于您的安全组包含“VPC IP 范围”,这应该足以允许入站访问。

Lambda 函数应通过其私有 IP 地址引用 EC2 实例,以将流量保留在 VPC 内。默认情况下,VPC 内的所有子网都可以相互通信,除非网络 ACL已被修改(并且通常应保留默认值)。

这意味着唯一剩下的解释是 MySQL 数据库不接受来自 VPC IP 范围的流量。(我不是 MySQL 人员,但我知道 PostgreSQL 需要定义传入 IP 范围,因此对于 MySQL 来说也可能如此。)

要诊断网络中可能发生的情况,我建议:

  • 在公有子网中启动另一个 Amazon EC2 实例
  • 连接新实例并尝试通过私有IP地址连接MySQL数据库
  • 如果有效,请重复该过程,但要从私有子网中的 EC2 实例进行。要使用此功能,您需要连接到“公共”EC2 实例,然后从那里连接到“私有”EC2 实例。然后,尝试从该私有实例连接到 MySQL。

这些步骤将逐步让您确定网络问题可能出在哪里。让我们知道你发现了什么!