Gondran85/cloudops-finance
GitHub: Gondran85/cloudops-finance
基于 AWS Well-Architected Framework 构建的多层高可用个人理财 Web 应用,用于展示低成本、安全、可观测的云架构最佳实践。
Stars: 0 | Forks: 0
# 🏗️ CloudOps Finance






## 📋 关于本项目
**CloudOps Finance** 是一个个人理财 Web 应用,用户可以在其中记录收入和支出并查看余额。本项目的重点**不在于应用本身**——而是为了展示一种**专业的云架构**:跨两个可用区的高可用性、分层安全、可观测性以及成本治理,所有这些都运行在 AWS 免费套餐之内(或接近免费额度)。
### 🎯 模拟业务问题
一家金融科技公司需要一个具有弹性、安全且几乎零成本的 Web MVP,以便在投资完整产品之前验证用户对预算跟踪功能的需求。
## ✅ 已实现(已构建并验证)
**网络**
- 自定义 VPC(`10.0.0.0/16`),跨 2 个 AZ 的 4 个子网(2 个公有子网,2 个私有子网)
- Internet Gateway、路由表、使用 SG 到 SG 引用的三层 Security Groups(ALB → Web → DB)
- **不使用 NAT Gateway** — 私有实例仅通过 VPC Endpoints 访问 AWS 服务
**计算与部署**
- 跨两个 AZ 的 2 台 EC2 `t3.micro`,位于私有子网中,处于 Application Load Balancer 之后
- 版本化的 Launch Template,强制要求 IMDSv2,**无 SSH 密钥对**,仅通过 SSM Session Manager 访问
- 完全**零接触引导**:不到一分钟即可启动并开始处理流量,无需手动步骤
- 由 Nginx 后的 gunicorn 提供的 Flask 应用,作为 systemd 服务进行管理
- **从 S3 离线安装** Python 依赖项(部署产物模式) — 私有子网中无需访问 PyPI
**数据**
- RDS PostgreSQL `db.t3.micro`(单 AZ、私有、无公有访问权限)
- 凭证存储在 AWS Secrets Manager 中,在运行时通过 EC2 IAM role 读取
- S3 bucket(应用代码 + 预构建的 wheel + 上传文件),私有、已开启版本控制、SSE-S3
**连接(私有)**
- VPC Endpoints:S3(Gateway,免费);SSM、SSMMessages、EC2Messages、Secrets Manager(Interface,已启用 Private DNS)
**可观测性**
- CloudWatch:7 个警报(RDS CPU/存储/连接数,每台实例的 EC2 CPU/状态)+ 一个由 JSON 定义的 dashboard
- SNS 邮件通知;已使用 `set-alarm-state` 进行了端到端的告警到邮件路径测试
**审计与治理**
- 开启日志文件验证的多区域 CloudTrail
- AWS Budgets(3 个阈值)+ Cost Anomaly Detection
## 🔲 计划中 / 路线图(尚未构建)
这些出现在长期的架构愿景中,但**尚未**实现:
- **边缘:** Route 53 (DNS) + CloudFront (CDN) — 尚未配置
- **HTTPS/TLS:** ALB 上的 ACM 证书 — 目前仅支持 HTTP
- **WAF**(托管规则、速率限制) — 尚未配置
- **Lambda** 用于处理 S3 票据上传 — 尚未配置
- **RDS Multi-AZ** — 目前为单 AZ;设计已达到“Multi-AZ 就绪”(一键切换,无需更改应用)
- **基础设施即代码(Terraform)** — 目前通过 Console + 脚本进行配置
- **CI/CD**(GitHub Actions)、**Docker/ECS**、**Cognito**、**Auto Scaling Group** — 未来阶段
## 🛠️ 技术与服务
**云(AWS),已实现:** VPC · EC2 · RDS PostgreSQL · S3 · ALB · IAM · Secrets Manager · VPC Endpoints · CloudWatch · SNS · CloudTrail · AWS Budgets · Shield Standard
**应用:** Python 3.9 · Flask · SQLAlchemy · gunicorn · HTML5 · CSS3
**工具:** Bash · Amazon Linux 2023 · Nginx · Docker(用于密闭的 wheel 构建) · Git · GitHub
## 🏛️ 架构

