手动将 ENI 从子网分离后,VPC 中的 Lambda 不会创建新的 ENI

Posted

技术标签:

【中文标题】手动将 ENI 从子网分离后,VPC 中的 Lambda 不会创建新的 ENI【英文标题】:Lambda in VPC won't create new ENI after an ENI has been manually detached from subnet 【发布时间】:2018-01-27 08:01:21 【问题描述】:

我遇到了一个问题,即一旦从 VPC 子网中分离并删除了 ENI,我的 Lambda 函数就无法再在该子网中创建新的 ENI。我已经在两个不同的 VPC 和多个子网上复制了这个。

以下是我用来重现此内容的步骤:

    创建 Lambda 函数并将其与 VPC 和子网关联。 执行 Lambda 函数,这将导致它在子网中创建一个新的 ENI。该函数能够访问 VPC 中的 RDS 数据库。 从子网手动分离和删除 ENI。 再次执行 Lambda 函数。不会创建 ENI。 Lambda 函数无法访问 RDS 数据库。

我在两个 VPC 中的多个子网中重复了这些步骤,现在 Lambda 函数无法在任何这些子网中创建新的 ENI。

VPC 子网似乎永远无法让 Lambda 函数创建新的 ENI,但在让事情一夜之间,我今天早上再次运行了该函数,它能够创建一个 ENI。 AWS 必须有一个自动化流程来清理某些东西。即便如此,我再次测试了分离和删除,我又回到了 Lambda 函数不会创建新 ENI 的状态。

不确定这里发生了什么。分离 ENI 时,我没有选择“强制分离”。我做错了什么?

【问题讨论】:

ENI 仅在 Lambda 冷启动时创建。我猜您在手动删除 ENI 后遇到了仍然热的 Lambda 函数。 但如果我删除 Lambda 函数并在同一个 VPC 和子网中重新创建它,新函数将无法创建 ENI。删除并重新创建函数不应该导致冷启动吗? 是的,这听起来不对。您是否要更改分配给该函数的 IAM 角色? 为什么要删除网卡?您这样做是为了解决什么问题? @MarkB 我使用的是相同的 IAM 角色,但我只是尝试创建一个新函数和一个新的 IAM 角色,但使用相同的 VPC 和子网仍然没有获得 ENI。 【参考方案1】:

从我今天下午所做的研究看来,这是在 VPC 中运行的 Lambda 函数的一个限制,并且已经存在一年多。删除 Lambda 函数后,清理 ENI 会有 6 小时的延迟。我手动分离和删除 ENI 使事情变得更糟,因为似乎 ENI 直到六个小时的延迟后才真正被删除。手动删除似乎将 ENI 置于某种孤立状态,阻止在该子网中创建新的 ENI,直到 AWS 清除旧的 ENI。

https://www.reddit.com/r/aws/comments/4fncrl/dangling_enis_after_deleting_an_invpc_lambda_with/

https://github.com/hashicorp/terraform/issues/5767

因此,目前强制清理的唯一解决方案似乎是删除 ENI 及其所在的子网。:-/

我让我的无服务器删除命令运行了很长时间(我没有通过手动删除 ENI 来加快速度),它最终完成了,但花了 40 分钟。 ENI 被抛在后面,但其他一切都被清理干净了。我想在六个小时内 ENI 会消失。

【讨论】:

马修,这似乎仍在发生,就像发生在我身上一样。自去年以来,您是否取得了任何额外的进展,或者仅仅是 AWS 没有修复的一个错误? 早在 2017 年 11 月,我与 Lambda 团队的一位“高级开发人员倡导者”交换了电子邮件,他说“正在解决 40 分钟时间问题”。从那以后,我再次尝试给他发电子邮件,但没有得到任何回复。我还通过我们的 AWS 业务支持合同开立了支持票,我得到的唯一回复是“我们正在努力”。 :-/【参考方案2】:

我最近遇到了类似的问题。我无法删除 sg 或子网,因为它们正被其他堆栈使用。我想如果我强制 lambda 冷启动,它可能会创建新的 eni。为了测试这一点,我分配了最大内存和超时。它奏效了。

【讨论】:

这是一个很好的解决方法。将内存分配更改为 max 似乎会导致所有底层容器被删除,并且后续调用是冷启动。 这确实触发了 ENI 的重建

以上是关于手动将 ENI 从子网分离后,VPC 中的 Lambda 不会创建新的 ENI的主要内容,如果未能解决你的问题,请参考以下文章

为什么我的VPC中的实例仍然可以ping不同子网中的实例?

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

terraform - 将 vpc_id 参数从不同的 VPC 传递到多个子网

构建Neo4j使用已存在的VPC和子网

VPC 中的 Amazon ELB

如何将使用 cidrsubnets 的子网的 CIDR 范围传递给 Terraform 版本 0.14 中的 VPC 模块