AWS - Amazon · 2020年12月21日

Lambda如何接入私有网络

不知道大家在用Lambda时有没有想过一点:Lambda运行在哪?

首先它肯定不属于你,它不像EC2或者RDS之类的,你知道他们都在你VPC里,因为你知道他们都是”一台机器“,因此需要你部署在VPC里。

但Lambda致力于serverless,因此你不用为它创建主机。但你也知道,它必然在一个地方,创建了一个Container,并且接入着网络。

默认情况下,当一个Lambda实例创建后,它接入的是AWS的VPC,并且是public的。

但如果它接入的网络是public的话,那么它如何和你自己创建的private VPC交互呢?

如果想这样做,那就需要指定Lambda创建的Container接入你想让它接入的VPC。当你将Lambda指定接入某个VPC时,也就是VPC-enabled,那么Lambda会在那个VPC中创建自己的虚拟网卡,以达到连接的目的。

既然Lambda在VPC中创建了自己的虚拟网卡,那么有两点注意的事情:

  1. Lambda必须可以,也就是有权限,创建虚拟网卡。这里的有权限,就说明Lambda必须有如下role:
    1. AWSLambdaVPCAccessExecutionRole,具体包括:
      1. 增:ec2:CreateNetworkInterface
      2. 删:ec2:DeleteNetworkInterface
      3. 查:ec2:DescribeNetworkInterfaces
  2. 既然Lambda有了自己的网卡,那么它相当于放弃了默认的网络配置。也就是说,当一个Lambda VPC-enabled,则失去了直接通往public的连接。如果你仍然需要这个Lambda能够访问外网,则需要走NAT,如果你接入的是private网段的话。


更新:

Lambda通过创建网卡接入私有网络的方法,仍在持续改进着。之前的方法,Lambda会在“执行任务”的时候,创建“属于自己的”网卡。这样做有个坏处,就是如果有多个Lambda,那么就会创建多个网卡。每次创建网卡都会增加cold-start的时间。

基于此,新的设计改进为:在“功能创建时”,就创建一个“公用”的网卡。并且用一个VPC-VPC NAT来让多个Lambda使用该网卡。

这样做减少了每个Lambda创建网卡的时间:只要有个function被创建了,那么这一个“通道”就被创建了。于是后边的Lambda都可以手艺。