AWS Lambda 执行环境 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Lambda 执行环境

Lambda 在执行环境中调用您的函数,该环境提供一个安全和隔离的运行时环境。执行环境管理运行函数所需的资源。执行环境为函数的运行时以及与函数关联的任何外部扩展提供生命周期支持。

函数的运行时使用运行时 API 与 Lambda 通信。扩展使用扩展 API与 Lambda 进行通信。扩展还可以通过使用 日志 API 订阅日志来接收来自函数的日志消息。


      执行环境的体系结构图。

创建 Lambda 函数时,您指定配置信息,例如可用内存量和函数允许的最长执行时间。Lambda 使用此信息设置执行环境。

函数的运行时和每个外部扩展都是在执行环境中运行的进程。权限、资源、凭证和环境变量在函数和扩展之间共享。

Lambda 执行环境生命周期

执行环境的生命周期包括以下阶段:

  • Init:在此阶段,Lambda 使用配置的资源创建或解除冻结执行环境,下载函数和所有层的代码,初始化任何扩展,初始化运行时,然后运行函数的初始化代码(主处理程序外的代码)。Init 阶段在第一次调用期间发生,或在函数调用之前(如果已启用预置并发)发生。

    Init 阶段分为三个子阶段:Extension initRuntime initFunction init。这些子阶段确保所有扩展和运行时在函数代码运行之前完成其设置任务。

  • Invoke:在此阶段,Lambda 调用函数处理程序。函数运行到完成后,Lambda 准备处理另一个函数调用。

  • Shutdown:如果 Lambda 函数在一段时间内没有接收任何调用,则会触发此阶段。在 Shutdown 阶段,Lambda 终止运行时,提醒扩展以使其干净停止,然后删除环境。Lambda 向每个扩展发送一个 Shutdown 事件,该事件告诉扩展此环境就要关闭。


        Init 阶段之后是一个或多个函数调用。当没有调用请求时,Lambda 启动 SHutdown 阶段。

每个阶段都以 Lambda 发送到运行时和所有注册的扩展的事件开始。运行时和每个扩展都通过发送 Next API 请求来指示完成。Lambda 在运行时和每个扩展完成且没有挂起的事件时冻结执行环境。

Init 阶段

Init 阶段,Lambda 执行三项任务:

  • 启动所有扩展 (Extension init)

  • 引导运行时 (Runtime init)

  • 运行函数的静态代码 (Function init)

当运行时和所有扩展通过发送 Next API 请求表明它们已准备就绪时, Init 阶段结束。Init 阶段限制为 10 秒。如果所有三个任务都未在 10 秒内完成,Lambda 在第一个函数调用时重试 Init 阶段。

调用阶段

当调用 Lambda 函数以响应 Next API 请求时,Lambda 向运行时和每个扩展发送一个 Invoke 事件。

函数的超时设置限制了整个 Invoke 阶段的持续时间。例如,如果将函数超时设置为 360 秒,则该函数和所有扩展都需要在 360 秒内完成。请注意,没有独立的调用后阶段。持续时间是所有调用时间(运行时 + 扩展)的总和,直到函数和所有扩展完成执行之后才计算。

调用阶段在运行时之后结束,所有扩展都通过发送 Next API 表示它们已完成。

如果在 Invoke 期间出现故障,则Lambda 重置执行环境。重置的行为类似于 Shutdown 事件。首先,Lambda 关闭运行时。然后,Lambda 向每个注册的外部扩展发送一个 Shutdown 事件。该事件包括关闭的原因。如果另一个 Invoke 事件导致此执行环境被重用,则 Lambda 初始化运行时和扩展以作为下一次调用的一部分。


          这是我的图像。

关闭阶段

当 Lambda 即将关闭运行时时,它会向运行时和每个外部扩展发送一个 Shutdown 事件。扩展可以使用此时间执行最终清理任务。Shutdown 事件是对 Next API 请求的响应。

持续时间:整个 Shutdown 阶段的上限为 2 秒。如果运行时或任何扩展没有响应,则 Lambda 通过一个信号 (SIGKILL) 终止它。

在函数和所有扩展完成后,Lambda 维护执行环境一段时间,以预期另一个函数调用。实际上,Lambda 冻结执行环境。当再次调用该函数时,Lambda 解冻环境以便重复使用。重复使用执行环境会产生以下影响:

  • 在该函数的处理程序方法的外部声明的对象保持已初始化的状态,再次调用函数时提供额外的优化功能。例如,如果您的 Lambda 函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。建议您在代码中添加逻辑,以便在创建新连接之前检查是否存在连接。

  • 每个执行环境都在 /tmp 目录中提供 512 MB 的磁盘空间。冻结执行环境时,目录内容会保留,同时提供可用于多次调用的暂时性缓存。您可以添加额外的代码来检查缓存中是否有您存储的数据。有关部署大小限制的更多信息,请参阅Lambda 配额

  • 如果 Lambda 重复使用执行环境,则由 Lambda 函数启动但在函数结束时未完成的后台进程或回调将继续执行。确保代码中的任何后台进程或回调在代码退出前已完成。

在编写函数代码时,不会假定 Lambda 自动为后续函数调用重用执行环境。其他因素可能指示需要 Lambda 以创建新的执行环境,这可能导致意外结果(例如,数据库连接失败)。