私有子网内的 lambda 如何访问 public 子网中的 EC2?
How can a lambda inside a private subnet access EC2 in a public subnet?
我在 public 子网中创建了一个 EC2 实例(以便我可以从我的家庭网络访问它),并且我在我的 VPC 的私有子网中创建了一些 Lambda。
我的第一个 lambda 可以自由访问互联网(通过 NAT 网关)并完成它的工作。即从网上抓取一个文件上传到S3,每天一次。
我的第二个 lambda 应该从 S3 检索这个文件(它没有问题)读取文件然后将数据上传到 EC2 实例上的 MySQL 运行。它无法连接到数据库(使用 EC2 的 public 或私有 IP)并且 Cloudwatch 日志显示会话超时,让我认为这是网络问题。
我有第三个 lambda,它也需要与 EC2/DB 实例交互。
我的安全组允许来自我的家庭网络 IP、NAT 网关和 VPC IP 范围的所有传入流量。允许所有出站流量。
我很欣赏在 public 子网中以这种方式设置 EC2/DB 并不常见,但我更喜欢在家中使用 [=32= 以这种方式与它交互]临
但是,我的设置是否可行?例如,我的私有子网 lambda 可以与 public 子网 ec2 实例交互吗?如果是这样,有人知道我该如何实现吗?
看来您的情况是:
- public 子网中的 Amazon EC2 实例 运行,具有 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 也是如此。)
要诊断您的网络中可能发生的情况,我建议:
- 在 public 子网
中启动另一个 Amazon EC2 实例
- 连接到新实例并尝试通过私有IP地址
连接到MySQL数据库
- 如果可行,请重复该过程,但要从 私有子网 中的 EC2 实例进行。要使用它,您需要连接到 'public' EC2 实例,然后从那里连接到 'private' EC2 实例。然后,尝试从该私有实例连接到 MySQL。
这些步骤将逐步让您确定网络问题可能出在哪里。让我们知道您发现了什么!
我在 public 子网中创建了一个 EC2 实例(以便我可以从我的家庭网络访问它),并且我在我的 VPC 的私有子网中创建了一些 Lambda。
我的第一个 lambda 可以自由访问互联网(通过 NAT 网关)并完成它的工作。即从网上抓取一个文件上传到S3,每天一次。
我的第二个 lambda 应该从 S3 检索这个文件(它没有问题)读取文件然后将数据上传到 EC2 实例上的 MySQL 运行。它无法连接到数据库(使用 EC2 的 public 或私有 IP)并且 Cloudwatch 日志显示会话超时,让我认为这是网络问题。
我有第三个 lambda,它也需要与 EC2/DB 实例交互。
我的安全组允许来自我的家庭网络 IP、NAT 网关和 VPC IP 范围的所有传入流量。允许所有出站流量。
我很欣赏在 public 子网中以这种方式设置 EC2/DB 并不常见,但我更喜欢在家中使用 [=32= 以这种方式与它交互]临
但是,我的设置是否可行?例如,我的私有子网 lambda 可以与 public 子网 ec2 实例交互吗?如果是这样,有人知道我该如何实现吗?
看来您的情况是:
- public 子网中的 Amazon EC2 实例 运行,具有 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 也是如此。)
要诊断您的网络中可能发生的情况,我建议:
- 在 public 子网 中启动另一个 Amazon EC2 实例
- 连接到新实例并尝试通过私有IP地址 连接到MySQL数据库
- 如果可行,请重复该过程,但要从 私有子网 中的 EC2 实例进行。要使用它,您需要连接到 'public' EC2 实例,然后从那里连接到 'private' EC2 实例。然后,尝试从该私有实例连接到 MySQL。
这些步骤将逐步让您确定网络问题可能出在哪里。让我们知道您发现了什么!