經過前面 9 天的建置,我們已經在 AWS 上建立了一個完整的 OTP SaaS 系統。今天我們來回顧整個架構演進歷程,總結我們建立的雲端基礎設施,並分析每個技術選擇背後的考量。
這是一個從 MVP 到生產就緒系統的建置過程。
🌐 Internet
│
┌────▼────┐
│ WAF │ ← Day 8: 安全防護
└────┬────┘
│
┌───────▼───────┐
│ CloudFront │ ← Day 9: APM 監控
│ (Global) │
└───────┬───────┘
│
┌──────────▼──────────┐
│ Application Load │ ← Day 3: 負載均衡
│ Balancer │
└──────────┬──────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌────▼───┐ ┌────▼───┐ ┌────▼───┐
│ECS Task│ │ECS Task│ │ECS Task│ ← Day 4: 容器化
│Fastify │ │Fastify │ │Fastify │
└────┬───┘ └────┬───┘ └────┬───┘
│ │ │
└───────────────┼───────────────┘
│
┌───────────┼───────────┐
│ │ │
┌─────▼────┐ ┌───▼───┐ ┌─────▼─────┐
│ RDS │ │ Redis │ │ X-Ray/ │ ← Day 5: 資料層
│(Postgres)│ │ Cache │ │CloudWatch │ Day 6: 監控
└──────────┘ └───────┘ └───────────┘
天數 | 重點建設 | AWS 服務 | 核心價值 |
---|---|---|---|
Day 1 | 專案初始化 | CDK, IAM | 基礎設施即程式碼 |
Day 2 | VPC 網路架構 | VPC, Subnet, IGW | 安全的網路隔離 |
Day 3 | 負載均衡 | ALB, Target Groups | 高可用性設計 |
Day 4 | 容器部署 | ECS, ECR | 可擴展的運算資源 |
Day 5 | 資料儲存 | RDS, ElastiCache | 持久化與快取 |
Day 6 | 監控告警 | CloudWatch, SNS | 可觀測性建立 |
Day 7 | CI/CD 自動化 | CodePipeline, CodeBuild | 自動化部署流程 |
Day 8 | 安全防護 | WAF, Secrets Manager | 企業級安全 |
Day 9 | 效能監控 | X-Ray, CloudWatch Insights | 應用程式效能管理 |
Day 10 | 架構總結 | 完整系統回顧 | 生產就緒驗證 |
決策理由:
// 我們的 Fastify 應用架構
// apps/kyo-otp-service/src/app.ts
export async function buildApp() {
const app = Fastify({ logger: true });
const otpService = createOtpServiceFromEnv();
// RESTful API 設計
app.post('/api/otp/send', async (req, reply) => {
const parsed = OtpSendSchema.safeParse(req.body);
const result = await otpService.send(parsed.data);
return reply.code(202).send(result);
});
return app;
}
優勢分析:
資料層設計:
// packages/kyo-core/src/index.ts
export interface IOtpService {
send(req: OtpSendRequest): Promise<OtpSendResponse>;
verify(req: OtpVerifyRequest): Promise<OtpVerifyResponse>;
getTemplates(): Promise<Template[]>;
}
// Redis 快取層 + Postgres 持久層
// packages/kyo-core/src/redis.ts
export class RedisCache {
async setOtp(phone: string, code: string, ttl: number) {
await this.client.setex(`otp:${phone}`, ttl, code);
}
async getOtp(phone: string): Promise<string | null> {
return await this.client.get(`otp:${phone}`);
}
}
架構價值:
專案結構:
kyong-saas/
├── apps/ # 應用程式
│ ├── kyo-otp-service/ # 後端 API 服務
│ └── kyo-dashboard/ # 前端管理介面
├── packages/ # 共享套件
│ ├── kyo-core/ # 核心業務邏輯
│ ├── kyo-types/ # 型別定義
│ ├── kyo-ui/ # UI 元件庫
│ └── kyo-config/ # 設定管理
└── infra/ # 基礎設施程式碼
└── cdk/ # AWS CDK 定義
架構優勢:
// Day 8 實作的安全機制
// apps/kyo-otp-service/src/auth.ts
export class JwtAuth {
async verifyToken(token: string): Promise<JwtPayload> {
const secret = await this.getSecret('JWT_SECRET');
return await jwtVerify(token, secret);
}
}
// WAF 規則設定 (Day 8)
const wafRules = [
// 速率限制:每分鐘最多 100 請求
{ type: 'RateLimit', threshold: 100, window: 60 },
// SQL 注入防護
{ type: 'SQLInjection', sensitivity: 'HIGH' },
// XSS 攻擊防護
{ type: 'XSSProtection', sensitivity: 'HIGH' }
];
安全層級:
// Day 9 實作的 APM 系統
// 應用程式效能監控
export class ApplicationMonitoring {
// X-Ray 分散式追蹤
traceRequest(requestId: string, operation: string) {
const segment = AWSXRay.getSegment();
const subsegment = segment.addNewSubsegment(operation);
subsegment.addMetadata('requestId', requestId);
}
// CloudWatch 自定義指標
async publishMetric(name: string, value: number, unit: string) {
await this.cloudwatch.putMetricData({
Namespace: 'Kyo/OTP',
MetricData: [{
MetricName: name,
Value: value,
Unit: unit,
Timestamp: new Date()
}]
}).promise();
}
}
監控維度:
服務類別 | AWS 服務 | 月費用 (USD) | 說明 |
---|---|---|---|
運算 | ECS (2 tasks) | $50 | t3.medium 運算資源 |
儲存 | RDS Postgres | $35 | db.t3.micro 單 AZ |
快取 | ElastiCache | $25 | cache.t3.micro |
網路 | ALB + CloudFront | $20 | 負載均衡 + CDN |
監控 | CloudWatch + X-Ray | $15 | 日誌 + 追蹤 |
安全 | WAF + Secrets Manager | $10 | 防火牆 + 金鑰管理 |
其他 | VPC, Route53 等 | $5 | 基礎服務 |
總計 | $160/月 | 支援 10K 日活用戶 |
ROI 分析:
我們成功幫Kyo-System打造了一個:
這套架構不只是AWS服務練習,更是: