如果设置了触发器,则需要使用 s cli fc-event 命令生成事件模版,如命令 s cli fc-event sls 生成 SLS 触发器事件模版。
然后使用 local invoke 命令,进行本地事件函数调试。但是此命令并不会执行 pre-deploy 中的 actions。
我尝试了 s build 命令,发现其也不会执行 pre-deploy,可能 Go 语言并不在 s build 命令的考虑中。这里只能自己编译(省略部分输出结果,用 ... 代替):
$ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o code/main code/main.go
$ s local invoke --event-file event.json
{
"name": "shaouai",
"age": 28,
"department": "IT"
}
...
FC Invoke Start RequestId: a7949507-8b85-4c94-8a6c-69b3c9ae38bc
FC Invoke End RequestId: a7949507-8b85-4c94-8a6c-69b3c9ae38bc
RequestId: a7949507-8b85-4c94-8a6c-69b3c9ae38bc Billed Duration: 238 ms Memory Size: 3933 MB Max Memory Used: 52 MB
FC Local Invoke Result:
{"name":"shaouai","age":28,"department":"IT"}
End of method: invoke
...
$ s instance list
event-handler-builtin-runtime-example-service:
event-handler-builtin-runtime-example-function:
instances:
-
instanceId: c-653b552d-2b4854ab13264043b422
versionId: 0
$ s instance exec c-653b552d-2b4854ab13264043b422 -it /bin/bash
root@sr-653b1a86-8d256d47bda14a5fb15d:/# ls
bin code etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@sr-653b1a86-8d256d47bda14a5fb15d:/# ls code/
go.mod go.sum main main.go
基本信息
请求处理程序分为事件请求处理程序(Event Handler)和 HTTP 请求处理程序(HTTP Handler);其中事件请求由各种事件源触发生成,HTTP 请求则由 HTTP 触发器触发生成。
本文关注 Event Handler。编程语言使用 Go。
Event Handler
内置运行时
示例项目
这是一个使用内置运行时 go1 实现的 Event Handler。
项目结构如下,其中 main.go 实现了 handler,s.yaml 描述云函数的资源、行为:
s.yaml 内容如下:
main.go 内容如下:
HandleRequest
的签名是func (context.Context, InputType) (OutputType, error)
。其中InputType
和OutputType
必须与 encoding/json 标准库兼容。函数计算会使用json.Unmarshal
方法对传入的InputType
进行反序列化,使用json.Marshal
方法对返回的OutputType
进行序列化。本地调试
要调用 Event Handler,首先需要准备事件数据,我这里把事件保存在文件 event.json 中:
如果设置了触发器,则需要使用
s cli fc-event
命令生成事件模版,如命令s cli fc-event sls
生成 SLS 触发器事件模版。然后使用
local invoke
命令,进行本地事件函数调试。但是此命令并不会执行 pre-deploy 中的 actions。我尝试了 s build 命令,发现其也不会执行 pre-deploy,可能 Go 语言并不在 s build 命令的考虑中。这里只能自己编译(省略部分输出结果,用 ... 代替):
第一次请求时,可能需要拉取 go1 运行时的镜像并且创建容器,速度可能会慢点。
关于本地调试,详见 Local 命令。
部署
本地调试好后,可以将函数部署到线上了。
这里介绍使用
s
命令进行部署。因为涉及到本地和远端通信,要先用s config
命令配置密钥。使用
s deploy --use-local -y
命令部署(省略部分输出结果,用 ... 代替):部署后,输出了云函数的信息;我们也可以使用
s info
命令查看云函数信息;也可以在阿里云控制台查看。本地调用云函数
使用
s invoke
命令在本地调用云函数,使用之前的事件数据 event.json:登录实例
可以在阿里云控制台登录实例,也可以在本地登录。如果现在没有实例,可以发起一个请求,让函数计算创建一个实例。
自定义运行时
TBD
自定义容器运行时
TBD
参见