已实现的**三层、多 AZ 模式**:
- **展示层:** 位于公有子网中的 Application Load Balancer (HTTP)
- **应用层:** 跨两个 AZ 的 2 台 EC2 `t3.micro`,位于私有子网中(无公有 IP,无 SSH)
- **数据层:** RDS PostgreSQL(单 AZ、Multi-AZ 就绪)+ S3
- **私有连接:** 用于 S3、SSM 和 Secrets Manager 的 VPC Endpoints(不使用 NAT Gateway)
- **可观测性:** CloudWatch 警报 + dashboard,SNS 通知
- **审计与治理:** 多区域 CloudTrail、AWS Budgets、Cost Anomaly Detection
📄 详细信息请参阅 [docs/architecture.md](docs/architecture.md)。
## 🚀 如何运行
### 前置条件
- 已启用 MFA 的 AWS 账户
- 已配置 AWS CLI v2
- Docker(用于构建 Python wheel) — CloudShell 即可运行
### 配置(通过 AWS Console + 脚本手动进行)
```
# 1. Clone the repository
git clone https://github.com/Gondran85/cloudops-finance.git
cd cloudops-finance
# 2. Build and upload Python wheels for offline install
./scripts/build-wheels.sh
# 3. Sync application code to S3 (the bootstrap pulls code + wheels from there)
# 4. Create the required VPC Endpoints (S3 Gateway; SSM, SSMMessages,
# EC2Messages, Secrets Manager Interface with Private DNS enabled)
# 5. Launch instances from the Launch Template — scripts/ec2-bootstrap.sh
# runs as user_data and brings each instance up unattended
# 6. Initialize the database schema once
psql -h -U -d cloudops -f scripts/db-init.sql
# 7. Create the CloudWatch dashboard
./iac/create-dashboard.sh
```
详细步骤指南请参阅 [docs/architecture.md](docs/architecture.md)。
### 销毁(重要 — 部分资源在运行期间会产生费用)
ALB 和 Interface VPC Endpoints 按小时计费。在不使用时,请停止 EC2/RDS 并删除 ALB 和 Interface endpoints。请参阅 [docs/demo-teardown-checklist.md](docs/demo-teardown-checklist.md)。
## 📸 证据(截图)
请参阅 [screenshots/](screenshots/) 查看实时 dashboard、通过 ALB 提供的应用、健康的负载均衡器目标、版本化的 Launch Template 以及零接触引导日志。
🎥 **演示视频:** 已录制;链接稍后添加。
## 💰 成本
构建为尽可能在免费套餐内运行。EC2 `t3.micro` 和 RDS `db.t3.micro` 符合免费套餐条件。两项经常性费用是 **ALB**(约 $0.022/小时)和 **Interface VPC Endpoints**(每个约 $0.01/小时)—— 这两者仅在活跃会话期间创建并在之后移除。
📄 关于**预测成本与实际成本**的详细分类和实际案例说明请参阅 [docs/cost-estimate.md](docs/cost-estimate.md)。
## 🛡️ 应用的安全措施(已实现)
- **最小权限 IAM** 实例 role(SSM + S3 读取 + Secrets Manager)
- 对人类用户**强制执行 MFA**;锁定 root 账户
- 用于 EC2 和 RDS 的**私有子网**(无公有 IP)
- **无 SSH** — 仅通过 SSM Session Manager 访问;要求使用 IMDSv2
- 使用 SG 到 SG 引用的**分层 Security Groups**(ALB → Web → DB)
- 用于 DB 凭证的 **Secrets Manager**(代码或环境变量文件中没有机密)
- RDS 和 S3 上的**静态加密**(SSE-S3)
- 开启日志文件验证的**多区域 CloudTrail**
- **AWS Budgets + Cost Anomaly Detection**
计划中(尚未构建):通过 ACM 实现 HTTPS/TLS、WAF 托管规则。
📄 详细信息请参阅 [docs/security.md](docs/security.md)。
## 🏗️ Well-Architected Framework 映射
针对六大支柱的全面审查 —— 包括已实现的功能和存在的差距 —— 请参阅 [docs/well-architected-review.md](docs/well-architected-review.md)。
## 🎓 经验教训
在每个阶段的末尾进行了记录,包括离线依赖项的探索、密闭的 Docker wheel 构建、Nginx 配置修复、Secrets Manager VPC Endpoint、可观测性设置,以及关于预测成本与实际成本的 FinOps 说明。
📄 请参阅 [docs/lessons-learned.md](docs/lessons-learned.md)。
## 🔮 未来改进
- [ ] 将技术栈迁移至 **Terraform** (IaC)
- [ ] 通过 **ACM** + **Route 53** + **CloudFront** 实现 HTTPS
- [ ] 具有托管规则和速率限制的 **WAF**
- [ ] 用于处理 S3 票据的 **Lambda**
- [ ] 用于生产级可用性的 **RDS Multi-AZ**
- [ ] 使用 **GitHub Actions** 的 CI/CD
- [ ] 使用 **Docker** + **ECS Fargate** 进行容器化
- [ ] 用于用户身份验证的 **Cognito**
- [ ] 具有动态策略的 **Auto Scaling Group**
- [ ] 锁定传递依赖项(`requirements-lock.txt`)以实现完全可复现的构建
## 👤 作者
**Jefferson Santos Gondran** — 培训中的 Cloud Engineer | AWS 项目作品集
🔗 [LinkedIn](https://linkedin.com/in/jefferson-santos-2136b2264)
## 📄 许可证
MIT — 请参阅 [LICENSE](LICENSE)。
标签:AWS, DPI, Python, 个人理财, 云计算, 无后门, 测试用例, 规则引擎, 请求拦截, 逆向工具, 高可用架构