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 基础设施 ![AWS](https://img.shields.io/badge/AWS-Cloud-FF9900?logo=amazon-aws&logoColor=white) ![Terraform](https://img.shields.io/badge/Terraform-IaC-623CE4?logo=terraform&logoColor=white) ![DevSecOps](https://img.shields.io/badge/DevSecOps-Enabled-blue) ![License](https://img.shields.io/badge/license-MIT-green) ## 项目概述 本项目演示了如何使用 Terraform 设计和部署安全、可扩展且符合生产级标准的 AWS 云基础设施。 作为一项实操性的 **云工程与 DevOps 作品集项目**,它展示了: - ✅ 基础设施即代码 - ✅ 高可用架构 - ✅ 安全的 AWS 网络连接 - ✅ 自动伸缩 - ✅ 监控与告警 - ✅ Terraform 远程状态管理 - ✅ AWS 安全最佳实践 ## 架构图 “下图展示了跨两个可用区的多层架构” architecture-diagram ## VPC VPC ## 子网 (SUBNET) VPC Subnets ## ALB ALB ## 自动伸缩组 (AUTO SCALING GROUP) Auto Scaling Group ## EC2 实例 EC2 instances ## CloudWatch 告警 CloudWatch alarms ## SNS SNS ## TERRAFORM PLAN Terraform apply ## TERRAFORM APPLY Terraform Apply ## 遇到的问题:无效的 RDS 主密码 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, 自动化运维