AWS Lambda入门:Node.js实战教程
如果你正在寻找一种无需管理服务器即可运行代码的方式,AWS Lambda 无疑是目前最成熟的无服务器计算平台之一。本教程将带你从零开始,使用 Node.js 构建和部署你的第一个 Lambda 函数,并结合实际场景深入讲解核心概念。
什么是 AWS Lambda?
AWS Lambda 是 AWS 提供的事件驱动型无服务器计算服务。你只需上传代码,Lambda 会自动处理底层基础设施的 provisioning、扩缩容和容错。你按照实际执行时间付费——以 1ms 为最小计费单位。
核心优势:
- 零运维:无需管理服务器、操作系统或运行时环境
- 自动扩缩:从每天几个请求到每秒数千个请求,自动应对
- 按需计费:仅按实际计算时间付费,空闲时不产生费用
- 多语言支持:Node.js、Python、Java、Go、.NET 等
定价概览
AWS Lambda 提供每月 100万次免费请求 和 400,000 GB-秒 的免费计算时间。超出部分:
| 计费项 | 价格 | |--------|------| | 每百万次请求 | $0.20 | | 计算(每GB-秒) | $0.0000166667 | | 128MB 内存,100ms执行 | 约 $0.0000002083 |
环境准备
在开始之前,确保你已具备以下条件:
- AWS 账户:注册 AWS 免费套餐
- Node.js 18.x+:推荐使用 LTS 版本
- AWS CLI:安装并配置
aws configure - AWS SAM CLI(可选):用于本地调试
# 安装 AWS CLI
brew install awscli
# 配置凭证
aws configure
# 输入 Access Key ID、Secret Access Key、Region(如 us-east-1)
# 验证
aws sts get-caller-identity
第一个 Lambda 函数:Hello World
方式一:AWS 控制台创建
- 登录 AWS 管理控制台,导航到 Lambda 服务
- 点击「创建函数」
- 选择「从头开始创作」
- 配置:
- 函数名称:
hello-world - 运行时:Node.js 20.x
- 架构:x86_64
- 执行角色:创建新角色
- 函数名称:
- 点击「创建函数」
方式二:使用代码编写函数
将默认的 index.mjs 替换为以下代码:
export const handler = async (event) => {
console.log('Event:', JSON.stringify(event, null, 2));
return {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
message: 'Hello from AWS Lambda!',
timestamp: new Date().toISOString(),
}),
};
};
点击「部署更改」,然后点击「测试」创建测试事件即可运行。
实战示例:RESTful API 处理器
让我们构建一个更实用的例子——一个处理 CRUD 操作的 API 函数:
// handler.mjs
const users = new Map();
let nextId = 1;
export const handler = async (event) => {
const { httpMethod, path, body, pathParameters } = event;
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
};
try {
switch (httpMethod) {
case 'GET': {
if (pathParameters?.id) {
const user = users.get(pathParameters.id);
if (!user) {
return { statusCode: 404, headers, body: JSON.stringify({ error: 'User not found' }) };
}
return { statusCode: 200, headers, body: JSON.stringify(user) };
}
return {
statusCode: 200,
headers,
body: JSON.stringify(Array.from(users.values())),
};
}
case 'POST': {
const data = JSON.parse(body);
const id = String(nextId++);
const user = { id, ...data, createdAt: new Date().toISOString() };
users.set(id, user);
return { statusCode: 201, headers, body: JSON.stringify(user) };
}
case 'DELETE': {
if (pathParameters?.id) {
users.delete(pathParameters.id);
return { statusCode: 204, headers, body: '' };
}
return { statusCode: 400, headers, body: JSON.stringify({ error: 'Missing user id' }) };
}
default:
return { statusCode: 405, headers, body: JSON.stringify({ error: 'Method not allowed' }) };
}
} catch (error) {
return { statusCode: 500, headers, body: JSON.stringify({ error: error.message }) };
}
};
集成 API Gateway
要让 Lambda 函数通过 HTTP 访问,需要配置 API Gateway:
- 在 Lambda 控制台,点击「添加触发器」
- 选择「API Gateway」
- 选择「创建新 API」→ REST API
- 安全设置选择「开放」(仅用于测试环境)
- 点击「添加」
部署完成后,你将获得一个类似如下的 URL:
https://abc123.execute-api.us-east-1.amazonaws.com/prod/hello-world
使用 SAM 模板部署
对于生产环境,推荐使用基础设施即代码(IaC)方式部署。以下是 SAM 模板示例:
# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: handler.handler
Runtime: nodejs20.x
MemorySize: 256
Timeout: 10
Events:
GetUsers:
Type: Api
Properties:
Path: /users
Method: GET
CreateUser:
Type: Api
Properties:
Path: /users
Method: POST
GetUser:
Type: Api
Properties:
Path: /users/{id}
Method: GET
部署命令:
# 构建
sam build
# 本地测试
sam local start-api
# 部署(首次需要引导)
sam deploy --guided
性能优化技巧
| 优化策略 | 说明 | 效果 |
|----------|------|------|
| 冷启动优化 | 使用 Provisioned Concurrency | 减少 50-90% 冷启动延迟 |
| 内存调优 | 从 128MB 逐步增加到最佳性价比点 | 内存翻倍 → 执行时间减半 |
| 连接复用 | 在 handler 外部初始化数据库连接 | 避免每次调用重建连接 |
| 层(Layers) | 共享依赖打包为 Layer | 减小部署包体积 |
| Node.js ES Modules | 使用 .mjs 格式 | 更快的模块加载速度 |
监控与日志
Lambda 自动与 Amazon CloudWatch 集成:
- 日志:
console.log()输出自动发送到 CloudWatch Logs - 指标:调用次数、错误率、执行时长、并发数
- X-Ray 追踪:启用后可可视化请求链路
// 结构化日志示例
export const handler = async (event) => {
const startTime = Date.now();
try {
const result = await processEvent(event);
console.log(JSON.stringify({
level: 'INFO',
message: 'Request processed',
duration: Date.now() - startTime,
requestId: event.requestContext?.requestId,
}));
return result;
} catch (error) {
console.error(JSON.stringify({
level: 'ERROR',
message: error.message,
stack: error.stack,
}));
throw error;
}
};
注意事项与最佳实践
- 函数要保持无状态:Lambda 实例可能随时被回收,不要依赖本地存储
- 控制部署包大小:精简
node_modules,使用 Webpack/esbuild 打包 - 设置合理的超时:默认 3 秒,最长 15 分钟
- 使用环境变量:敏感信息用 AWS Secrets Manager,配置项用环境变量
- 幂等设计:同一事件可能被重试,确保函数幂等
总结
AWS Lambda + Node.js 是构建现代无服务器应用的高效组合。从简单的 HTTP API 到复杂的事件处理管道,Lambda 都能提供灵活且经济实惠的解决方案。关键在于理解冷启动、内存配置和事件驱动模型这些核心概念。
想要在 AWS 上获得更优的采购价格?通过多云平台购买 AWS 资源,可享受合作伙伴专属折扣,最高节省 25% 的云服务开支。立即访问 duoyun.io 了解详情。