亚马逊AWS官方博客

Lambda VPC 内运行网络优化

在之前的文章Lambda预配置并发介绍中介绍了Lambda的内部结构以及运行过程,其中特别介绍了引起冷启动的原因以及通过预配置并发来解决冷启动的问题,这篇文章将介绍另一种引起冷启动的场景,就是当lambda 运行在VPC内部时因为网络接口的创建而引起的冷启动,以及此次发布新特性的优化方案以及原理介绍。

为什么Lambda需要运行在VPC内?

客户经常因为安全方面的考虑,会将Lambda运行在VPC内,或者因为其数据如 Amazon RDS、ElastiCache 或 Elastisearch 等必须运行在VPC的私有子网,这样Lambda程序就必须放在VPC内才能成功的访问这些服务,还有一种场景就是可以通过 AWS 专线服务,打通VPC与您数据中心的网络,从而实现Lambda访问数据中心中的资源。

VPC网络优化之前存在的不足


如上图所示展示了当Lambda运行在VPC内的架构,随着Lambda访问量的增加ENI的数量也会随之增加,因为创建ENI本身是一个比较消耗时间的操作,频繁的操作会引起冷启动的问题,同时随着ENI的增加IP地址资源可能会超出VPC划分的IP段,以及超出部分AWS资源的使用限制,多个Lambda的执行过程如下图:

随着Lambda数量的增加会出现以下问题:

  • IP资源可能超出VPC/子网的规划范围
  • 达到账户级别的网络接口限制
  • 可能会超出EC2 网络接口创建API接口的访问速率限制

优化方案以及对比

从2020年8月5日开始,中国区已经发布了lambda的网络性能优化特性,这将改变您的功能连接到VPC的方式。AWS Hyperplane是用于网络负载平衡器和NAT网关的网络功能虚拟化平台,已支持AWS PrivateLink等产品的VPC间连接,并且我们现在正在利用Hyperplane提供从Lambda VPC到客户VPC的NAT功能。 Hyperplane ENI是Lambda服务控制的托管网络资源,允许多个执行环境安全地访问您帐户中VPC内部的资源。取代了将VPC中的网络接口直接映射到Lambda执行环境的以前的解决方案,VPC中的网络接口被映射到了Hyperplane ENI,并且功能使用它来连接。

Hyperplane还继续使用VPC中存在的跨帐户附加网络接口,但对此方式做了如下方面的改进:

  • 当创建Lambda函数或者更新VPC设置时,会发生网络接口的创建。当函数被调用时,执行环境会使用预先创建好的网络接口,并快速建立到它的网络隧道。这极大地减少了冷启动时间,相较于以前创建和附加网络接口相关的延迟。
  • 因为网络接口是在执行环境之间共享的,所以每个函数通常只需要几个网络接口。帐户中各个函数之间的每个唯一的安全组:子网组合都需要不同的网络接口。如果您的帐户中的多个功能共享一个组合,从而在多个函数之间重复使用相同的网络接口。
  • 函数的扩展不再与网络接口的数量直接相关,并且Hyperplane ENI可以扩展以支持大量并发函数执行

HyperplaneENI绑定到您帐户中的 安全组:子网组合。共享相同安全组的同一帐户中的功能:子网配对使用相同的网络接口。这样,具有多个函数但具有相同网络和安全性配置的单个应用程序可以从现有接口配置中受益。 在此新模型中,以下操作是相同的:

  • 您的Lambda函数仍然需要在VPC中创建和删除网络接口所需的IAM权限。
  • 您仍然可以控制这些网络接口的子网和安全组配置。您可以继续应用常规的网络安全控制,并遵循有关VPC配置的最佳实践。
  • 您仍然必须使用NAT设备(例如VPC NAT网关)来提供功能性的Internet访问或使用VPC端点连接到VPC之外的服务。
  • 您的功能可以在VPC内部访问的资源类型没有任何变化。

下来我们来看一下改进前后的延时监控(通过X-Ray监控):

下图显示了Lambda在VPC内运行优化前的过程,当Lambda 被调用的时候会创建ENI,从而引起冷启动。

下图是优化后的监控截图,执行功能与上图相同,但是这次是在具有新VPC网络功能的帐户中执行的。您会看到这在函数执行持续时间上产生了巨大的差异,它从14.8秒降至933毫秒!

如在VPC内使用Lambda?

可以在已有的Lambda中通过编辑指定运行的VPC
选中VPC,子网和安全组后点击保存。 注意: 为函数执行角色配置 允许创建ENI(参考 https://docs.thinkwithwp.com/lambda/latest/dg/configuration-vpc.html),否则添加VPC时会报错“The provided execution role does not have permissions to call CreateNetworkInterface on EC2”

总结

本文从VPC内运行Lambda的场景开始,介绍了Lambda在VPC内运行的网络交互过程,以及当前存在的冷启动问题,进一步介绍了本次VPC内网络性能优化的实现原理介绍,最后通过优化前后的监控对比说明了优化效果。 通过本次优化的发布,让您在VPC内使用Lambda更简单,更高效。

 

本篇作者

刘恒涛

AWS 解决方案架构师,负责基于AWS的云计算方案架构咨询和设计。同时致力于AWS云服务在国内的应用和推广。