wb-platform-engineering-lab/cloud-migration-lab-aws

GitHub: wb-platform-engineering-lab/cloud-migration-lab-aws

一个以 AWS 为目标平台的云迁移实战实验室,通过绞杀榕模式帮助团队逐步将单体应用现代化并掌握云原生架构。

Stars: 1 | Forks: 0

# 云迁移实验室 — AWS ![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg) ![AWS](https://img.shields.io/badge/AWS-Cloud-orange?logo=amazonaws&logoColor=white) ![Terraform](https://img.shields.io/badge/Terraform-1.7+-7B42BC?logo=terraform&logoColor=white) ![Node.js](https://img.shields.io/badge/Node.js-20-339933?logo=nodedotjs&logoColor=white) ![阶段](https://img.shields.io/badge/Phases-13-blue) ![模式](https://img.shields.io/badge/Pattern-Strangler%20Fig-green) ## 从单体到云原生 ## 是什么让这个实验室与众不同 GKE 平台工程实验室从零开始构建一个平台。这个实验室模拟了一次 **真实的迁移** —— 应用程序已经存在、已经有用户、已经有约束,并且无法简单地重写。每个阶段都由真实的业务问题驱动,你使用为解决该问题而设计的 AWS 服务来解决问题。 你将通过需要使用它们的方式来学习 AWS 服务。 ## 我们从哪里开始:单体应用 OrderFlow 是一个基于 Node.js/Express 的应用程序,后端使用 PostgreSQL。所有内容都位于单个仓库和单个可部署单元中: ``` orderflow/ ├── src/ │ ├── routes/ │ │ ├── orders.js # Create, read, update orders │ │ ├── products.js # Product catalog │ │ ├── customers.js # Customer management │ │ └── auth.js # Session-based auth │ ├── models/ # Sequelize ORM models │ ├── services/ │ │ ├── email.js # Sends order confirmations via SMTP │ │ ├── inventory.js # Updates stock counts │ │ └── reports.js # Daily PDF reports (CPU-intensive) │ └── app.js # Express server ├── migrations/ # SQL schema migrations ├── public/ # Static assets (images, JS, CSS) ├── Dockerfile └── package.json ``` OrderFlow 所做的一切 —— 处理订单、认证用户、发送邮件、生成报告、提供图像 —— 都运行在这个单一进程中。一次崩溃会导致全部停止。一个缓慢的报告会阻塞所有 API 请求。一次部署会同时重启所有服务。 **迁移不是重写。它是一系列有针对性的提取和替换,一次解决一个问题。** ## 迁移策略 — 绞杀榕模式 我们不重写单体应用,而是使用 [绞杀榕模式](https://martinfowler.com/bliki/StranglerFigApplication.html):逐步将流量从单体应用路由到新的云原生组件,每次只迁移一个能力,直到单体应用被退役。 ``` flowchart LR subgraph Start["Day 1 — Everything in the monolith"] M1["Node.js monolith\n- Orders API\n- Auth\n- Email\n- Reports\n- Static files\n- Sessions"] end subgraph End["End state — Cloud-native on AWS"] CF["CloudFront\n(static files)"] ALB["ALB"] ECS["ECS — Orders API\n(containerized core)"] LAMBDA["Lambda\n(email, reports)"] RDS["RDS PostgreSQL\n(managed, Multi-AZ)"] ELASTICACHE["ElastiCache\n(sessions)"] S3["S3\n(assets, reports)"] SQS["SQS\n(order events)"] COGNITO["Cognito\n(auth)"] end Start --> End ``` 每个阶段提取一个关注点并使用专门设计的 AWS 服务进行替换。单体会逐渐缩小,平台会逐渐成长。用户除了感觉更快之外不会注意到任何变化。 ## 阶段一览 | 阶段 | 标题 | 构建内容 | 引入的 AWS 服务 | |---|---|---|---| | 0 | 认识单体 | 本地容器化并运行 OrderFlow | Docker, docker-compose | | 1 | AWS 基础 | VPC、IAM、Terraform 状态存储 | VPC、IAM、S3(Terraform 状态)、EC2 | | 2 | 提升并转移 | 将单体应用迁移到 AWS,变更最小 | EC2、RDS、ElastiCache、ALB、Route 53 | | 3 | 容器化与 ECS | 用托管容器替换 EC2 实例 | ECS Fargate、ECR、ALB 目标组 | | 4 | CI/CD 流水线 | 自动化构建、测试和部署 | GitHub Actions、ECR、ECS 滚动部署 | | 5 | 提取静态资源 | 将文件和图片移出单体应用 | S3、CloudFront、预签名 URL | | 6 | 使用 SQS/SNS 实现异步 | 解耦订单事件与请求路径 | SQS、SNS、EventBridge | | 7 | 针对合适问题使用无服务器 | 用 Lambda 替换 CPU 密集型和事件驱动型代码 | Lambda、API Gateway、EventBridge Scheduler | | 8 | 将认证提取到 Cognito | 用基于令牌的认证替换会话认证 | Cognito 用户池、JWT、ALB 认证 | | 9 | EKS — 平台层 | 将核心 API 迁移到 Kubernetes 以支持团队规模 | EKS、Helm、ALB Ingress 控制器 | | 10 | 可观测性 | 所有组件的指标、日志和追踪 | CloudWatch、X-Ray、OpenTelemetry、Grafana | | 11 | 安全加固 | 最小权限、密钥管理、WAF、威胁检测 | Secrets Manager、IAM 策略、WAF、GuardDuty | | 12 | 多环境与结项项目 | 开发/预发布/生产环境的准生产级发布流水线 | AWS Organizations、Terraform 工作区、GitOps | | 13 | 数据平台与 AI | 分析数据湖、实时流处理、需求预测以及生成式 AI 订单助手 | Kinesis、Glue、Athena、QuickSight、Bedrock、Forecast | ## 先决条件 | 工具 | 用途 | |---|---| | `docker` + `docker compose` | 在阶段 0 本地运行单体应用 | | `aws` CLI v2 | 从终端与 AWS 交互 | | `terraform` 1.7+ | 将所有基础设施作为代码配置 | | `kubectl` | 从阶段 9 开始的 Kubernetes 命令行工具 | | `helm` | Kubernetes 包管理器 | | `node` 20 | 本地运行单体应用 | **AWS 账户要求:** - 已启用账单功能的 AWS 账户 - 具有 `AdministratorAccess` 权限的 IAM 用户或 SSO 配置文件(在阶段 11 中范围缩小) - 预估成本:运行资源时每天约 $3–15 — 始终在非工作时段运行 `terraform destroy` **无需事先具备 AWS 经验。** 每个阶段都会在你需要时引入所需服务,并说明其存在的理由。 ## 阶段说明 每个阶段都有独立的文件夹,包含完整的说明、架构图、挑战和成本分解。 | 阶段 | 文件夹 | |---|---| | 0 — 认识单体 | [phase-0-meet-the-monolith/](phase-0-meet-the-monolith/README.md) | | 1 — AWS 基础 | [phase-1-foundations/](phase-1-foundations/README.md) | | 2 — 提升并转移 | [phase-2-lift-and-shift/](phase-2-lift-and-shift/README.md) | | 3 — 容器化与 ECS | [phase-3-ecs/](phase-3-ecs/README.md) | | 4 — CI/CD 流水线 | [phase-4-cicd/](phase-4-cicd/README.md) | | 5 — 提取静态资源 | [phase-5-static-assets/](phase-5-static-assets/README.md) | | 6 — 使用 SQS/SNS 实现异步 | [phase-6-async/](phase-6-async/README.md) | | 7 — 无服务器 | [phase-7-serverless/](phase-7-serverless/README.md) | | 8 — 使用 Cognito 进行认证 | [phase-8-cognito/](phase-8-cognito/README.md) | | 9 — EKS:平台层 | [phase-9-eks/](phase-9-eks/README.md) | | 10 — 可观测性 | [phase-10-observability/](phase-10-observability/README.md) | | 11 — 安全加固 | [phase-11-security/](phase-11-security/README.md) | | 12 — 多环境与结项项目 | [phase-12-capstone/](phase-12-capstone/README.md) | | 13 — 数据平台与 AI | [phase-13-data-ai/](phase-13-data-ai/README.md) | ## AWS 认证路线图 本实验室为所有四项 AWS 关联及专业认证提供实践基础。按顺序尝试 — 每一项都建立在前一项的基础上。 | 认证 | 完成阶段 | 涵盖重点 | |---|---|---| | **AWS 解决方案架构师助理 (SAA-C03)** | 阶段 6 | VPC、EC2、RDS、S3、CloudFront、ECS、Lambda、IAM、Route 53、SQS/SNS | | **AWS 开发助理 (DVA-C02)** | 阶段 8 | CodePipeline、Lambda、X-Ray、DynamoDB、Cognito、API Gateway、ECS | | **AWS 系统运维助理 (SOA-C02)** | 阶段 10 | CloudWatch、Config、Systems Manager、Trusted Advisor、Cost Explorer | | **AWS 解决方案架构师专业 (SAP-C02)** | 阶段 12 | Organizations、Control Tower、多账户、成本优化、迁移策略 | ## 各阶段成本分解 所有价格均为 2026 年 AWS 按需费率(us-east-1`)。成本假设资源全天运行 — 结束时请务必销毁资源。 ### 资源定价参考 | 资源 | 规格 | $/小时 | $/天 | |---|---|---|---| | NAT 网关 | — | $0.045 | $1.08 | | EC2 | t3.small | $0.021 | $0.50 | | EC2 | t3.medium | $0.042 | $1.00 | | RDS PostgreSQL | db.t3.small 多可用区 | $0.068 | $1.63 | | RDS PostgreSQL | db.t3.micro 单可用区 | $0.017 | $0.41 | | ElastiCache Redis | cache.t3.micro | $0.017 | $0.41 | | ALB | — | $0.008 + LCU | ~$0.25 | | ECS Fargate | 0.5 vCPU / 1 GB × 2 个任务 | — | $1.19 | | EKS 控制平面 | — | $0.100 | $2.40 | | EC2 节点 | t3.medium × 2 | $0.042 | $2.00 | | CloudWatch 日志 | ~0.5 GB/天摄入 | — | ~$0.30 | | 托管 Grafana | 1 个活跃用户 | — | $0.30 | | GuardDuty | 小型账户(试用后) | — | ~$1.00 | | WAF Web ACL | — | — | $0.17 | | AWS Config | ~50 个资源 | — | ~$0.20 | ### 各阶段成本表格 | 阶段 | 新增资源 | 移除资源 | 每日净成本 | 累计每日成本 | |---|---|---|---|---| | **0** | 无 — 仅本地 Docker | — | $0 | $0 | | **1** | VPC、2 个 NAT 网关、S3 存储桶、DynamoDB 锁 | — | +$2.20 | **$2.20** | | **2** | 2 个 EC2 t3.small、RDS 多可用区、ElastiCache、ALB、Route 53 | — | +$3.90 | **$6.10** | | **3** | ECS Fargate ×2(0.5 vCPU/1 GB)、ECR | 移除 2 个 EC2 | +$0.20 | **$6.30** | | 4 | ECR 镜像存储(约 5 个镜像) | — | +$0.05 | **$6.35** | | 5 | S3 资源存储桶、CloudFront 分配 | — | +$0.05 | **$6.40** | | 6 | SQS ×3、SNS 主题、DLQ ×3 | — | ~$0(按量免费额度) | **$6.40** | | 7 | Lambda 函数、EventBridge Scheduler | — | ~$0(按量免费额度) | **$6.40** | | 8 | Cognito 用户池 | — | ~$0(MAU 5 万以内免费) | **$6.40** | | 9 | EKS 控制平面、2 个 t3.medium 节点 | 移除 ECS Fargate ×2 | +$3.21 | **$9.60** | | 10 | CloudWatch 日志、托管 Prometheus、托管 Grafana | — | +$0.70 | **$10.30** | | 11 | GuardDuty¹、Config、WAF、Security Hub、Inspector、Secrets Manager | — | +$1.65 | **$11.95** | | 12 | ×3 个环境(开发 + 预发布 + 生产)+ 共享服务 | — | +$22 | **~$34** | | 13 | Kinesis、Glue、Athena、QuickSight、Bedrock、Forecast(一次性训练) | — | +$2.20 | **~$36** | ¹ GuardDuty 有 **30 天免费试用**。阶段 11 期间试用期内每天约 $10.95,试用期后每天约 $11.95。 ### 阶段 12(多账户)成本明细 阶段 12 是成本显著上升的阶段。以下是每个账户的详细分解: | 账户 | 关键资源 | 每日成本 | |---|---|---| | **开发** | 1 个 NAT 网关、EKS、1 个 t3.small 节点、RDS 单可用区 | ~$5 | | **预发布** | 2 个 NAT 网关、EKS、2 个 t3.medium 节点、RDS 多可用区、ElastiCache | ~$10 | | **生产** | 2 个 NAT 网关、EKS、2 个 t3.medium 节点、RDS 多可用区、ElastiCache、WAF | ~$11 | | **共享**(审计 + 日志归档) | GuardDuty、Config、Security Hub、CloudTrail(3 个账户) | ~$5 | | **总计** | | **~$31–35/天** | ### 如果从不销毁的月度成本 这是如果你让所有资源整月运行的成本 — 用作设置账单警报的上限参考。 | 阶段 | 活跃资源 | 月度成本 | |---|---|---| | 1 | VPC + NAT 网关 | ~$66 | | 2 | + EC2、RDS、ElastiCache、ALB | ~$183 | | 3–8 | + ECS、S3、CloudFront、Lambda | ~$192 | | 9 | + EKS、节点(移除 ECS) | ~$288 | | 10 | + 可观测性堆栈 | ~$309 | | 11 | + 安全堆栈 | ~$358 | | 12 | 3 × 环境 | ~$1,000 | | 13 | + 数据湖、Bedrock、QuickSight | ~$1,065 | ### 成本控制检查清单 在开始阶段 1 之前设置以下内容: ``` # 创建账单提醒 - 在成本螺旋上升之前 aws budgets create-budget \ --account-id $(aws sts get-caller-identity --query Account --output text) \ --budget file://budget.json \ --notifications-with-subscribers file://notifications.json # 标记每个资源 - 使 Cost Explorer 有用 # 每个 Terraform 资源应包含: # tags = { Project = "orderflow", Phase = "2", Environment = "dev" } # 阶段完成后销毁 cd phase-X-*/terraform terraform destroy -auto-approve ``` **最昂贵的资源是:NAT 网关。不运行时应立即销毁 — 两个 NAT 网关每年花费 $1,620 什么也不做。始终在非工作时段销毁它们。** **最经济的多天方案:** 完成每个阶段后,仅保留 RDS 运行(使用最便宜的实例并创建最终快照),销毁其他所有内容。下次会话开始时从快照恢复。 ## 仓库结构 ``` cloud-migration-lab-aws/ ├── orderflow/ # The monolith — starting point │ ├── src/ │ ├── Dockerfile │ ├── docker-compose.yml │ └── README.md ├── phase-0-meet-the-monolith/ ├── phase-1-foundations/ │ └── terraform/ ├── phase-2-lift-and-shift/ │ └── terraform/ ├── phase-3-ecs/ │ └── terraform/ ├── phase-4-cicd/ │ └── .github/workflows/ ├── phase-5-static-assets/ ├── phase-6-async/ ├── phase-7-serverless/ ├── phase-8-cognito/ ├── phase-9-eks/ │ └── charts/ ├── phase-10-observability/ ├── phase-11-security/ ├── phase-12-capstone/ ├── phase-13-data-ai/ │ ├── terraform/ # Kinesis, Glue, Athena, Bedrock KB, Forecast │ ├── glue-jobs/ # PySpark ETL scripts │ ├── forecast/ # Dataset export scripts and predictor config │ └── assistant/ # /assistant/ask Lambda handler └── README.md ``` ## 与 GKE 实验室的对比 | | GKE 平台工程实验室 | AWS 云迁移实验室 | |---|---|---| | **起点** | 空仓库 | 现有单体应用 | | **云平台** | Google Cloud Platform | Amazon Web Services | | **主题** | 从零开始构建开发者平台 | 迁移并现代化真实应用 | | **学习模式** | 按阶段引入技术 | 按业务问题引入技术 | | **容器编排** | 从第一天起使用 GKE(Kubernetes) | 先使用 ECS,后在需要时使用 EKS | | **关键技能** | Kubernetes、Helm、ArgoCD、Terraform | AWS 服务广度、迁移模式、成本优化 | | **认证目标** | CKA、CKS | SAA、DVA、SOA、SAP |
标签:AWS, AWS Lab, CPU密集型, Docker, DPI, ECS, Express, GKE, GNU通用公共许可证, Hands-on Lab, IAM, MITM代理, Node.js, PDF报告, PostgreSQL, SMTP, Strangler Fig模式, Terraform, 云迁移, 单体应用迁移, 可扩展架构, 子域名突变, 存储, 安全最佳实践, 安全防御评估, 平台工程, 测试用例, 漏洞利用检测, 生产就绪架构, 网络, 网络安全研究, 自定义脚本, 落地区设计, 计算, 请求拦截, 迁移策略