AWS CDK 开发:使用 TypeScript 编写 S3+Lambda 的无服务器架构(部署流程)
·
AWS CDK 开发:S3+Lambda 无服务器架构部署流程
1. 环境准备
- 安装 Node.js (建议 v14+)
- 安装 AWS CLI 并配置凭证:
aws configure - 全局安装 CDK:
npm install -g aws-cdk
2. 初始化项目
mkdir s3-lambda-cdk && cd s3-lambda-cdk
cdk init app --language typescript
npm install @aws-cdk/aws-s3 @aws-cdk/aws-lambda
3. 编写架构代码
lib/s3-lambda-cdk-stack.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda';
export class S3LambdaCdkStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 创建 S3 存储桶
const bucket = new s3.Bucket(this, 'MyUploadBucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
// 创建 Lambda 函数
const processor = new lambda.Function(this, 'S3Processor', {
runtime: lambda.Runtime.NODEJS_14_X,
code: lambda.Code.fromAsset('lambda'),
handler: 'index.handler',
environment: { BUCKET_NAME: bucket.bucketName }
});
// 授权 Lambda 访问 S3
bucket.grantReadWrite(processor);
}
}
4. 编写 Lambda 处理函数
lambda/index.ts
import { S3Event } from 'aws-lambda';
export const handler = async (event: S3Event): Promise<void> => {
for (const record of event.Records) {
const bucket = record.s3.bucket.name;
const key = record.s3.object.key;
console.log(`处理新文件: s3://${bucket}/${key}`);
// 添加文件处理逻辑
}
};
5. 编译与部署
# 编译 TypeScript
npm run build
# 生成 CloudFormation 模板
cdk synth
# 部署到 AWS
cdk deploy
6. 验证部署
- 登录 AWS 控制台查看资源:
- S3 存储桶(名称前缀
mystack-myuploadexample) - Lambda 函数(名称含
S3Processor)
- S3 存储桶(名称前缀
- 上传测试文件到 S3 桶
- 在 CloudWatch 查看 Lambda 执行日志
7. 清理资源
cdk destroy
关键配置说明
- 事件触发:如需自动触发 Lambda 响应 S3 事件,添加以下代码到 Stack:
bucket.addEventNotification( s3.EventType.OBJECT_CREATED, new s3n.LambdaDestination(processor) ); - 环境变量:通过
environment属性向 Lambda 传递配置 - 权限控制:使用
grantXXX()方法管理最小权限原则
架构示意图
用户上传文件 → S3存储桶 → (触发事件) → Lambda函数处理 → 输出结果
最佳实践:
- 使用
cdk.removalPolicy.DESTROY仅用于开发环境- 生产环境建议启用 S3 版本控制
- 为 Lambda 配置适当的超时时间和内存大小
更多推荐
所有评论(0)