3、第一个云函数:编写 Hello World 函数、本地调试与日志查看、部署到云端并触发
好,咱们直接动手。别管那些花里胡哨的理论,先跑通一个再说。
这一章的目标很简单:写一个 Hello World 云函数,在本地调通,看看日志,最后部署到云端,再触发它一次。整个过程走下来,你对云函数的开发流程就有个直观感受了。
3.1 初始化项目结构
我个人习惯,每个云函数项目都单独建一个文件夹。这样干净,也好管理。
mkdir hello-world-cloud-function
cd hello-world-cloud-function
npm init -y
嗯,这里要注意:npm init -y 会生成一个默认的 package.json。你打开看看,里面基本是空的。后面我们会往里面加依赖。
接下来,安装云函数开发的核心依赖。我用的是 Node.js 运行时,所以需要装一个云函数 SDK。
npm install @serverless-devs/sdk --save-dev
等等,别急着复制。不同云厂商的 SDK 名字不一样。我这里用的是阿里云函数计算的 @serverless-devs/sdk。如果你用腾讯云,可能是 tencentcloud-sdk-nodejs。原理都一样,别纠结。
3.2 编写 Hello World 函数
在项目根目录下,新建一个 index.js 文件。这是我们的入口文件。
// index.js
'use strict';
exports.handler = function(event, context, callback) {
console.log('Hello World 函数被调用了!');
console.log('接收到的 event:', JSON.stringify(event));
const response = {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
message: 'Hello World! 这是我的第一个云函数。',
timestamp: new Date().toISOString(),
}),
};
callback(null, response);
};
这段代码干了三件事:
- 打印日志,告诉你函数被调用了
- 把传入的 event 参数打印出来(方便调试)
- 返回一个标准的 HTTP 响应
你可能会问:event 和 context 是什么?说白了,event 就是触发函数时传入的数据,比如 HTTP 请求的参数、数据库变更的记录等。context 是运行时的环境信息,比如函数名称、超时时间等。现在先不用深究,后面章节会详细讲。
3.3 本地调试与日志查看
写完了代码,怎么跑起来?本地调试是云函数开发里最常用的手段。我建议你养成习惯:先本地调通,再部署到云端。不然每次改一行代码就部署一次,太浪费时间了。
我用的是 @serverless-devs/s 这个工具。安装一下:
npm install -g @serverless-devs/s
然后在项目根目录下,创建一个 s.yaml 配置文件:
# s.yaml
edition: 1.0.0
name: hello-world-app
access: default
services:
hello-world:
component: devsapp/fc
props:
region: cn-hangzhou
service:
name: hello-world-service
description: '我的第一个云函数服务'
function:
name: hello-world-function
runtime: nodejs14
handler: index.handler
codeUri: ./
配置好之后,在终端运行:
s local invoke
你会看到类似这样的输出:
[2024-01-15T10:30:00.000] [INFO] 开始调用本地函数...
[2024-01-15T10:30:00.001] [INFO] Hello World 函数被调用了!
[2024-01-15T10:30:00.002] [INFO] 接收到的 event: {}
[2024-01-15T10:30:00.003] [INFO] 函数执行成功,返回结果: {"statusCode":200,"headers":{"Content-Type":"application/json"},"body":"{\"message\":\"Hello World! 这是我的第一个云函数。\",\"timestamp\":\"2024-01-15T10:30:00.003Z\"}"}
看到没?日志一行行打印出来了。这就是本地调试的好处——你能实时看到每一行 console.log 的输出。
--debug 参数:s local invoke --debug。这样会输出更详细的运行时信息,包括函数调用的耗时、内存使用等。
3.4 部署到云端
本地调通了,接下来部署到云端。这一步其实很简单:
s deploy
命令执行后,工具会自动打包你的代码,上传到云厂商,创建服务、函数,并分配一个 HTTP 触发器地址。你会看到类似这样的输出:
✔ 部署成功!
- 服务名称: hello-world-service
- 函数名称: hello-world-function
- HTTP 触发器 URL: https://xxxxxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-world-service/hello-world-function/
嗯,这里要注意:部署成功后,你的函数就已经在云端运行了。但默认情况下,它不会自动被调用。你需要手动触发它。
3.5 触发云函数
触发方式有很多种。最直接的方式,就是用浏览器访问那个 HTTP 触发器 URL。
打开浏览器,粘贴那个 URL,回车。你会看到:
{
"message": "Hello World! 这是我的第一个云函数。",
"timestamp": "2024-01-15T10:35:00.000Z"
}
恭喜!你的第一个云函数跑通了。
你也可以用 curl 命令来触发:
curl https://xxxxxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-world-service/hello-world-function/
返回的结果和浏览器里看到的一样。
3.6 查看云端日志
函数跑起来了,但怎么知道它内部发生了什么?日志!
在云厂商的控制台里,找到你的函数,一般都有「日志查询」或「调用日志」的入口。点进去,你会看到每次调用的日志记录。
比如,我刚刚触发了一次,日志里会显示:
2024-01-15T10:35:00.000Z INFO Hello World 函数被调用了!
2024-01-15T10:35:00.001Z INFO 接收到的 event: {"httpMethod":"GET","headers":{...},"queryParameters":{}}
2024-01-15T10:35:00.002Z INFO 函数执行成功,返回结果: {...}
3.7 本章小结
这一章我们走完了云函数开发的完整流程:
- 初始化项目结构
- 编写 Hello World 函数
- 本地调试并查看日志
- 部署到云端
- 通过 HTTP 触发函数
- 查看云端日志
说白了,云函数开发没那么神秘。它就是一个跑在云端的函数,你写代码、调试、部署、触发,和本地开发没什么两样。唯一的区别是,你不用管服务器、不用管运维,云厂商帮你搞定一切。
下一章,我们会深入讲讲云函数的触发方式。HTTP 触发只是其中一种,还有定时触发、对象存储触发、消息队列触发等等。每一种都有它的适用场景。
嗯,先到这里。去动手试试吧,有问题随时回来翻翻这一章。