你可以用任何编程语言实现AWS Lambda运行时。运行时是一个当Lambda函数被调用时运行该函数的处理方法的程序。你可以在你的函数的部署包中包含一个运行时,其形式是一个名为bootstrap的可执行文件。
运行时负责运行函数代码,从环境变量中读取处理器名称,并从Lambda运行时API中读取调用事件。运行时将事件数据传递给函数处理程序,并将处理程序的响应发回给Lambda。
你的自定义运行时在标准Lambda执行环境中运行。它可以是一个shell脚本,一个包含在Amazon Linux中的语言的脚本,或者一个在Amazon Linux中编译的二进制可执行文件。
要开始使用自定义运行时,请参阅教程—发布自定义运行时。你也可以在GitHub上的awslabs/aws-lambda-cpp探索一个用C++实现的自定义运行时。
要使用自定义的运行时,请将你的函数的运行时设置为provided。该运行时可以包含在你的函数的部署包中,也可以包含在一个层中。
举个例子:
.
├── bootstrap
├── function.sh
如果你的部署包里有一个名为bootstrap的文件,Lambda就会运行这个文件。如果没有,Lambda会在函数的层中寻找一个运行时间。如果没有找到bootstrap文件,或者该文件不可执行,你的函数在调用时就会返回一个错误。
一个自定义运行时的入口点是一个名为 bootstrap 的可执行文件。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的主机和端口。
有关可用变量的完整列表,请参见定义的运行时环境变量。
初始化函数 - 加载处理程序文件并运行它所包含的任何全局或静态代码。函数应该一次性创建静态资源,如SDK客户端和数据库连接,并在多次调用中重复使用。
处理错误 - 如果发生错误,调用初始化错误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
当它运行时,运行时使用Lambda运行时接口来管理传入的事件并报告错误。在完成初始化任务后,运行时在一个循环中处理传入的事件。在你的运行时代码中,依次执行以下步骤。
获取一个事件 - 调用下一个调用API来获取下一个事件。响应主体包含事件数据。响应头包含请求ID和其他信息。
传播追踪头 - 从API响应中的Lambda-Runtime-Trace-Id头中获取X-Ray追踪头。在本地设置_X_AMZN_TRACE_ID环境变量的值。X-Ray SDK使用这个值来连接服务之间的跟踪数据。
创建一个上下文对象 - 用环境变量和API响应中的头信息创建一个对象。
调用函数处理程序 - 将事件和上下文对象传递给处理程序。
处理响应 - 调用调用响应API来发布处理程序的响应。
处理错误 - 如果发生错误,调用调用错误API。
清理 - 释放未使用的资源,将数据发送到其他服务,或在获得下一个事件之前执行其他任务。
你可以将运行时包含在你的函数的部署包中,或者在函数层中单独发布运行时。关于一个例子的演练,见教程–发布一个自定义的运行时。