默认情况下,Lambda部署在AWS自己托管的VPC,所以Lambda代码不能访问帐号VPC下的资源,例如RDS、ElastiCache、internal ALB……
在部署Lambda时,可以配置将其部署在自己帐号下的VPC,并且指定部署在哪个子网、使用哪个安全组。
Lambda会在每个子网中创建一个ENI(Elastic Network Interface
):
如果Lambda部署在自己的VPC,且需要访问公网,需要分两种情况讨论:
公有子网(public subnet)
,由于Lambda没有被分配公网IP,那么它永远访问不了外网!!!私有子网(private subnet)
, 且部署了NAT Gateway / NAT Instance
,则可以访问公网。由于配置Lambda in VPC时,需要额外创建一个ENI,所以lambda上的role要有以下权限:
可以直接添加一个 AWSLambdaVPCAccessExecutionRole 上去。
参考:
https://docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html
https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html
如果部署在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才能正常被调用。
解决这个问题的话有两个思路:
参考:
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/