VPC 中的 Lambda 删除需要更多时间

Lambda in VPC deletion takes more time

我使用云形成在 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 地址,并且是 "plugged into" 连接到 VPC 网络并在 VPC 内具有 IP 地址的任何资源(EC2 实例、RDS 实例、ELB、ALB 、NLB、EFS 等)。

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

You can use the following formula to approximately determine the ENI requirements.

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 也不是。这样做效率低下。无论如何,延迟记录在案:

There is a delay between the time your Lambda function executes and ENI deletion.

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

这是有道理的,当我们认为 Lambda 基础设施的优先事项应该集中在根据需要提供资源并出于快速访问性能原因保持资源可用时——因此再次拆除是服务参与的次要考虑因素在后台。

总之,这种延迟是正常的,也是意料之中的。

据推测,CloudFormation 已使用标签来识别这些接口,因为尚不清楚如何区分它们。

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