AWS CDK 建置器
擅長使用 CDK 搭配 TypeScript 建置 AWS 基礎設施,運用 L2/L3 建構與 Well-Architected Framework 模式。
觸發條件
啟用於: "AWS CDK", "CDK construct", "CDK stack", "CDK pipeline", "AWS IaC TypeScript", "L2 construct", "CDK patterns", "cdk deploy", "cdk synth"
不適用於: Terraform IaC → terraform-module-builder | Kubernetes manifests → kubernetes-manifest-generator | Serverless Framework → devops-automator
快速開始
- 初始化 CDK 應用程式 —
npx cdk init app --language typescript - 設計 Stack 結構 — 將有狀態(資料庫、儲存桶)與無狀態(運算、API)分離
- 使用 L2 建構 — 優先使用高層次建構而非 L1 CloudFormation 資源
- 加入 CDK Nag — 自動化的 Well-Architected 合規性檢查
- 使用 CDK Pipelines 部署 — 自我變異的 CI/CD 管道
核心能力
| 領域 | 技術 |
|---|---|
| CDK 核心 | CDK 2.180+, Constructs library, CDK CLI, cdk.json |
| L2/L3 建構 | aws-lambda, aws-apigateway, aws-ecs-patterns, aws-rds |
| 合規性 | cdk-nag (AwsSolutions, NIST, HIPAA, PCI 套件) |
| CI/CD | CDK Pipelines, CodePipeline, CodeBuild, 自我變異 |
| 模式 | ECS Fargate 模式, API Gateway + Lambda, S3 + CloudFront |
架構模式
Stack 組織(有狀態 vs 無狀態)
// bin/app.ts — 具有環境分離的頂層應用程式
const app = new cdk.App();
// 有狀態 Stack — 很少變更,更新時需謹慎
const dataStack = new DataStack(app, 'Data-Prod', {
env: { account: '123456789', region: 'us-east-1' },
});
// 無狀態 Stack — 頻繁部署,可安全銷毀/重建
const apiStack = new ApiStack(app, 'Api-Prod', {
env: { account: '123456789', region: 'us-east-1' },
database: dataStack.database,
bucket: dataStack.bucket,
});
// 管道 Stack — 自我變異的 CI/CD
new PipelineStack(app, 'Pipeline', {
env: { account: '123456789', region: 'us-east-1' },
});
包含最佳實踐的 L2 建構
// lib/api-stack.ts
export class ApiStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: ApiStackProps) {
super(scope, id, props);
const handler = new lambda.Function(this, 'Handler', {
runtime: lambda.Runtime.NODEJS_22_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda/'),
memorySize: 256,
timeout: cdk.Duration.seconds(30),
tracing: lambda.Tracing.ACTIVE, // X-Ray
insightsVersion: lambda.LambdaInsightsVersion.VERSION_1_0_229_0,
environment: {
TABLE_NAME: props.table.tableName,
POWERTOOLS_SERVICE_NAME: 'api', // Lambda Powertools
},
});
props.table.grantReadWriteData(handler); // 最小權限
const api = new apigw.RestApi(this, 'Api', {
deployOptions: {
tracingEnabled: true,
metricsEnabled: true,
throttlingRateLimit: 1000,
throttlingBurstLimit: 500,
},
});
api.root.addResource('items').addMethod('GET',
new apigw.LambdaIntegration(handler));
}
}
CDK Pipelines(自我變異)
來源 (GitHub) → Synth (cdk synth) → 自我變異
│ │
▼ ▼
更新管道 ─── 部署測試環境 ─── 手動核准 ─── 部署正式環境
│ │
整合測試 煙霧測試
反模式
- 到處使用 L1 建構 — 使用
CfnBucket而非s3.Bucket。L2 建構預設即編碼了最佳實踐(加密、日誌記錄、存取控制)。 - 單體式 Stack — 一個 Stack 包含 200 多個資源會達到 CloudFormation 限制並導致部署緩慢。應將有狀態/無狀態 Stack 拆分,並使用跨 Stack 參考。
- 缺少 cdk-nag — 在沒有合規性檢查的情況下部署。應加入
Aspects.of(app).add(new AwsSolutionsChecks())以在部署前捕捉安全性問題。 - 硬編碼帳戶/區域 — 在建構程式碼中使用
account: '123456789'。應使用cdk.jsoncontext 或cdk.Environment查詢以實現可移植性。 - 無快照測試 — CDK 會產生可能意外變更的 CloudFormation 範本。應加入
expect(template).toMatchSnapshot()測試以偵測非預期變更。
品質檢查清單
[ ] Stack 已分離:有狀態(資料)vs 無狀態(運算)
[ ] 使用 L2/L3 建構(非原始 CloudFormation L1)
[ ] 已啟用 cdk-nag 並使用 AwsSolutions 套件
[ ] 所有 Stack 均有快照測試
[ ] 使用 CDK Pipelines 進行自我變異的 CI/CD
[ ] 透過授權方法(grantRead, grantWrite)實現最小權限 IAM
[ ] cdk synth 產生有效的 CloudFormation
[ ] 跨 Stack 參考使用匯出的輸出
[ ] 設定了刪除策略(正式環境資料使用 RETAIN,開發環境使用 DESTROY)
[ ] 透過 Aspects 應用標籤以進行成本分配
[ ] 每次部署前都需審查 cdk diff
[ ] Lambda 函數使用 Powertools 以實現可觀測性