部署高可用的 AWS 应用,使用 Bastion Access、Transit Gateway 和 Auto Scaling.

发布: (2026年1月19日 GMT+8 20:00)
6 min read
原文: Dev.to

抱歉,我需要您提供要翻译的具体文本内容(除了已经给出的 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(仅公共)

子网CIDRAZ类型
公共子网192.168.1.0/24us-east-1a公共

Application VPC

子网CIDRAZ类型
公共子网172.32.1.0/24us-east-1a公共
私有子网 A172.32.2.0/24us-east-1a私有
私有子网 B172.32.3.0/24us-east-1b私有

跨多个可用区的私有子网提供高可用性。

互联网连接

  1. Internet Gateways – 为每个 VPC 创建一个 IGW 并将其附加到相应的 VPC。
  2. Public route tables – 添加默认路由 0.0.0.0/0 → Internet Gateway

私有子网的 NAT

  1. 分配一个弹性 IP。
  2. 在 Application VPC 的公共子网中创建 NAT 网关。
  3. 更新私有路由表:0.0.0.0/0 → NAT Gateway

Transit Gateway

  1. 创建一个 Transit Gateway。

  2. 将两个 VPC(Bastion 和 Application)都附加到 TGW。

  3. 在每个 VPC 的路由表中,添加一条路由:

    • Destination: 另一个 VPC 的 CIDR
    • Target: Transit Gateway

这样就不需要 VPC 对等连接,且可获得更好的可扩展性。

安全组

安全组入站规则出站规则
Bastion SGSSH (22) 来自您的 IP所有流量
Application SGSSH (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。

可观测性

  1. CloudWatch 日志组/vpc/flowlogs
  2. 为两个 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 名称

验证

  1. SSH 进入堡垒主机。
  2. 从堡垒主机,SSH 进入私有 EC2 实例(或使用 Session Manager)。
  3. 打开浏览器并访问 http://app.example.com

您应该看到应用程序成功加载。

预期结果

  • 应用程序可通过自定义域访问。
  • 自动伸缩能够响应流量激增。
  • VPC Flow Logs 和应用日志出现在 CloudWatch 中。

经验教训

  • 使用 Transit Gateway 与 VPC 对等连接进行安全的 AWS 网络设计。
  • 针对加固环境的堡垒机访问模式。
  • 在私有子网中部署自动伸缩工作负载。
  • 实施可观测性和生产就绪的日志记录。
Back to Blog

相关文章

阅读更多 »

理解 RASA 中的 RegexEntityExtractor

什么是 RegexEntityExtractor?如果文本匹配预定义的模式,它会被提取为实体。这使得该提取器具有以下特点: - 确定性 - 快速 - 极端…