AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

自定义 AWS Lambda 运行时

您可以采用任何编程语言实施 AWS Lambda 运行时。运行时是一个程序,当调用一个 Lambda 函数时,它将运行该函数的处理程序方法。您可以采用可执行文件(名为 bootstrap)的形式将运行时包含在函数的部署程序包中。

运行时负责运行函数的设置代码、从环境变量读取处理程序名称以及从 Lambda 运行时 API 读取调用事件。运行时会将事件数据传递到函数处理程序,并将来自处理程序的响应发布回 Lambda。

您的自定义运行时在标准 Lambda 执行环境中运行。它可以是 Shell 脚本(采用包含在 Amazon Linux 中的语言),也可以是在 Amazon Linux 中编译的二进制可执行文件。

要开始使用自定义运行时,请参阅教程 – 发布自定义运行时。您还可在 GitHub 的 awslabs/aws-lambda-cpp 上了解以 C++ 实现的自定义运行时。

使用自定义运行时

要使用自定义运行时,请将函数的运行时设置为 provided。该运行时可包含在函数的部署程序包中,或包含在中。

例 function.zip

. ├── bootstrap ├── function.sh

如果部署程序包中存在一个名为 bootstrap 的文件,Lambda 将执行该文件。如果不存在,Lambda 将在函数的层中寻找运行时。如果引导文件未找到或不是可执行文件,您的函数在调用后将返回错误。

构建自定义运行时

自定义运行时的入口点是一个名为 bootstrap 的可执行文件。引导文件可以是运行时,也可以调用创建运行时的另一个文件。以下示例使用捆绑版本的 Node.js 在名为 runtime.js 的单独文件中执行 JavaScript 运行时。

例 引导

#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js

您的运行时代码负责完成一些初始化任务。然后,它将在一个循环中处理调用事件,直到它被终止。初始化任务将对函数的每个实例运行一次以准备用于处理调用的环境。

初始化任务

  • 检索设置 – 读取环境变量以获取有关函数和环境的详细信息。

    • _HANDLER – 处理程序的位置(来自函数的配置)。标准格式为 file.method,其中 file 是没有表达式的文件的名称,method 是在文件中定义的方法或函数的名称。

    • LAMBDA_TASK_ROOT – 包含函数代码的目录。

    • AWS_LAMBDA_RUNTIME_API – 运行时 API 的主机和端口。

    有关可用变量的完整列表,请参阅适用于 Lambda 函数的环境变量

  • 初始化函数 – 加载处理程序文件并运行它包含的任何全局或静态代码。函数应该创建静态资源(如开发工具包客户端和数据库连接)一次,然后将它们重复用于多个调用。

  • 处理错误 – 如果出现错误,请调用初始化错误 API 并立即退出。

计入收费的执行时间和超时的初始化计数。当执行触发您的函数的新实例的初始化时,您可以在日志和 AWS X-Ray 跟踪中看到初始化时间。

例 日志

REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB

        X-Ray 跟踪中的初始化时间。

当它运行时,运行时将使用 Lambda 运行时界面来管理传入事件和报告错误。完成初始化任务后,运行时将在一个循环中处理传入事件。

处理任务

  • 获取事件 – 调用下一个调用 API 来获取下一个事件。响应正文包含事件数据。响应标头包含请求 ID 和其他信息。

  • 传播跟踪标头 – 从 API 响应中的 Lambda-Runtime-Trace-Id 标头获取 X-Ray 跟踪标头。使用与要使用的 X-Ray 开发工具包相同的值设置 _X_AMZN_TRACE_ID 环境变量。

  • 创建上下文对象 – 创建一个对象,该对象包含来自环境变量的上下文信息和 API 响应中的标头。

  • 调用函数处理程序 – 将事件和上下文对象传递到处理程序。

  • 处理响应 – 调用调用响应 API 以发布来自处理程序的响应。

  • 处理错误 – 如果出现错误,请调用调用错误 API。

  • 清理 – 释放未使用的资源,将数据发送到其他服务,或在获取下一个事件之前执行其他任务。

您可以在函数的部署程序包中包含运行时,也可以在函数层中单独分配运行时。有关示例演练的信息,请参阅教程 – 发布自定义运行时