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 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
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,但整个流程你已经走通了。下一章,咱们会深入函数的核心概念,看看事件、上下文、返回值这些到底是怎么回事。