后端与接口
用 TypeScript 编写 AWS Lambda…
在创建或部署 TypeScript Lambda 函数时,选择 NestJS 或原生 TypeScript 方案,并优化冷启动、集成 API Gateway/ALB。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 TypeScript 编写 AWS 特定
解决思路
- 根据需求选择方案:NestJS 适合复杂 API、企业应用、需要依赖注入,冷启动 < 500ms、包体 100KB+;原生 TypeScript 适合简单 handler、微服务、最少依赖,冷启动 < 100ms、包体 < 50KB。
- 按方案组织项目结构:NestJS 使用 src/app.module.ts、src/main.ts、src/lambda.ts 入口和 src/modules/api;原生 TypeScript 使用 src/handlers/api.handler.ts、src/services、src/utils 和 dist 编译输出。
- NestJS 入口用 lambda.ts 缓存 serverless 实例:用 NestFactory.create(AppModule, new ExpressAdapter(expressApp)) 初始化,再用 @codegenie/serverless-express 包装,并在 handler 中判断 cachedServer 不存在时才 bootstrap。
- 原生 TypeScript handler 直接导出 async 函数,接收 APIGatewayProxyEvent 和 Context,返回带 statusCode、headers、body 的 APIGatewayProxyResult。
- 冷启动优化:延迟加载重型 import(Lazy Loading)、用 Tree Shaking 移除未用代码、用 esbuild 或 terser 压缩、在多次调用间缓存已初始化的服务实例。
- 连接管理:在模块级别创建客户端并复用,例如在顶层 new DynamoDBClient({ region: process.env.AWS_REGION }),不要在 handler 内每次新建。
- 环境配置:集中到 src/config/env.config.ts,读取 AWS_REGION、TABLE_NAME、DEBUG 等,并对必填变量做校验,缺失时抛错。
- 内存与超时配置:NestJS 起步 512MB、超时 10-30 秒留冷启动缓冲;原生 TypeScript 起步 256MB、超时 3-10 秒。
- 保持 package.json 依赖最小化,生产依赖只放 aws-lambda、@aws-sdk/client-dynamodb 等必要项,devDependencies 放 typescript、esbuild。
- 错误处理:用 try/catch 包裹处理逻辑,成功返回 200 与 JSON body,失败打印错误并返回 500 与结构化错误 JSON。
- 日志使用结构化 JSON,包含 level、message、timestamp 及 context.awsRequestId 等元数据,便于 CloudWatch Insights 查询。
- 部署可用 Serverless Framework(serverless.yml 配置 runtime nodejs20.x、handler dist/handler.handler、http path /{proxy+} method ANY)或 AWS SAM(template.yaml 中 AWS::Serverless::Function 配 CodeUri、Handler、Runtime 和 Api 事件)。
- 部署前检查:运行 npm test、npm run build,确认包体解压后 < 50MB,用 serverless invoke local 或 sam local invoke 本地测试。
- 部署后验证:用 serverless invoke 或 aws lambda invoke 验证执行,用 curl/Postman 测试 API 端点,检查 CloudWatch 日志,确认冷启动时间满足 SLA。
- 注意 Lambda 限制:解压包最大 250MB(压缩 50MB)、内存 128MB-10GB、超时最大 15 分钟、默认并发 1000、环境变量总大小 4KB。
- TypeScript 注意事项:用打包器压缩编译产物,优先 Node.js 20.x,共享依赖放 Lambda Layers,原生模块需针对 Amazon Linux 2 编译。
- 避免常见坑:不要在模块顶层导入重型库、必须打包生产依赖、安装 @types/aws-lambda 获得事件类型、长任务用 context.getRemainingTimeInMillis() 处理超时。
- 安全:不要硬编码凭证,使用 IAM 角色和环境变量;对所有传入事件数据(API Gateway body、S3 对象、SQS 消息体)做校验和清理;使用最小权限 IAM 策略;启用 CloudTrail;日志脱敏。
适用边界 · 注意事项
- 不使用 AWS Lambda 或不需要 serverless 部署时
- 项目不需要 TypeScript 或已使用其他语言/框架时
- 无法使用 AWS 相关服务(API Gateway、ALB、CloudWatch 等)时