Aws lambda VPC中的Lambda删除需要更多时间
我已经创建了一个堆栈,它使用云形成在VPC中运行。当我尝试删除整个堆栈时,需要40-45分钟的时间 我的Iam角色具有以下权限:Aws lambda VPC中的Lambda删除需要更多时间,aws-lambda,amazon-cloudformation,Aws Lambda,Amazon Cloudformation,我已经创建了一个堆栈,它使用云形成在VPC中运行。当我尝试删除整个堆栈时,需要40-45分钟的时间 我的Iam角色具有以下权限: Action: - ec2:DescribeInstances - ec2:CreateNetworkInterface - ec2:AttachNetworkInterface - ec2:DescribeNetworkInterf
Action:
- ec2:DescribeInstances
- ec2:CreateNetworkInterface
- ec2:AttachNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DeleteNetworkInterface
- ec2:DetachNetworkInterface
- ec2:ModifyNetworkInterfaceAttribute
- ec2:ResetNetworkInterfaceAttribute
- autoscaling:CompleteLifecycleAction
- iam:CreateRole
- iam:CreatePolicy
- iam:AttachRolePolicy
- iam:PassRole
- lambda:GetFunction
- lambda:ListFunctions
- lambda:CreateFunction
- lambda:DeleteFunction
- lambda:InvokeFunction
- lambda:GetFunctionConfiguration
- lambda:UpdateFunctionConfiguration
- lambda:UpdateFunctionCode
- lambda:CreateAlias
- lambda:UpdateAlias
- lambda:GetAlias
- lambda:ListAliases
- lambda:ListVersionsByFunction
- logs:FilterLogEvents
- cloudwatch:GetMetricStatistics
如何缩短堆栈的删除时间?当在VPC中执行Lambda函数时,会创建一个弹性网络接口(ENI),以便为其提供网络访问。您可以将埃尼视为虚拟NIC。它具有MAC地址和至少一个专用IP地址,并且“插入”连接到VPC网络的任何资源,并且在VPC内具有IP地址(EC2实例、RDS实例、ELB、ALB、NLB、EFS等) 虽然Lambda使用的这些接口似乎没有明确的文档记录,但它们似乎以1:1的比例映射到容器实例,每个容器实例承载一个或多个容器,具体取决于每个容器内存分配的大小。Lambda用于配置这些机器的算法没有文档记录,但有一个文档记录的公式用于近似Lambda将创建的数量: 您可以使用以下公式大致确定ENI要求
预计峰值并发执行*(内存单位为GB/3GB)
这个公式表明,如果您具有高并发性或大内存占用,您将看到更多的ENI,如果这两种情况都不成立,您将看到更少的ENI。(3GB boundary的原因似乎是基于Lambda在后台使用的最小实例,即m3.medium通用EC2实例。您在EC2实例中看不到这些实例,并且不会为它们付费。)
在任何情况下,Lambda都不会在函数执行后立即关闭容器或其主机实例,因为它可能需要它们在后续调用中重用,并且由于容器(及其主机实例)不会立即销毁,它们的关联eni也不会立即销毁。这样做效率低下。在任何情况下,延迟都应记录在案:
Lambda函数执行与ENI删除之间存在延迟
这是有意义的,当我们认为LAMBDA基础设施的优先级应该集中在需要的资源上,并保持它们对于快速访问性能的原因是可用的——因此,再次撕裂这些东西是服务在后台参与的次要考虑。
简言之,这种延迟是正常的,也是预期的 据推测,CloudFormation已经使用标签来识别这些接口,因为不清楚如何区分它们ENIs在EC2控制台左侧导航窗格的
网络接口下可见,因此您可以自己删除这些文件并加快进程。。。但请注意,如果系统允许,则需要谨慎执行此操作,因为如果删除附加到Lambda随后尝试使用的容器实例的ENI,Lambda将不知道接口丢失,函数将超时或抛出错误,至少在Lambda决定销毁连接的容器实例之前。在删除子网之前,无法删除VPC,在Lambda终止所有容器并释放它为它们声明的ENIs之前,这是不可能发生的。除了删除这些ENI之外--我认为这是造成阻塞的原因,您可以尝试在控制台中手动删除它们,看看是否有帮助--我不知道您是否可以加快此过程。。。但是让我们看看是否有人有其他想法。嗨,Michael,问题不在于删除VPC,而是删除自定义VPC中部署的lambda。我看到的错误是CloudFormation正在等待清理与Lambda函数关联的NetworkInterface。45分钟后,我看到整个堆栈都被删除了,但我只是想知道是否有任何解决方案可以很快结束它,或者预计会出现此延迟?感谢更新Michael,因为预计会出现此延迟,所以在这里无法执行任何操作。然而,ENI的删除-手动删除它并让它在云形成堆栈再次运行时创建是否可以?那时候它会创建新的ENI吗?谢谢,这个答案非常有用。手动分离和删除接口是使我的部署继续进行的唯一方法。@Cztechnology您在尝试之前等待了多长时间?哦,我希望它需要更长的时间。Lambda在清理不需要的容器之前不会释放这些接口,并且在一段时间内不会这样做(间隔没有记录)。如果您确定这些内容与正在删除的内容关联,则可以手动删除这些内容。。。只需小心,因为从包含正在使用的函数的容器下删除接口将导致后续调用在一段不确定的时间内失败。