使用Terraform CDK构建TypeScript无服务器应用全指南
本文将通过Terraform CDK(TypeScript)构建一个完整的无服务器应用,包含前端React界面和后端API服务。我们将深入解析架构设计、代码实现和部署流程,帮助开发者掌握使用基础设施即代码管理无服务器应用的最佳实践。
前置准备
在开始之前,请确保您已具备以下条件:
- 已安装Terraform CDK(TypeScript版本)
- 配置好AWS CLI访问凭证
- 了解基本的Terraform概念
- 熟悉TypeScript语言
项目架构设计
本示例采用多栈架构设计,将不同功能模块分离到独立的Terraform Stack中,每个Stack拥有独立的状态管理:
前端架构栈(FrontendStack)
- 使用S3存储桶托管静态网站
- 通过CloudFront实现全球CDN加速
- 支持多环境部署(dev/prod)
后端API栈(PostsStack)
- API Gateway作为入口
- Lambda函数处理业务逻辑
- DynamoDB存储数据
- 同样支持多环境部署
预览栈(PreviewStack)
- 预留的集成部署栈
- 可同时部署前后端资源
- 适用于CI/CD预览环境
前端实现详解
前端采用React框架构建,核心基础设施代码位于frontend/index.ts
:
核心资源定义
class Frontend extends Resource {
constructor(scope: Construct, name: string, options: FrontendOptions) {
super(scope, name);
// S3存储桶配置
const bucket = new S3Bucket(this, "bucket", {
website: {
indexDocument: "index.html",
errorDocument: "index.html"
}
});
// CloudFront分发配置
const distribution = new CloudfrontDistribution(this, "distribution", {
defaultCacheBehavior: {
allowedMethods: ["GET", "HEAD"],
cachedMethods: ["GET", "HEAD"],
targetOriginId: "origin",
viewerProtocolPolicy: "redirect-to-https",
forwardedValues: { cookies: { forward: "none" }, queryString: false }
},
enabled: true,
origins: [{
domainName: bucket.websiteEndpoint,
originId: "origin",
customOriginConfig: {
originProtocolPolicy: "http-only",
httpPort: 80,
httpsPort: 443,
originSslProtocols: ["TLSv1.2"]
}
}]
});
}
}
前端部署流程
- 通过Terraform生成环境配置文件(.env.production.local)
- 执行
npm run build
构建React应用 - 使用AWS CLI将构建产物同步到S3存储桶
后端API实现
后端采用Serverless架构,核心代码位于posts
目录:
数据存储层
class PostsStorage extends Resource {
public readonly table: DynamodbTable;
constructor(scope: Construct, name: string) {
super(scope, name);
this.table = new DynamodbTable(this, "table", {
attribute: [{ name: "id", type: "S" }],
hashKey: "id",
billingMode: "PAY_PER_REQUEST"
});
}
}
API服务层
class PostsApi extends Resource {
constructor(scope: Construct, name: string, options: PostsApiOptions) {
super(scope, name);
// Lambda函数定义
const lambda = new LambdaFunction(this, "lambda", {
functionName: `posts-api-${options.environment}`,
runtime: "nodejs14.x",
handler: "index.handler",
environment: {
variables: { DYNAMODB_TABLE_NAME: options.table.name }
},
code: new NodejsFunction(this, "lambda-code", {
path: join(__dirname, "lambda/index.ts")
}).asset
});
// API Gateway配置
const api = new Apigatewayv2Api(this, "api", {
name: `posts-api-${options.environment}`,
protocolType: "HTTP",
target: lambda.arn
});
}
}
Lambda函数实现
Lambda函数处理三类请求:
- GET /posts - 获取文章列表
- GET /posts/:id/detail - 获取文章详情
- POST /posts - 创建新文章
部署流程
- 初始化项目:
cdktf init --local --template=typescript
-
配置AWS凭证环境变量
-
部署基础设施:
cdktf deploy
- 部署前端代码:
cd frontend/code && npm run deploy
最佳实践建议
- 环境隔离:为不同环境(dev/staging/prod)创建独立Stack
- 代码组织:按业务域划分目录结构
- 自动化构建:使用esbuild实现Lambda代码的自动编译
- 最小权限:为Lambda配置精确的IAM权限
- 监控集成:可扩展添加CloudWatch监控
扩展思考
本架构可进一步扩展:
- 添加自定义域名支持
- 实现CI/CD流水线
- 增加自动化测试
- 集成认证服务(Cognito)
- 添加缓存层(ElastiCache)
通过Terraform CDK,我们实现了基础设施的代码化管理,使无服务器应用的部署和维护变得更加高效可靠。这种模式特别适合需要频繁迭代的现代云原生应用开发。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考