Lambda in VPC

原理

默认情况下,Lambda部署在AWS自己托管的VPC,所以Lambda代码不能访问帐号VPC下的资源,例如RDS、ElastiCache、internal ALB……

image-20220403185829621

在部署Lambda时,可以配置将其部署在自己帐号下的VPC,并且指定部署在哪个子网、使用哪个安全组。

Lambda会在每个子网中创建一个ENI(Elastic Network Interface):

image-20220403185928612

Lambda访问公网

如果Lambda部署在自己的VPC,且需要访问公网,需要分两种情况讨论:

  • 如果Lambda部署在公有子网(public subnet),由于Lambda没有被分配公网IP,那么它永远访问不了外网!!!
  • 如果Lambda部署在私有子网(private subnet), 且部署了NAT Gateway / NAT Instance,则可以访问公网。

image-20220403190034831

权限设置

由于配置Lambda in VPC时,需要额外创建一个ENI,所以lambda上的role要有以下权限:

  • ec2:CreateNetworkInterface
  • ec2:DescribeNetworkInterfaces
  • ec2:DeleteNetworkInterface

可以直接添加一个 AWSLambdaVPCAccessExecutionRole 上去。

参考:

https://docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html


Lambda in VPC的idle问题

如果部署在VPC中的lambda很长时间没有被调用(连续几周),那么它的状态就会变成Inactive。此时调用就会提示:

The function __ is idle. To reactivate your function, choose Restore.

官方文档这样介绍:

If your functions aren't active for a long period of time, Lambda reclaims its network interfaces, and the functions become Idle. To reactivate an idle function, invoke it. This invocation fails, and the function enters a Pending state again until a network interface is available.

所以要等待一段时间,等ENI重新创建完成,lambda才能正常被调用。


解决这个问题的话有两个思路:

  1. 使用provisioned concurreny, 但会产生额外费用。
  2. 设置一个定时任务,每隔一周调用一次lambda,保证ENI不会被回收。

参考:

https://stackoverflow.com/questions/62005562/aws-lambda-the-function-is-idle

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html

https://aws.amazon.com/cn/blogs/compute/tracking-the-state-of-lambda-functions/