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 --guided

3.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 deploy

3.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 production

4. 冷启动优化

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: PublishedVersions

SnapStart 目前主要对 Java 有效,Node.js 的冷启动已经比较快了。

5. 和其他平台的对比

维度AWS LambdaCloudflare Workers
冷启动几百 ms ~ 几秒< 5ms
运行时长最长 15 分钟免费 10ms CPU,付费 30s
内存128 MB ~ 10 GB128 MB
区域选定 Region全球边缘自动分发
生态最完整(AWS 全家桶)较小但够用
成本(低流量)免费额度 100 万次/月免费额度 10 万次/天
成本(高流量)按请求 + 执行时间按请求
配置复杂度

Lambda 的优势在生态和灵活性——可以和其他 AWS 服务(DynamoDB、S3、SQS 等)无缝集成,支持更多语言和运行时长。

Workers 的优势在延迟和简单性——全球边缘分发,冷启动几乎为零,配置简单。

6. 适用场景

Lambda 适合:

  1. 已经在用 AWS 的团队:和其他 AWS 服务集成方便
  2. 长时间运行的任务:最长 15 分钟
  3. 需要多语言支持:Python、Java、Go 等
  4. 企业级项目:AWS 的合规性和 SLA

Workers 适合:

  1. 低延迟 API:全球边缘,冷启动快
  2. 轻量级后端:API 网关、请求路由
  3. 个人项目:免费额度够用,配置简单
  4. AI 项目:低延迟对用户体验很重要

7. 小结

AWS Lambda 部署的核心:

  1. Hono 用 @hono/lambda 跑在 Lambda 上
  2. 部署工具:SAM、Serverless Framework、SST
  3. 冷启动是主要问题,可以用 Provisioned Concurrency 缓解
  4. 生态最完整,和 AWS 全家桶无缝集成
  5. 配置复杂度高,学习曲线比 Workers 陡

Lambda 是成熟的 Serverless 平台,适合需要 AWS 生态和灵活性的项目。但对 AI 项目来说,Workers 的低延迟优势通常更重要。

22.07-AWS Lambda部署 - Hono AI 项目知识体系 - AI共学社