3、你的第一个 Serverless 函数:从零搭建开发环境
说实话,很多同学学 Serverless 卡住的第一步,不是概念不懂,而是环境没搭起来。
我见过太多人,看了半天文档,结果连一个 Hello World 都没跑通。信心直接归零。
所以这一章,咱们不扯虚的。我带你从零开始,一步步把环境搭好,再亲手部署一个 HTTP 函数。你跟着做就行,保证能跑通。
3.1 安装 CLI:选对工具,事半功倍
不同云厂商都有自己的 CLI 工具。我个人习惯用阿里云的 funcraft,或者腾讯云的 SCF CLI。这里以阿里云为例,因为它的生态比较成熟。
安装命令很简单:
npm install @alicloud/fun -g
嗯,前提是你得有 Node.js 环境。如果没有,先去 nodejs.org 下载一个 LTS 版本。
安装完成后,验证一下:
fun --version
如果看到版本号,说明安装成功。我在项目中遇到过有人装完还是报错,多半是 npm 权限问题。Mac 或 Linux 用户记得加 sudo。
3.2 配置云账号:让 CLI 认识你
CLI 装好了,但它还不知道你是谁。你得告诉它你的云账号信息。
运行:
fun config
它会让你输入几个东西:
- Account ID:你的阿里云账号 ID,在控制台右上角能看到
- Access Key ID 和 Access Key Secret:在 RAM 访问控制里创建
- 默认区域:比如
cn-hangzhou
这里要特别提醒你:Access Key 千万别泄露。我曾经有个同事,不小心把 Key 传到了 GitHub 上,结果被人拿去刷了一晚上服务器,账单直接爆炸。
配置完成后,可以测试一下连通性:
fun deploy --check
如果返回成功,说明账号配置没问题。说白了,这一步就是让 CLI 能代表你调用云资源。
3.3 编写第一个 HTTP 函数
环境通了,咱们来写代码。创建一个新目录,然后初始化一个函数项目:
mkdir my-first-function
cd my-first-function
fun init event-nodejs
这会生成一个模板项目。不过咱们要的是 HTTP 函数,所以稍微改一下。
创建一个 index.js 文件:
module.exports.handler = function(req, resp, context) {
resp.setHeader('Content-Type', 'application/json');
resp.send(JSON.stringify({
message: 'Hello, Serverless!',
timestamp: Date.now()
}));
};
你想想看,这段代码是不是特别简单?就是一个普通的 Node.js 函数。它接收请求,返回 JSON。没有服务器,没有 Nginx,没有 PM2。
然后创建一个 template.yml 文件,描述这个函数:
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
myService:
Type: 'Aliyun::Serverless::Service'
Properties:
Description: '我的第一个服务'
myFunction:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs12
CodeUri: './'
MemorySize: 128
Timeout: 30
Events:
httpTrigger:
Type: HTTP
Properties:
AuthType: ANONYMOUS
Methods: ['GET', 'POST']
这里有几个关键点:
- Handler:指向你的函数入口文件和方法
- Runtime:运行环境,这里用 Node.js 12
- Events:定义触发器,我们用的是 HTTP 触发器
- AuthType:设为 ANONYMOUS 表示允许匿名访问
3.4 部署并测试:见证奇迹的时刻
代码写好了,部署就一行命令:
fun deploy
它会自动打包代码、上传到云端、创建函数和触发器。整个过程大概十几秒。
部署成功后,你会看到一个 HTTP 地址,类似这样:
https://xxxxxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/myService/myFunction/
用浏览器打开这个地址,或者用 curl 测试:
curl https://xxxxxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/myService/myFunction/
如果看到 JSON 响应,恭喜你,第一个 Serverless 函数跑通了!
为什么会这么顺利?因为 Serverless 把底层基础设施全帮你管了。你不用操心服务器、不用配置负载均衡、不用管扩容。你只管写代码。
我记得第一次部署成功时,还挺激动的。以前搭个 Node.js 服务,从买服务器到配环境,怎么也得半天。现在几分钟搞定,而且不用管运维。
3.5 本地调试:别每次都部署
每次改代码都部署一遍,太慢了。咱们可以在本地模拟运行环境。
安装本地模拟器:
fun local start
然后在浏览器访问 http://localhost:8000,就能看到和线上一样的效果。
本地调试的好处是:
- 快速迭代,改完即看效果
- 不消耗云资源,省钱
- 可以断点调试
console.log,本地运行时会在终端输出。线上环境的话,日志会收集到云日志服务里。
3.6 避坑指南:我踩过的那些坑
最后分享几个我实际踩过的坑,你遇到了可以少走弯路:
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 部署超时 | 代码包太大,或者网络不好 | 检查 .funignore,排除 node_modules 等大文件 |
| 函数返回 502 | 代码报错,但没捕获异常 | 加 try-catch,或者查看日志定位问题 |
| 本地调试连不上 | 端口被占用,或者 Docker 没启动 | 检查 Docker 状态,换一个端口试试 |
| Access Key 失效 | Key 过期或者被禁用 | 重新生成 Key,更新配置 |
我曾经有一次,部署了一个函数,怎么调都返回 502。查了半天,发现是代码里引了一个不存在的模块。嗯,这种低级错误,犯过一次就记住了。
好了,这一章的内容就到这里。你跟着做下来,应该已经拥有一个能跑通的 Serverless HTTP 函数了。下一章,咱们会深入讲讲函数的生命周期和运行机制,让你真正理解它背后的原理。