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. 验证部署
  1. 登录 AWS 控制台查看资源:
    • S3 存储桶(名称前缀 mystack-myuploadexample
    • Lambda 函数(名称含 S3Processor
  2. 上传测试文件到 S3 桶
  3. 在 CloudWatch 查看 Lambda 执行日志
7. 清理资源
cdk destroy

关键配置说明

  1. 事件触发:如需自动触发 Lambda 响应 S3 事件,添加以下代码到 Stack:
    bucket.addEventNotification(
      s3.EventType.OBJECT_CREATED,
      new s3n.LambdaDestination(processor)
    );
    

  2. 环境变量:通过 environment 属性向 Lambda 传递配置
  3. 权限控制:使用 grantXXX() 方法管理最小权限原则

架构示意图

用户上传文件 → S3存储桶 → (触发事件) → Lambda函数处理 → 输出结果

最佳实践

  1. 使用 cdk.removalPolicy.DESTROY 仅用于开发环境
  2. 生产环境建议启用 S3 版本控制
  3. 为 Lambda 配置适当的超时时间和内存大小

更多推荐