一个Lambda容器是否可以同时托管多个函数?

6

多个Lambda函数定义是否可以部署到同一个容器实例中?

我了解给定的Lambda容器一次只能执行最多一个函数,但想要了解函数和主机容器之间的组合关系。

例如,在使用AWS Toolkit扩展的Visual Studio的无服务器应用项目类型中,可以在单个项目中定义多个函数,但是这些函数通过CloudFormation部署到单独的容器还是代表项目的单个容器中?

4个回答

4

我认为将过程分开可能会有所帮助:

  • lambda部署是代码的zip文件和相应的配置。在您的Serverless App项目类型中,当您有多个lambda函数时,您正在创建多个部署。
  • lambda实例是托管在容器内的部署的运行版本。一个容器只允许一个lambda实例,这是AWS的保证。这意味着您永远无法访问当前运行实例之外的代码/内存/文件(无论是您自己的还是其他人的!)

作为优化,AWS通过冻结和解冻容器来重复使用实例。这是因为启动新容器、复制部署并执行部署的init代码(称为冷启动)非常昂贵。


一个部署可以有多个处理程序吗?我需要了解不同的处理程序是否可以一起托管并重用相同的执行上下文,例如静态初始化/内存缓存,比如将API网关映射到独立的Lambda函数处理程序,以处理通过网关实例映射的不同端点。 - Sam
1
你可以在部署中使用任何 _代码_,但只有你配置的处理程序才会被调用。因此,你可以在处理程序之间共享编译时信息(例如常量文件或公共功能),但不能共享运行时信息(例如连接池或在初始化时设置的变量)。 (注意:运行时信息由容器共享而不是实例,因此同一处理程序的两个并发实例将在单独的容器中运行)。 - thomasmichaelwallace
1
你项目中的每个单独函数都是无状态且自包含的。 - Arieh Kovler
你知道在哪里可以找到 AWS 的文件来证实“容器中只允许一个 Lambda 实例,这是 AWS 保证”的说法吗? - Ulad Kasach

0

我使用ExpressJS+NodeJS完成了这个功能。每个函数都是一个不同的ExpressJS路由。然而,到目前为止我还没有能够用Spring Cloud Function实现它。


0

关于这个问题没有官方文件,但我会分享我过去几年从文档/帖子/会议中收集到的信息:

Lambda函数是建立在容器化服务之上的“框架”(或类似的东西,只是这个词是我能想到的最接近的词,并且是我从AWS代表那里听到的唯一一个)。每次调用Lambda函数时都会运行一个容器(它可以是现有的一个,被搁置 - 增加性能提升,或者是一个全新的容器,你永远不知道它是哪一个。)

你可以假设容器实例(使用ECS中使用的实例作为主机机器)是相同的,考虑到有一些针对DB连接池等问题的解决方法,但没有人保证这一点。


0

CloudFormation将把函数部署到同一AWS账户中。这是在AWS用户帐户级别上发生的。它不会运行函数。

Lambda是事件驱动的,只有在触发时才运行。每个Lambda实例都是独立的,就用户体验而言,当触发时会“在自己的容器中部署”。

也许在抽象层下面会发生更深入的事情,但这就是您的体验方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接