【问题标题】:Lambda in VPC deletion takes more timeVPC 中的 Lambda 删除需要更多时间
【发布时间】:2018-06-06 01:41:30
【问题描述】:

我使用云形成在 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

如何提高栈的删除时间?

【问题讨论】:

  • 在删除子网之前无法删除 VPC,并且在 Lambda 终止所有容器并释放它为它们声明的 ENI 之前不会发生这种情况。没有删除这些 ENI——我认为这是导致卡顿的原因,你可以尝试在控制台中手动删除它们以查看是否有帮助——我不知道你可以加快这个过程。 ..但是让我们看看是否有人有其他想法。
  • 嗨,Michael,问题不在于删除 VPC,而是删除了自定义 VPC 中部署的 lambda。我看到的错误是 CloudFormation 正在等待清理与 Lambda 函数关联的 NetworkInterfaces。 45 分钟后,我看到整个堆栈都被删除了,但如果有任何解决方案就想要尽快结束,还是预计会出现这种延迟?

标签: aws-lambda amazon-cloudformation


【解决方案1】:

当 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 下可见,因此您可以自己删除这些并加快进程...但请注意,假设系统允许此操作,需要谨慎行事——因为如果您删除附加到 Lambda 随后尝试使用的容器实例的 ENI,Lambda 将不知道该接口丢失,并且该函数将超时或抛出错误,至少在 Lambda 决定之前销毁附加的容器实例。

【讨论】:

  • 感谢 Michael 的更新,因为预计这种延迟在这里无能为力。但是,ENI 的删除 - 是否可以手动删除它并在再次运行云形成堆栈时让它创建?到时候它会创建新的 ENI 吗?
  • 谢谢,这个答案非常有帮助。
  • 手动分离和删除接口是让我的部署继续进行的唯一方法。
  • @Czechnology 在尝试之前你等了多久?
  • 哦,我希望它需要更长的时间。 Lambda 在清理不需要的容器之前不会释放这些接口,并且它在一段时间内不会这样做(间隔没有记录)。如果您确定它们与要删除的某些内容相关联,应该可以手动删除它们...请小心,因为从包含以下功能的容器中删除接口使用将导致后续调用在不确定的时间段内失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多