3、环境搭建:安装 Serverless Framework、配置云平台凭证、创建第一个 Hello World 函数

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上半天出不来。我见过不少团队,光配凭证就折腾了一整天。所以这一章,咱们把基础打牢。

你想想看,Serverless 开发说白了就是「写代码 + 配环境 + 部署」。环境搞不定,后面全是白搭。我个人习惯先把工具链理清楚,再动手写代码。这样心里有底,出问题了也知道从哪查。

3.1 安装 Serverless Framework

Serverless Framework 是目前最主流的 Serverless 开发工具。它帮你屏蔽了不同云厂商的差异,一套代码到处部署。嗯,这里要注意,它和云厂商自己的工具(比如 AWS SAM、阿里云 Funcraft)不是替代关系,而是更高层的抽象。

安装方式很简单,前提是你已经装好了 Node.js(建议 14.x 以上版本)。

# 全局安装 serverless CLI
npm install -g serverless

# 验证安装
serverless --version

# 或者用简写
sls --version

我个人习惯用 sls 这个简写,敲起来快。如果你看到类似 Framework Core: 3.x.x 的输出,说明安装成功了。

小技巧: 如果你在中国大陆,npm 安装可能比较慢。我建议配置淘宝镜像:npm config set registry https://registry.npmmirror.com。我在项目中遇到过因为网络问题导致安装失败的情况,换了镜像后一次搞定。

3.2 配置云平台凭证

安装完工具,下一步就是让它能访问你的云账号。说白了,就是告诉 Serverless Framework:「嘿,我要用这个账号的资源,这是我的钥匙。」

不同云厂商的配置方式略有不同,但核心思路一样——设置密钥对。我以阿里云和 AWS 为例,这两个是我用得最多的。

3.2.1 阿里云凭证配置

你需要先在阿里云控制台创建 AccessKey(访问密钥)。注意,千万别把主账号的 AccessKey 直接用在代码里,风险太大。我建议创建一个 RAM 子账号,只给函数计算(FC)相关的权限。

# 方式一:通过环境变量配置(推荐)
export ALIBABA_CLOUD_ACCESS_KEY_ID=你的AccessKeyId
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=你的AccessKeySecret

# 方式二:通过 serverless 命令配置
sls config credentials --provider aliyun --key 你的AccessKeyId --secret 你的AccessKeySecret
警告: 千万不要把 AccessKey 硬编码在代码里!我曾经见过有人把密钥提交到 GitHub 公开仓库,结果几分钟内就被爬虫扫到,账号被恶意扣费。血的教训。

3.2.2 AWS 凭证配置

AWS 的配置方式类似,但多了区域(region)的概念。我个人习惯用 AWS CLI 来配置,这样其他 AWS 工具也能共用这套凭证。

# 安装 AWS CLI(如果还没装)
pip install awscli

# 配置凭证
aws configure
# 依次输入:
# AWS Access Key ID
# AWS Secret Access Key
# Default region name: us-east-1(或你常用的区域)
# Default output format: json

# 验证配置
aws sts get-caller-identity

如果你不想装 AWS CLI,也可以用环境变量:

export AWS_ACCESS_KEY_ID=你的AccessKeyId
export AWS_SECRET_ACCESS_KEY=你的AccessSecretKey
export AWS_DEFAULT_REGION=us-east-1

3.3 创建第一个 Hello World 函数

环境配好了,咱们来写第一个函数。这一步的意义不在于代码多复杂,而是验证整个链路是否通畅。说白了,就是「跑通流程」。

3.3.1 初始化项目

# 创建一个新的 Serverless 项目
sls create --template hello-world --path my-first-serverless

# 进入项目目录
cd my-first-serverless

这个模板会生成一个最简单的项目结构。你打开看看,里面有一个 serverless.yml 配置文件和一个 handler.js(或 index.py)函数文件。

3.3.2 理解项目结构

咱们来看看核心文件:

my-first-serverless/
├── serverless.yml    # 配置文件,定义函数、触发器、资源
└── handler.js        # 函数代码

serverless.yml 是项目的灵魂。它告诉 Serverless Framework:函数叫什么名字、用什么运行时、部署到哪个区域、触发方式是什么。我刚开始用的时候,总觉得这个文件很啰嗦,后来才发现,它其实把基础设施即代码(IaC)的理念贯彻得很彻底。

3.3.3 编写 Hello World 函数

默认生成的代码已经是一个 Hello World 了。咱们稍微改一下,让它更有个性:

// handler.js
'use strict';

module.exports.hello = async (event) => {
  // 打印事件信息,方便调试
  console.log('Received event:', JSON.stringify(event, null, 2));
  
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Hello from Serverless!',
        timestamp: new Date().toISOString(),
        input: event
      },
      null,
      2
    ),
  };
};

这段代码做了三件事:接收事件、打印日志、返回响应。嗯,这里要注意,console.log 在 Serverless 环境中会输出到云平台的日志服务,是排查问题的利器。

3.3.4 部署到云端

代码写好了,接下来就是见证奇迹的时刻:

# 部署到默认云平台(根据你配置的凭证)
sls deploy

# 如果指定了云平台
sls deploy --provider aliyun

部署完成后,你会看到类似这样的输出:

Service Information
service: my-first-serverless
stage: dev
region: us-east-1
stack: my-first-serverless-dev
functions:
  hello: my-first-serverless-dev-hello
endpoints: (none)

看到 functions 下面有你的函数名,说明部署成功了。这时候,你的函数已经在云端跑起来了。

3.3.5 调用函数验证

部署完了怎么测试?两种方式:

# 方式一:通过 CLI 调用
sls invoke --function hello

# 方式二:本地模拟调用(不需要部署)
sls invoke local --function hello

你应该会看到类似这样的返回:

{
    "statusCode": 200,
    "body": "{\"message\":\"Hello from Serverless!\",\"timestamp\":\"2024-01-15T10:30:00.000Z\",\"input\":{}}"
}
关键点: sls invoke local 是在本地模拟运行,适合快速调试。sls invoke 是调用云端已部署的函数,验证线上环境。我建议开发阶段多用本地调用,减少部署次数,节省时间。

3.4 常见问题与避坑指南

环境搭建这一步,我踩过的坑比写过的代码还多。分享几个最常见的:

  • 凭证配置错误:检查环境变量是否生效,可以用 echo $ALIBABA_CLOUD_ACCESS_KEY_ID 验证。我曾经因为终端没重启,配了半天发现环境变量根本没加载。
  • Node.js 版本不兼容:Serverless Framework 3.x 要求 Node.js 12.x 以上。用 node --version 确认一下。
  • 网络超时:部署时如果卡在 Uploading 阶段,多半是网络问题。试试切换网络或使用代理。
  • 权限不足:如果部署报 AccessDenied,检查你的 AccessKey 是否有对应云服务的权限。我建议一开始给子账号配一个「管理员权限」,跑通了再按需缩小。

好了,到这里你的第一个 Serverless 函数已经成功部署并运行了。虽然只是个 Hello World,但整个流程你已经走通了。下一章,咱们会深入函数的核心概念,看看事件、上下文、返回值这些到底是怎么回事。