sammyboy80/AWS-Secure-Web-Infrastructure-with-Terraform
GitHub: sammyboy80/AWS-Secure-Web-Infrastructure-with-Terraform
该项目使用 Terraform 在 AWS 上构建了一个安全、可扩展且高可用的生产级多层 Web 基础设施。
Stars: 0 | Forks: 0
# 使用 Terraform 构建 AWS 安全 Web 基础设施




## 项目概述
本项目演示了如何使用 Terraform 设计和部署安全、可扩展且符合生产级标准的 AWS 云基础设施。
作为一项实操性的 **云工程与 DevOps 作品集项目**,它展示了:
- ✅ 基础设施即代码
- ✅ 高可用架构
- ✅ 安全的 AWS 网络连接
- ✅ 自动伸缩
- ✅ 监控与告警
- ✅ Terraform 远程状态管理
- ✅ AWS 安全最佳实践
## 架构图
“下图展示了跨两个可用区的多层架构”
## VPC
## 子网 (SUBNET)
## ALB
## 自动伸缩组 (AUTO SCALING GROUP)
## EC2 实例
## CloudWatch 告警
## SNS
## TERRAFORM PLAN
## TERRAFORM APPLY
## 遇到的问题:无效的 RDS 主密码
在使用 Terraform 创建 RDS MySQL 实例时,我遇到了以下错误:
```
Error: creating RDS DB Instance (cloud-devops-mysql): operation error RDS: CreateDBInstance, https response error StatusCode: 400, api error InvalidParameterValue: The parameter MasterUserPassword is not a valid password because it is shorter than 8 characters.
```
### 原因
通过 Terraform 变量 `var.db_password` 提供的 RDS 主密码不符合 AWS RDS 的密码要求。AWS 要求主密码长度至少为 8 个字符。由于密码太短,RDS 实例创建失败。
### 解决方案
我通过使用环境变量提供更强的密码来解决此问题,而不是将其硬编码在 Terraform 文件中:
```
export TF_VAR_db_password='!'
```
Terraform 会自动将带有 `TF_VAR_` 前缀的环境变量映射到 Terraform 输入变量中。在这种情况下,`TF_VAR_db_password` 被用作以下变量的值:
```
password = var.db_password
```
### 安全经验教训
我避免了将数据库密码直接存储在 `terraform.tfvars` 中或将其提交到 GitHub。这遵循了更好的 DevSecOps 实践,因为机密信息不应存储在源代码中。
### 关键要点
这个问题帮助我理解到,即使 Terraform 配置在语法上是正确的,但如果未满足云服务提供商 API 的特定服务要求,资源仍然可能会被拒绝。它还强调了机密管理以及在部署前验证云服务限制的重要性。
## 使用的 AWS 服务
| 服务 | 用途 |
|---|---|
| Amazon VPC | 隔离的网络环境 |
| 公有和私有子网 | 分段与安全隔离 |
| Internet Gateway | 提供互联网连接 |
| NAT Gateway | 为私有资源提供安全的出站互联网连接 |
| EC2 | Web 应用服务器 |
| Application Load Balancer (ALB) | 流量分发 |
| Auto Scaling Group (ASG) | 高可用性与弹性伸缩 |
| Launch Templates | 标准化的 EC2 部署 |
| RDS MySQL | 私有的托管型数据库 |
| S3 | 安全的对象存储 |
| IAM Roles & Policies | 最小权限访问控制 |
| CloudWatch | 监控与指标 |
| SNS | 电子邮件告警通知 |
| Terraform S3 Backend | 远程状态管理 |
## 基础设施特性
### 网络
- 具备 CIDR 分段的自定义 VPC
- 跨多个可用区的两个公有子网
- 跨多个可用区的两个私有子网
- 路由表和 Internet Gateway 配置
- 用于私有子网出站流量的 NAT Gateway
### 安全
- 附加到 EC2 实例的 IAM 角色
- 无硬编码的 AWS 凭据
- 私有 RDS 部署 (`publicly_accessible = false`)
- 具有最小权限访问的安全组
- 已启用 S3 公有访问阻止
- 已启用 S3 加密 (AES256)
- 受版本控制保护的 Terraform 远程后端
### 高可用性
- 多可用区子网架构
- 跨公有子网的 Application Load Balancer
- 具有多个 EC2 实例的 Auto Scaling Group
- 与 Target Groups 集成的健康检查
### 监控与告警
- 针对 EC2 CPU 利用率的 CloudWatch 告警
- 针对 RDS CPU 利用率的 CloudWatch 告警
- 针对基础设施告警的 SNS 电子邮件通知
- ALB 目标健康监控
## 快速开始
```
git clone https://github.com/sammyboy80/-AWS-Secure-Web-Infrastructure-with-Terraform.git
cd -AWS-Secure-Web-Infrastructure-with-Terraform
terraform init
terraform plan
terraform apply
```
## 作者
**Bidemi Olawumi**
云安全工程师 | DevSecOps
[GitHub](https://github.com/sammyboy80) · [LinkedIn](https://www.linkedin.com/in/YOUR-PROFILE-URL)
## VPC
## 子网 (SUBNET)
## ALB
## 自动伸缩组 (AUTO SCALING GROUP)
## EC2 实例
## CloudWatch 告警
## SNS
## TERRAFORM PLAN
## TERRAFORM APPLY
## 遇到的问题:无效的 RDS 主密码
在使用 Terraform 创建 RDS MySQL 实例时,我遇到了以下错误:
```
Error: creating RDS DB Instance (cloud-devops-mysql): operation error RDS: CreateDBInstance, https response error StatusCode: 400, api error InvalidParameterValue: The parameter MasterUserPassword is not a valid password because it is shorter than 8 characters.
```
### 原因
通过 Terraform 变量 `var.db_password` 提供的 RDS 主密码不符合 AWS RDS 的密码要求。AWS 要求主密码长度至少为 8 个字符。由于密码太短,RDS 实例创建失败。
### 解决方案
我通过使用环境变量提供更强的密码来解决此问题,而不是将其硬编码在 Terraform 文件中:
```
export TF_VAR_db_password='!'
```
Terraform 会自动将带有 `TF_VAR_` 前缀的环境变量映射到 Terraform 输入变量中。在这种情况下,`TF_VAR_db_password` 被用作以下变量的值:
```
password = var.db_password
```
### 安全经验教训
我避免了将数据库密码直接存储在 `terraform.tfvars` 中或将其提交到 GitHub。这遵循了更好的 DevSecOps 实践,因为机密信息不应存储在源代码中。
### 关键要点
这个问题帮助我理解到,即使 Terraform 配置在语法上是正确的,但如果未满足云服务提供商 API 的特定服务要求,资源仍然可能会被拒绝。它还强调了机密管理以及在部署前验证云服务限制的重要性。
## 使用的 AWS 服务
| 服务 | 用途 |
|---|---|
| Amazon VPC | 隔离的网络环境 |
| 公有和私有子网 | 分段与安全隔离 |
| Internet Gateway | 提供互联网连接 |
| NAT Gateway | 为私有资源提供安全的出站互联网连接 |
| EC2 | Web 应用服务器 |
| Application Load Balancer (ALB) | 流量分发 |
| Auto Scaling Group (ASG) | 高可用性与弹性伸缩 |
| Launch Templates | 标准化的 EC2 部署 |
| RDS MySQL | 私有的托管型数据库 |
| S3 | 安全的对象存储 |
| IAM Roles & Policies | 最小权限访问控制 |
| CloudWatch | 监控与指标 |
| SNS | 电子邮件告警通知 |
| Terraform S3 Backend | 远程状态管理 |
## 基础设施特性
### 网络
- 具备 CIDR 分段的自定义 VPC
- 跨多个可用区的两个公有子网
- 跨多个可用区的两个私有子网
- 路由表和 Internet Gateway 配置
- 用于私有子网出站流量的 NAT Gateway
### 安全
- 附加到 EC2 实例的 IAM 角色
- 无硬编码的 AWS 凭据
- 私有 RDS 部署 (`publicly_accessible = false`)
- 具有最小权限访问的安全组
- 已启用 S3 公有访问阻止
- 已启用 S3 加密 (AES256)
- 受版本控制保护的 Terraform 远程后端
### 高可用性
- 多可用区子网架构
- 跨公有子网的 Application Load Balancer
- 具有多个 EC2 实例的 Auto Scaling Group
- 与 Target Groups 集成的健康检查
### 监控与告警
- 针对 EC2 CPU 利用率的 CloudWatch 告警
- 针对 RDS CPU 利用率的 CloudWatch 告警
- 针对基础设施告警的 SNS 电子邮件通知
- ALB 目标健康监控
## 快速开始
```
git clone https://github.com/sammyboy80/-AWS-Secure-Web-Infrastructure-with-Terraform.git
cd -AWS-Secure-Web-Infrastructure-with-Terraform
terraform init
terraform plan
terraform apply
```
## 作者
**Bidemi Olawumi**
云安全工程师 | DevSecOps
[GitHub](https://github.com/sammyboy80) · [LinkedIn](https://www.linkedin.com/in/YOUR-PROFILE-URL)标签:AWS, DPI, ECS, Terraform, 自动化运维