我使用云形成在VPC中创建了一个lambda堆栈。当我尝试删除整个堆栈时,需要40-45分钟的时间。

我的Iam角色具有以下权限:

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


如何提高堆栈的删除时间?

最佳答案

当Lambda函数在您的VPC中执行时,将创建一个弹性网络接口(ENI)以便对其进行网络访问。您可以将ENI视为虚拟NIC。它具有一个MAC地址和至少一个私有IP地址,并且被“插入”到连接到VPC网络的任何资源,并且在VPC内部具有IP地址(EC2实例,RDS实例,ELB,ALB,NLB,EFS,等等。)。

尽管似乎没有明确记录,但Lambda所使用的这些接口似乎已1:1映射到容器实例,每个容器实例托管一个或多个容器,具体取决于每个容器的内存分配大小。 Lambda用于配置这些计算机的算法没有记录,但是有一个记录的公式可以近似估算Lambda将创建的数字:


您可以使用以下公式大致确定ENI要求。

Projected peak concurrent executions * (Memory in GB / 3GB)

https://docs.aws.amazon.com/lambda/latest/dg/vpc.htm


此公式表明,如果您具有较高的并发性或较大的内存占用,则将看到更多的ENI;如果这些条件都不成立,则将看到较少的ENI。 (3GB边界的原因似乎是基于Lambda在后台使用的最小实例,该实例是m3.medium通用EC2实例。您在EC2实例中看不到这些实例,因此无需付费为他们。)

无论如何,Lambda不会在函数执行后立即关闭容器或其主机实例,因为它可能需要它们在以后的调用中重用,并且由于容器(及其主机实例)不会立即销毁,因此它们关联的ENI也不会被销毁。这样做将是低效的。无论如何,延迟记录如下:


Lambda函数执行与ENI删除之间存在延迟。

http://docs.aws.amazon.com/lambda/latest/dg/vpc.html


当我们认为Lambda基础结构的优先重点应集中在根据需要提供资源并出于快速访问性能的原因而保持可用状态时,这是有道理的。因此,再次拆除这些内容是服务在后台需要考虑的次要因素。

简而言之,这种延迟是正常的和预期的。

据推测,CloudFormation使用了标签来标识这些接口,因为如何区分它们尚不容易。

ENI在EC2控制台的左侧导航窗格中Network Interfaces下可见,因此您可以自行删除这些ENI,并加快该过程……但是请注意,如果系统允许,则应适当执行此操作。注意-因为如果您删除附加到Lambda随后尝试使用的容器实例的ENI,Lambda将不知道该接口丢失,并且该函数至少在Lambda决定销毁该接口之前都会超时或抛出错误附加的容器实例。

07-28 02:45
查看更多