22.07-AWS Lambda部署
要点
- AWS Lambda 是最成熟的 Serverless 平台,支持多语言
- Hono 用
@hono/lambda适配器跑在 Lambda 上 - Lambda 的优势:生态完整、和其他 AWS 服务无缝集成
- 劣势:冷启动延迟、配置复杂、成本在高流量下比 Workers 贵
内容
1. Lambda 是什么
AWS Lambda 是亚马逊的 Serverless 计算服务:
用户请求 → API Gateway → Lambda 函数 → 数据库/其他 AWS 服务
| 特性 | 说明 |
|---|---|
| 运行时 | Node.js、Python、Java、Go、.NET、Ruby 等 |
| 执行时长 | 最长 15 分钟 |
| 内存 | 128 MB ~ 10 GB |
| 冷启动 | 几百 ms ~ 几秒 |
| 计费 | 按请求数 + 执行时间 × 内存 |
| 区域 | 选择特定 Region(如 us-east-1) |
2. Hono 在 Lambda 上跑
// terminal
npm install @hono/lambda// src/index.ts
import { Hono } from 'hono'
import { handle } from '@hono/lambda'
const app = new Hono()
app.get('/', (c) => c.text('Hello Hono on Lambda!'))
app.get('/api/users', (c) => c.json({ users: [] }))
export const handler = handle(app)handle() 把 Hono 的 fetch 接口转换成 Lambda 的 handler 格式。
3. 部署工具
Lambda 的部署有几种方式:
3.1 AWS SAM
Serverless Application Model,AWS 官方的框架:
# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: nodejs22.x
Timeout: 30
MemorySize: 256
Resources:
MyApi:
Type: AWS::Serverless::Function
Properties:
Handler: dist/index.handler
CodeUri: .
Events:
Api:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY// terminal
# 构建
sam build
# 本地测试
sam local start-api
# 部署
sam deploy --guided3.2 Serverless Framework
社区最流行的 Serverless 框架:
# serverless.yml
service: my-api
provider:
name: aws
runtime: nodejs22.x
region: ap-northeast-1
functions:
api:
handler: dist/index.handler
events:
- http:
path: /{proxy+}
method: ANY// terminal
# 部署
npx serverless deploy3.3 SST
基于 AWS CDK 的 Serverless 框架,TypeScript 优先:
// stacks/MyStack.ts
import { Api, StackContext, Function } from 'sst/constructs'
export function MyStack({ stack }: StackContext) {
const api = new Api(stack, 'Api', {
defaults: {
function: {
runtime: 'nodejs22.x',
handler: 'src/index.handler',
},
},
routes: {
'GET /': 'src/index.handler',
'GET /api/users': 'src/index.handler',
},
})
stack.addOutputs({
ApiEndpoint: api.url,
})
}// terminal
# 本地开发
npx sst dev
# 部署
npx sst deploy --stage production4. 冷启动优化
Lambda 的冷启动是最常被吐槽的问题。优化方向:
4.1 Provisioned Concurrency
预留并发实例,避免冷启动:
# serverless.yml
functions:
api:
handler: dist/index.handler
provisionedConcurrency: 5 # 预留 5 个实例缺点:预留的实例不管有没有请求都计费。
4.2 减小包体积
// terminal
# 用 esbuild 打包,减小体积
npx esbuild src/index.ts --bundle --platform=node --outfile=dist/index.js --minify包越小,Lambda 解压和启动越快。
4.3 SnapStart
AWS 的 SnapStart 可以缓存初始化后的状态:
# template.yaml
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: java17 # 目前只支持 Java
SnapStart:
ApplyOn: PublishedVersionsSnapStart 目前主要对 Java 有效,Node.js 的冷启动已经比较快了。
5. 和其他平台的对比
| 维度 | AWS Lambda | Cloudflare Workers |
|---|---|---|
| 冷启动 | 几百 ms ~ 几秒 | < 5ms |
| 运行时长 | 最长 15 分钟 | 免费 10ms CPU,付费 30s |
| 内存 | 128 MB ~ 10 GB | 128 MB |
| 区域 | 选定 Region | 全球边缘自动分发 |
| 生态 | 最完整(AWS 全家桶) | 较小但够用 |
| 成本(低流量) | 免费额度 100 万次/月 | 免费额度 10 万次/天 |
| 成本(高流量) | 按请求 + 执行时间 | 按请求 |
| 配置复杂度 | 高 | 低 |
Lambda 的优势在生态和灵活性——可以和其他 AWS 服务(DynamoDB、S3、SQS 等)无缝集成,支持更多语言和运行时长。
Workers 的优势在延迟和简单性——全球边缘分发,冷启动几乎为零,配置简单。
6. 适用场景
Lambda 适合:
- 已经在用 AWS 的团队:和其他 AWS 服务集成方便
- 长时间运行的任务:最长 15 分钟
- 需要多语言支持:Python、Java、Go 等
- 企业级项目:AWS 的合规性和 SLA
Workers 适合:
- 低延迟 API:全球边缘,冷启动快
- 轻量级后端:API 网关、请求路由
- 个人项目:免费额度够用,配置简单
- AI 项目:低延迟对用户体验很重要
7. 小结
AWS Lambda 部署的核心:
- Hono 用
@hono/lambda跑在 Lambda 上 - 部署工具:SAM、Serverless Framework、SST
- 冷启动是主要问题,可以用 Provisioned Concurrency 缓解
- 生态最完整,和 AWS 全家桶无缝集成
- 配置复杂度高,学习曲线比 Workers 陡
Lambda 是成熟的 Serverless 平台,适合需要 AWS 生态和灵活性的项目。但对 AI 项目来说,Workers 的低延迟优势通常更重要。