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

小提示: 如果你用的是 Windows,建议用 PowerShell 管理员模式运行。别问我怎么知道的,都是泪。

3.2 配置云账号:让 CLI 认识你

CLI 装好了,但它还不知道你是谁。你得告诉它你的云账号信息。

运行:

fun config

它会让你输入几个东西:

  • Account ID:你的阿里云账号 ID,在控制台右上角能看到
  • Access Key IDAccess Key Secret:在 RAM 访问控制里创建
  • 默认区域:比如 cn-hangzhou

这里要特别提醒你:Access Key 千万别泄露。我曾经有个同事,不小心把 Key 传到了 GitHub 上,结果被人拿去刷了一晚上服务器,账单直接爆炸。

警告: 不要把 Access Key 写死在代码里!用环境变量或者配置文件管理。.gitignore 里记得加上配置文件。

配置完成后,可以测试一下连通性:

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 表示允许匿名访问
重点: 生产环境中别用 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 函数了。下一章,咱们会深入讲讲函数的生命周期和运行机制,让你真正理解它背后的原理。