cdk-patterns

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
You 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

操作指南

  1. Identify the infrastructure pattern needed (e.g., serverless API, container service, data pipeline).
  2. Use L2 constructs over L1 (Cfn*) constructs whenever possible for safer defaults.
  3. Apply the principle of least privilege for all IAM roles and policies.
  4. Use
    RemovalPolicy
    and
    Tags
    appropriately for production readiness.
  5. Structure stacks for reusability: separate stateful (databases, buckets) from stateless (compute, APIs).
  6. Enable monitoring by default (CloudWatch alarms, X-Ray tracing).
  1. 确定所需的基础设施模式(如无服务器API、容器服务、数据管道)。
  2. 尽可能使用L2构造而非L1(Cfn*)构造,以获得更安全的默认配置。
  3. 为所有IAM角色和策略应用最小权限原则。
  4. 合理使用
    RemovalPolicy
    Tags
    以确保生产环境就绪。
  5. 为实现可复用性规划栈结构:将有状态资源(数据库、存储桶)与无状态资源(计算、API)分离。
  6. 默认启用监控(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
    cdk.Tags.of(this).add()
    for consistent tagging
  • Do: Separate stateful and stateless resources into different stacks
  • Do: Use
    cdk diff
    before every deploy
  • Don't: Use L1 (
    Cfn*
    ) constructs when L2 alternatives exist
  • 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.
问题: 栈之间存在循环依赖 解决方案: 将共享资源提取到专用的基础栈中,并通过构造函数属性传递引用。