本文介绍Custom Runtime的背景信息、基本原理、执行环境、配置要求、公共请求头及日志规范,您可以参见这些信息打造属于您的自定义运行环境。
背景信息
Custom Runtime就是自定义的运行环境。基于Custom Runtime您可以实现:
- 定制个性化语言(例如Go、Lua、Ruby)和各种语言的小版本(例如Python 3.7、Node.js 12)的执行环境,打造属于您自己的Runtime。
- 一键迁移现有的Web应用或基于传统开发的Web项目到函数计算平台。
基本原理
Custom Runtime本质上是一个HTTP Server,您只需要搭建一个监听固定端口的HTTP Server,将启动这个Server的命令保存为一个名为bootstrap的文件,最后将该文件和您的代码文件一起打成ZIP包,以该ZIP包作为代码包创建一个Custom Runtime的函数。

执行环境
Custom Runtime对以下语言提供了内置支持,您可以直接创建以下语言的Custom Runtime,无需安装第三方解释器:
- Python 3.7.4及以上版本。
- Node.js 10.16.2及以上版本。
- Open JDK 1.8.0(Open JDK Version 1.8.0_232)。
HTTP Server配置要求
创建HTTP Server时您需要满足以下要求:
- Custom Runtime启动的服务一定要监听
0.0.0.0:9000
或者*:9000
端口。如果您使用127.0.0.1:9000
端口,会导致请求超时,出现以下错误:{"ErrorCode":"FunctionNotStarted","ErrorMessage":"The CA's http server cannot be started:ContainerStartDuration:25000000000. Ping CA failed due to: dial tcp 21.0.5.7:9000: getsockopt: connection refused Logs : 2019-11-29T09:53:30.859837462Z Listening on port 9000\r\n"}
- Custom Runtime的bootstrap文件一定要添加
#!/bin/bash
,否则会出现以下错误:{"ErrorCode":"CAExited","ErrorMessage":"The CA process either cannot be started or exited:ContainerStartDuration:25037266905. CA process cannot be started or exited already: rpc error: code = 106 desc = ContainerStartDuration:25000000000. Ping CA failed due to: dial tcp 21.0.7.2:9000: i/o timeout Logs : 2019-11-29T07:27:50.759658265Z panic: standard_init_linux.go:178: exec user process caused \"exec format error\"
如果您的bootstrap文件没有提供权限,会出现以下错误:
"ErrorCode":"CAFilePermission","ErrorMessage":"The CA process cannot be started due to bootstrap file don't have execute permissions
您可以通过以下方式解决该问题:- 在打包文件前执行
chmod 777 bootstrap
命令。 - 如果您使用的是Windows操作系统,您可以将bootstrap文件修改为UNIX格式。
- 在打包文件前执行
- Connection需要设置为Keep-Alive,请求超时时间需设置在15分钟及以上。示例如下:
//例如Node.js使用express时。 app.timeout = 0; // 永不超时。 app.keepAliveTimeout = 0;
- HTTP Server需要在30秒内启动完毕。
函数计算公共请求头
Custom Runtime从函数计算系统中接收到的请求头如下表所示。如果您需要访问阿里云其他服务,您可能需要用到临时AccessKey的Headers。如果您需要迁移已有的应用,可忽略下文的内容。
Header | 描述 |
---|---|
x-fc-request-id | Request ID。 |
x-fc-access-key-id | 临时AccessKey ID。 |
x-fc-access-key-secret | 临时AccessKey Secret。 |
x-fc-security-token | 临时Security Token。 |
x-fc-function-handler | 函数的Handler,如果Runtime本身就是函数,则该值是没有意义的。 |
x-fc-function-memory | 函数最大能使用的内存。 |
x-fc-function-initializer | Initializer函数的Handler,如果Runtime本身就是函数,则该值是不需要的。 |
x-fc-initialization-timeout | Initializer函数执行的超时时间。 |
x-fc-region | 函数所在的地域。 |
x-fc-account-id | 函数所有者的UID。 |
x-fc-qualifier | 函数调用时指定的服务版本或别名。更多信息,请参见查看执行函数的版本。 |
x-fc-version-id | 函数版本。 |
x-fc-service-name | 函数所在的服务的名字。 |
x-fc-service-logproject | 函配所在服务配置的日志项目。 |
x-fc-service-logstore | 函数所在服务配置的日志仓库。 |
x-fc-control-path | 请求的类型。 |
函数日志格式
推荐您在创建服务时使用日志服务SLS,Custom Runtime中所有输出到终端的日志会被保存到您指定的日志服务中。具体步骤,请参见配置并查看函数日志。
函数计算系统在其他Runtime(除Custom Runtime外)中调用函数时,请求头中包含x-fc-log-type" = "Tail"
,那么返回的响应头包含x-fc-log-result
的内容就是函数执行时候打印的日志,日志大小最大为4 KB。您可以在函数计算控制台函数执行结果中查看该日志。如果您希望在控制台的执行结果中看到Custom Runtime的运行日志,您需要在代码中记录请求开始和结束日志。
内容 | 是否必选 | 代码 |
---|---|---|
启动Runtime | 否
说明 该内容为函数冷启动的标志。
|
FunctionCompute ${runtime} runtime inited. 说明 如果您使用Go开发,
${runtime} 可以为Go自定义,但最好不要使用官方的语言名称,例如Node.js、Python、PHP等。
|
Invoke开始的日志 | 是 | FC Invoke Start RequestId: ${RequestId} |
Invoke结束的日志 | 是 | FC Invoke End RequestId: ${RequestId} |
Initialize开始的日志 | 否
说明 如果是Initializer函数,则需要记录。
|
FC Initialize Start RequestId: ${RequestId} |
Initialize结束的日志 | 否
说明 如果是Initializer函数,则需要记录。
|
FC Initialize End RequestId: ${RequestId} |
$utcdatetime(yyyy-MM-ddTHH:mm:ss.fff) $requestId [$Level] $message
。
示例
您可以参考以下文档打造属于您的Custom Runtime:
更多信息
Custom Runtime的限制信息,请参见资源使用限制。