sammyboy80/aws-terraform-infrastructure
GitHub: sammyboy80/aws-terraform-infrastructure
使用Terraform构建生产级多层AWS安全Web基础设施的完整参考实现,覆盖网络、计算、存储、数据库、监控与权限的端到端部署。
Stars: 0 | Forks: 0
# AWS 安全 Web 基础设施 — Terraform
一个生产级、多层 AWS 基础设施,完全使用 Terraform 作为基础设施即代码 构建。
## 架构
## 构建的基础设施
| 资源 | 详情 |
|---|---|
| VPC | 10.0.0.0/16 — 自定义私有网络 |
| Public Subnet | 10.0.1.0/24 — eu-west-1a |
| Private Subnet | 10.0.2.0/24 — eu-west-1b |
| EC2 | 运行 nginx 的 Ubuntu Web 服务器 |
| RDS | MySQL 8.0 — 私有子网,无公有 IP |
| S3 | 静态资产存储桶 — 无公有访问权限 |
| IAM Role | 最小权限 S3 访问 — 无硬编码凭证 |
| CloudWatch | EC2 和 RDS 的 CPU 警报 |
| SNS | 触发阈值时的电子邮件警报 |
| Remote State | Terraform 状态存储在启用版本控制的 S3 中 |
## 安全设计决策
- RDS 位于私有子网且无公有 IP — 只能通过 EC2 在端口 3306 上进行访问
- EC2 通过带有临时凭证的 IAM 角色访问 S3 — 服务器上未存储任何访问密钥
- 安全组在每一层强制执行最小权限原则
- 阻止所有对 S3 的公有访问
- Terraform 状态远程存储在 S3 中 — 绝不提交至 Git
## 关键架构决策
**为什么选择 EC2 而不是 Lambda?**
具有可预测负载的持久性 Web 服务器更适合 EC2。
对于偶发性工作负载,Lambda 更具成本效益。
**为什么选择 RDS 而不是 DynamoDB?**
具有复杂查询的关系型数据更适合 MySQL。
DynamoDB 更适合大规模键值工作负载。
**为什么选择 IAM Role 而不是 Access Keys?**
角色提供临时的、自动轮换的凭证。
访问密钥是长期有效的机密,容易被泄露。
**在扩大规模时我会添加的内容:**
- Auto Scaling Group 以替代固定的 EC2 实例
- Application Load Balancer 用于流量分发
- CloudFront CDN 用于静态资产交付
- ElastiCache 用于数据库查询缓存
- WAF 用于 Web 应用防火墙保护
## 技术栈
- **云:** AWS (EC2, VPC, RDS, S3, IAM, CloudWatch, SNS)
- **IaC:** Terraform
- **操作系统:** Ubuntu Linux
- **数据库:** MySQL 8.0
- **Web 服务器:** nginx
- **脚本语言:** Bash (User Data)
- **版本控制:** Git / GitHub
## 如何部署
git clone https://github.com/sammyboy80/aws-terraform-infrastructure.git
cd aws-terraform-infrastructure
terraform init
terraform plan
terraform apply
terraform destroy
## 作者
Bidemi Olawumi — 云安全工程师
LinkedIn: https://linkedin.com/in/bidemi-ola
EOF
标签:AWS, CloudWatch, DPI, EC2, EC2, ECS, IaC, IaC, IAM, Nginx, RDS, S3, SNS, Terraform, VPC, Web服务器, 云基础设施, 云监控, 亚马逊云科技, 公有子网, 关系型数据库, 多层架构, 安全组, 应用安全, 报警系统, 无硬编码凭证, 最小权限原则, 漏洞利用检测, 漏洞探索, 状态管理, 生产环境, 私有子网, 网络架构, 解决方案架构, 远程状态, 静态资源托管