🚀 Terraform 第22天:在 AWS 上构建安全的两层架构 (EC2 + RDS)
发布: (2025年12月28日 GMT+8 19:39)
3 min read
原文: Dev.to
Source: Dev.to

🧱 架构概览
部署的架构包括:
🌐 Web 层
- 位于公共子网的 EC2 实例
- 通过公共 DNS 访问
- 运行 Flask 应用
- 使用安全组限制入站访问
🗄️ 数据库层
- MySQL RDS 实例
- 部署在私有子网中
- 没有直接的互联网访问
- 仅接受来自 Web 层安全组的流量
🔐 密钥管理
- 数据库用户名和密码动态生成
- 安全存储在 AWS Secrets Manager 中
- EC2 在启动时通过用户数据检索
🧩 Terraform 模块设计
本项目使用自定义 Terraform 模块构建,这是实际生产中的关键实践。
使用的模块:
- VPC 模块 – VPC、公共与私有子网、Internet Gateway、NAT Gateway、路由表
- 安全组模块 – Web SG(HTTP 访问)、DB SG(仅允许来自 Web SG 的 MySQL 访问)
- Secrets 模块 – 随机密码生成、Secrets Manager 存储
- RDS 模块 – MySQL 实例、私有子网部署、凭证从 Secrets Manager 注入
根模块通过在模块之间传递输出,协调所有资源。
🔐 安全凭证处理(关键)
Day 22 中最重要的经验之一:
-
❌ Terraform 代码中不出现凭证
-
❌
variables.tf中不出现凭证 -
❌ 用户数据脚本中不出现凭证
-
✅ 使用
random_password生成密码 -
✅ 存储在 AWS Secrets Manager 中
-
✅ 运行时安全检索
这在真实生产环境中是强制要求。
⚙️ 使用用户数据进行应用部署
EC2 实例通过用户数据来:
- 安装系统依赖
- 安装 Python 和 Flask
- 从 Secrets Manager 获取数据库凭证
- 配置环境变量
- 自动启动 Flask 应用
结果: 基础设施与应用一起部署——全自动化。
🔄 使用的 Terraform 工作流
标准、适用于生产的工作流:
terraform init
terraform plan
terraform apply
注意事项:
- RDS 创建需要时间——属于预期行为
- 输出安全地暴露应用端点
- 测试完成后必须销毁基础设施,以避免产生费用