AWS Lambda VPC ENI溢出:每次调用创建新ENI触发超限报错求助
我之前在处理Lambda VPC访问场景时也踩过这个ENI堆积的坑,给你分享几个经过实践验证的解决方案:
配置预留并发,提前复用ENI
Lambda的ENI是和并发执行实例绑定的,默认弹性并发模式下,每次冷启动新实例都会创建新ENI。如果你开启预留并发,Lambda会提前创建好对应数量的ENI并保持复用,避免每次请求都新建资源。操作起来很简单:在Lambda控制台的函数配置里找到「并发」选项,根据业务峰值设置合理的预留并发值——这不仅能减少ENI创建量,还能降低函数冷启动时间。优化Lambda执行逻辑,减少并发实例数
ENI的数量直接和Lambda的并发实例数挂钩。如果你的函数执行时间过长、逻辑冗余,会导致大量实例同时运行,ENI自然就堆起来了。可以从这几个方向优化:- 精简代码逻辑,砍掉不必要的IO操作或冗余计算
- 把非核心任务改成异步处理,缩短单实例执行时长
- 调整触发策略,比如对批量请求做合并处理,避免短时间内大量触发函数
确认Lambda拥有ENI删除权限
虽然你提到角色有ec2:*权限,但有时候可能存在隐性限制(比如组织级的SCP策略)。Lambda在实例终止后需要主动删除对应的ENI,如果缺失ec2:DeleteNetworkInterface权限,ENI就会残留堆积。建议遵循最小权限原则,给角色配置必要的ENI操作权限即可:{ "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface" ], "Resource": "*" }自动清理闲置ENI
可以创建一个独立的Lambda函数(不要放在同一个VPC里,避免触发同样的问题),定时筛选出属于Lambda的闲置ENI(比如Description包含Lambda managed、状态为available的资源),然后自动删除。示例Python代码片段:import boto3 ec2 = boto3.client('ec2') def lambda_handler(event, context): enis = ec2.describe_network_interfaces(Filters=[ {'Name': 'description', 'Values': ['Lambda managed*']}, {'Name': 'status', 'Values': ['available']} ])['NetworkInterfaces'] for eni in enis: ec2.delete_network_interface(NetworkInterfaceId=eni['NetworkInterfaceId'])调整ENI配额(最后手段)
如果前面的优化都没法满足业务需求,你可以向AWS支持申请提升对应区域的ENI配额。默认每个区域的ENI配额是350个,提交申请时说明你的业务场景和需要的配额数量,一般AWS都会审批通过。
补充说明:Lambda的ENI在实例终止后会保留一段时间(通常是几小时)才会自动删除,但如果函数触发频率太高,回收速度赶不上创建速度,就会触发配额超限。
内容的提问来源于stack exchange,提问作者Elad Hazan

