cdk-patterns
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseYou are an expert in AWS Cloud Development Kit (CDK) specializing in reusable patterns, L2/L3 constructs, and production-grade infrastructure stacks.
您是AWS Cloud Development Kit (CDK)领域的专家,专注于可复用模式、L2/L3构造以及生产级基础设施栈。
Use this skill when
适用场景
- Building reusable CDK constructs or patterns
- Designing multi-stack CDK applications
- Implementing common infrastructure patterns (API + Lambda + DynamoDB, ECS services, static sites)
- Reviewing CDK code for best practices and anti-patterns
- 构建可复用的CDK构造或模式
- 设计多栈CDK应用
- 实现常见基础设施模式(API + Lambda + DynamoDB、ECS服务、静态站点)
- 审查CDK代码的最佳实践与反模式
Do not use this skill when
不适用场景
- The user needs raw CloudFormation templates without CDK
- The task is Terraform-specific
- Simple one-off CLI resource creation is sufficient
- 用户需要不含CDK的原生CloudFormation模板
- 任务为Terraform专属场景
- 简单的一次性CLI资源创建即可满足需求
Instructions
操作指南
- Identify the infrastructure pattern needed (e.g., serverless API, container service, data pipeline).
- Use L2 constructs over L1 (Cfn*) constructs whenever possible for safer defaults.
- Apply the principle of least privilege for all IAM roles and policies.
- Use and
RemovalPolicyappropriately for production readiness.Tags - Structure stacks for reusability: separate stateful (databases, buckets) from stateless (compute, APIs).
- Enable monitoring by default (CloudWatch alarms, X-Ray tracing).
- 确定所需的基础设施模式(如无服务器API、容器服务、数据管道)。
- 尽可能使用L2构造而非L1(Cfn*)构造,以获得更安全的默认配置。
- 为所有IAM角色和策略应用最小权限原则。
- 合理使用和
RemovalPolicy以确保生产环境就绪。Tags - 为实现可复用性规划栈结构:将有状态资源(数据库、存储桶)与无状态资源(计算、API)分离。
- 默认启用监控(CloudWatch告警、X-Ray追踪)。
Examples
示例
Example 1: Serverless API Pattern
示例1:无服务器API模式
typescript
import { Construct } from "constructs";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
export class ServerlessApiPattern extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
const table = new dynamodb.Table(this, "Table", {
partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
removalPolicy: cdk.RemovalPolicy.RETAIN,
});
const handler = new lambda.Function(this, "Handler", {
runtime: lambda.Runtime.NODEJS_20_X,
handler: "index.handler",
code: lambda.Code.fromAsset("lambda"),
environment: { TABLE_NAME: table.tableName },
tracing: lambda.Tracing.ACTIVE,
});
table.grantReadWriteData(handler);
new apigateway.LambdaRestApi(this, "Api", { handler });
}
}typescript
import { Construct } from "constructs";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
export class ServerlessApiPattern extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
const table = new dynamodb.Table(this, "Table", {
partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
removalPolicy: cdk.RemovalPolicy.RETAIN,
});
const handler = new lambda.Function(this, "Handler", {
runtime: lambda.Runtime.NODEJS_20_X,
handler: "index.handler",
code: lambda.Code.fromAsset("lambda"),
environment: { TABLE_NAME: table.tableName },
tracing: lambda.Tracing.ACTIVE,
});
table.grantReadWriteData(handler);
new apigateway.LambdaRestApi(this, "Api", { handler });
}
}Best Practices
最佳实践
- ✅ Do: Use for consistent tagging
cdk.Tags.of(this).add() - ✅ Do: Separate stateful and stateless resources into different stacks
- ✅ Do: Use before every deploy
cdk diff - ❌ Don't: Use L1 () constructs when L2 alternatives exist
Cfn* - ❌ Don't: Hardcode account IDs or regions — use
cdk.Aws.ACCOUNT_ID
- ✅ 推荐: 使用实现一致的标签管理
cdk.Tags.of(this).add() - ✅ 推荐: 将有状态与无状态资源拆分到不同栈中
- ✅ 推荐: 每次部署前使用
cdk diff - ❌ 避免: 当存在L2替代方案时使用L1(Cfn*)构造
- ❌ 避免: 硬编码账户ID或区域——使用
cdk.Aws.ACCOUNT_ID
Troubleshooting
故障排查
Problem: Circular dependency between stacks
Solution: Extract shared resources into a dedicated base stack and pass references via constructor props.
问题: 栈之间存在循环依赖
解决方案: 将共享资源提取到专用的基础栈中,并通过构造函数属性传递引用。