部署高可用的 AWS 应用,使用 Bastion Access、Transit Gateway 和 Auto Scaling.
抱歉,我需要您提供要翻译的具体文本内容(除了已经给出的 Source 链接外),才能为您进行简体中文翻译。请把文章的正文粘贴在这里,我会按照要求保留格式、代码块和技术术语进行翻译。
Introduction
在本项目中,我构建了一个安全、高可用的 AWS 架构,模拟真实的生产环境。阅读完本指南后,您将了解如何部署:
- 受堡垒机管理的环境
- 私有的、自动伸缩的应用层
- 使用 Transit Gateway 实现的 VPC‑to‑VPC 安全通信
- 端到端的日志记录和 DNS 路由
该架构由两个职责隔离的 VPC、用于私有通信的 Transit Gateway、跨多个可用区的公共和私有子网、用于安全访问的堡垒主机、位于网络负载均衡器后面的自动伸缩组,以及集中式日志/ DNS 路由组成。
VPC 设计
| VPC | 目的 | CIDR 块 |
|---|---|---|
| VPC‑A (bastion‑vpc) | 安全的管理员访问 | 192.168.0.0/16 |
| VPC‑B (app‑vpc) | 高可用、私有的应用层 | 172.32.0.0/16 |
这种分离确保管理员访问与应用环境相互独立。
子网布局
Bastion VPC(仅公共)
| 子网 | CIDR | AZ | 类型 |
|---|---|---|---|
| 公共子网 | 192.168.1.0/24 | us-east-1a | 公共 |
Application VPC
| 子网 | CIDR | AZ | 类型 |
|---|---|---|---|
| 公共子网 | 172.32.1.0/24 | us-east-1a | 公共 |
| 私有子网 A | 172.32.2.0/24 | us-east-1a | 私有 |
| 私有子网 B | 172.32.3.0/24 | us-east-1b | 私有 |
跨多个可用区的私有子网提供高可用性。
互联网连接
- Internet Gateways – 为每个 VPC 创建一个 IGW 并将其附加到相应的 VPC。
- Public route tables – 添加默认路由
0.0.0.0/0 → Internet Gateway。
私有子网的 NAT
- 分配一个弹性 IP。
- 在 Application VPC 的公共子网中创建 NAT 网关。
- 更新私有路由表:
0.0.0.0/0 → NAT Gateway。
Transit Gateway
-
创建一个 Transit Gateway。
-
将两个 VPC(Bastion 和 Application)都附加到 TGW。
-
在每个 VPC 的路由表中,添加一条路由:
- Destination: 另一个 VPC 的 CIDR
- Target: Transit Gateway
这样就不需要 VPC 对等连接,且可获得更好的可扩展性。
安全组
| 安全组 | 入站规则 | 出站规则 |
|---|---|---|
| Bastion SG | SSH (22) 来自您的 IP | 所有流量 |
| Application SG | SSH (22) 来自 Bastion SG HTTP (80) 来自负载均衡器 | 所有流量 |
这些规则强制实施最小特权的网络姿态。
堡垒主机
在 Bastion VPC 公共子网中启动一个 EC2 实例,配置如下:
- 实例类型:
t3.micro - 安全组:Bastion SG
- 绑定弹性 IP
此主机成为环境中唯一的 SSH 入口点。
Golden AMI (Reusable Image)
#!/usr/bin/env bash
sudo apt update -y
sudo apt install -y apache2 git awscli amazon-cloudwatch-agent
sudo systemctl start apache2
sudo systemctl enable apache2
已安装组件
- Apache
- Git
- AWS CLI
- CloudWatch Agent
- SSM Agent(预装在 Amazon Linux 2 上)
停止实例并创建名为 golden-ami 的 AMI。
可观测性
- CloudWatch 日志组 –
/vpc/flowlogs - 为两个 VPC 启用 VPC 流日志,目标为 CloudWatch,并为每个 VPC 使用单独的日志流。
EC2 的 IAM 角色
创建一个 IAM 角色,包含以下内容:
- 受信实体: EC2
- 托管策略:
AmazonSSMManagedInstanceCore - 自定义内联策略: 对特定 S3 存储桶的只读访问(受限存储桶访问)
将此角色附加到所有 EC2 实例,以通过 Session Manager 实现安全的实例管理,无需 SSH 密钥。
S3 配置桶
- 创建一个存储桶(例如
my-app-config-bucket)。 - 启用默认加密。
- 阻止所有公共访问。
- 在此存放应用程序配置文件。
应用部署
启动模板 / 用户数据
#!/usr/bin/env bash
sudo apt install -y git
git clone /var/www/html
systemctl restart apache2
使用 Golden AMI,配置如下:
- 实例类型:
t3.micro - 安全组:Application SG
- IAM 角色:上述创建的角色
自动伸缩组
| 参数 | 值 |
|---|---|
| 最小规模 | 2 |
| 期望容量 | 2 |
| 最大规模 | 4 |
| 子网 | 私有子网 (us-east-1a) 与 私有子网 (us-east-1b) |
| 目标类型 | instance |
| 健康检查 | 已启用 (EC2) |
| 实例保护 | 可选(用于在部署期间避免实例被终止) |
网络负载均衡
- 方案: 面向互联网
- 监听器: TCP
:80→ 目标组(端口 80) - 目标类型: 实例
- 子网: 公网子网(每个可用区的
172.32.1.0/24)
DNS
创建一个 Route 53 记录:
- 类型: CNAME
- 名称:
app.example.com - 值: NLB DNS 名称
验证
- SSH 进入堡垒主机。
- 从堡垒主机,SSH 进入私有 EC2 实例(或使用 Session Manager)。
- 打开浏览器并访问
http://app.example.com。
您应该看到应用程序成功加载。
预期结果
- 应用程序可通过自定义域访问。
- 自动伸缩能够响应流量激增。
- VPC Flow Logs 和应用日志出现在 CloudWatch 中。
经验教训
- 使用 Transit Gateway 与 VPC 对等连接进行安全的 AWS 网络设计。
- 针对加固环境的堡垒机访问模式。
- 在私有子网中部署自动伸缩工作负载。
- 实施可观测性和生产就绪的日志记录。