TypeScript 无服务器函数:AWS Lambda 高级应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript 无服务器函数:AWS Lambda 高级应用



无服务器架构已成为构建可扩展且经济高效应用程序的事实标准。AWS Lambda 是实现无服务器函数最流行的服务之一。如果您已经掌握了基本语法和触发器(API Gateway、S3、DynamoDB),那么是时候学习高级技术了。在本文中,我们将探讨使用 TypeScript 专业开发 Lambda 函数的关键方面:从冷启动优化到 VPC 集成以及复杂模式的使用。



1. 冷启动优化与内存管理



冷启动是无服务器应用程序性能的主要敌人。在 TypeScript 中,编译阶段加剧了这个问题。让我们探讨三种主要的应对方法。



1.1. 减小部署包大小

使用 esbuild 进行构建,而不是标准的 tsc。它可以进行 tree-shaking 和代码压缩,将打包大小减少 5-10 倍。以下是 serverless.yml 的配置示例:



plugins:  - serverless-esbuildcustom:  esbuild:    bundle: true    minify: true    sourcemap: false    target: 'node18'    exclude: ['aws-sdk'] # SDK 已存在于 Lambda 环境中


1.2. 使用预置并发

对于延迟敏感的函数(例如处理 API 请求的函数),配置 预置并发。这可以保持指定数量的“热”容器持续运行:



functions:  apiHandler:    handler: src/handler.apiHandler    provisionedConcurrency: 5 # 始终保持 5 个就绪实例


1.3. 优化导入和代码

避免在函数内部使用“重量级”库。例如,不要整体导入 aws-sdk v3,只导入所需的客户端:



// 不好:import * as AWS from 'aws-sdk';// 好:import { DynamoDBClient } from '@aws-sdk/client-dynamodb';import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';


2. 使用 Lambda 层和依赖管理



Lambda 层允许将通用代码和依赖项(例如 ORM、验证器)提取到函数之外。这可以加快部署速度并减小每个单独包的大小。



2.1. 创建包含通用工具函数的层

项目结构可能如下所示:



project/├── layers/│   └── common/│       └── nodejs/│           ├── package.json│           └── node_modules/├── functions/│   ├── createUser.ts│   └── getUser.ts└── serverless.yml


在 serverless.yml 中连接层:



layers:  commonLibs:    path: layers/common    compatibleRuntimes:      - nodejs18.xfunctions:  createUser:    handler: functions/createUser.handler    layers:      - { Ref: CommonLibsLambdaLayer }


2.2. 为层添加类型定义

为了让 TypeScript 能够识别层中的类型,创建一个包含路径映射的 tsconfig.json:



{  "compilerOptions": {    "paths": {      "@common/*": ["layers/common/nodejs/*"]    }  }}


现在可以在函数中这样编写:

import { validateEmail } from '@common/validators';


3. VPC 集成与安全



在 VPC 内部运行的 Lambda 函数会失去对公共互联网的访问权限(除非配置了 NAT 网关)。这对于连接到 RDS、ElastiCache 或私有 API 至关重要。



3.1. 在 VPC 中配置 Lambda

通过 serverless.yml 进行配置:



provider:  vpc:    securityGroupIds:      - sg-12345    subnetIds:      - subnet-abc      - subnet-def

functions: dbHandler: handler: src/db.handler vpc: true # 继承提供商的设置


3.2. 用于连接的“瘦处理器”模式

读

博客

书籍推荐