AWS Lambda
开发人员指南

AWS Lambda 执行上下文

当 AWS Lambda 执行您的 Lambda 函数时,它会预置和管理要运行您的 Lambda 函数所需的资源。在您创建 Lambda 函数时,您指定配置信息,例如您希望允许 Lambda 函数使用的内存量和最长执行时间。调用 Lambda 函数时,AWS Lambda 根据您提供的配置设置启动执行上下文。执行上下文是一个临时运行时环境,它会初始化您的 Lambda 函数代码的任何外部依赖项,例如数据库连接或 HTTP 终端节点。这将为后续调用提供更好的性能,因为无需“冷启动”或初始化这些外部依赖项,如下所述。

设置执行上下文需要一些时间并进行必需的“引导”,这会在每次调用 Lambda 函数时增加一些延迟。通常,在首次调用 Lambda 函数或者在更新该函数后会看到此延迟,因为 AWS Lambda 尝试重用执行上下文进行 Lambda 函数的后续调用。

在执行 Lambda 函数之后,AWS Lambda 会保持执行上下文一段时间,预期用于另一次 Lambda 函数调用。其效果是,服务在 Lambda 函数完成后冻结执行上下文,如果再次调用 Lambda 函数时 AWS Lambda 选择重用上下文,则解冻上下文供重用。此执行上下文重用方法的意义在于:

  • 您的 Lambda 函数代码(handler 代码的外部,请参阅 编程模型)中的任何声明保持已初始化的状态,再次调用函数时提供额外的优化功能。例如,如果您的 Lambda 函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。建议您在代码中添加逻辑,以便在创建新连接之前检查是否存在连接。

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

  • 如果 AWS Lambda 选择重用执行上下文,而您的 Lambda 函数在结束时有未完成的后台进程或者回调,则函数将继续它们。您应确保代码中的任何后台进程或回调(使用 Node.js 时)在代码退出前已完成。

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