TL;DR — 用一个晚上从零搭出来:3 个 AWS 区域 + Cloudflare CDN + 域名 + 个人网站。中间踩了不少坑,包括一次把 SSH 配置弄炸然后用 EBS 卷救援。这是我准备 AWS SAA 时的实战笔记。
作为正在备考 AWS SAA 的 CS 学生,我意识到读 Cantrill 课程和刷 Tutorials Dojo 题,远远比不上真实运维一套基础设施。所以决定用一晚上时间,从零搭一个属于自己的小型云架构 —— 多区域、有 CDN、有域名、有监控。
目标是练手以下 SAA 考点:
t3.micro
t3.micro
t3.micro
最初我选了 t3.small,因为想留余量。运行一周后看 CloudWatch,CPU 平均 5%,内存 50%。完全过度配置。
降级到 t3.micro 后省了 47% 成本( → /月),同时性能完全够用。一个良好的实例选型应该:
| 负载 | 建议 |
|---|---|
| 个人轻量服务 | t3.micro / t4g.micro |
| 持续中等流量 | t3.small / t4g.small |
| 计算密集 | c6i / c7g |
| 网络密集 | c6gn |
为什么选这 3 个区域?
| 区域 | 角色 | 原因 |
|---|---|---|
| 🇯🇵 ap-northeast-1 | 主用 | 亚太低延迟(对中文用户) |
| 🇦🇺 ap-southeast-4 | 本地 | 我人在墨尔本时延迟最低 |
| 🇺🇸 us-west-2 | 灾备 | 地理隔离 + 北美定价低 |
三个区域形成主动-主动-灾备架构。任何一个挂掉,业务可继续。
ping -c 10 $TOKYO_IP
# 从墨尔本→Tokyo: ~120ms
# 从墨尔本→Melbourne: ~3ms
# 从墨尔本→Oregon: ~180ms
Linux 默认 TCP 拥塞控制是 cubic。对跨太平洋的高延迟、有丢包的链路来说,这不够好。BBR 是 Google 提出的新算法,对差网络鲁棒得多。
echo 'tcp_bbr' | sudo tee /etc/modules-load.d/bbr.conf
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
在 Tokyo 这台机器实测,单连接下载速度从 ~2 Mbps 提升到 ~15 Mbps。免费的速度优化,何乐不为。
tcp_bbr 内核模块没自动加载。必须创建 /etc/modules-load.d/bbr.conf 才会持久化。我第一次没加,重启后 BBR 静默失败,花了 20 分钟才发现。
t3.micro 只有 1 GB 内存。一次 apt upgrade 就能把它跑满,触发 OOM kill。配 1 GB swap 作为内存的应急气囊:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
实测一次启动多个 Docker 容器时,进程没被 OOM 杀掉,性能稍降但服务正常。
当晚最戏剧性的事故。我尝试用 systemd socket override 给 SSH 加备用端口,结果改错了让 sshd 在握手阶段拒绝所有连接。SSH 整个挂了。
| 救援层级 | 结果 |
|---|---|
| 1. SSH 22 | ❌ kex_exchange_identification 拒绝 |
| 2. EC2 Instance Connect | ❌ 走的也是 sshd,同样失败 |
| 3. SSM Session Manager | ❌ 实例无 IAM Role |
| 4. Serial Console + 密码登录 | ❌ 云镜像默认 ubuntu 用户无密码 |
| 5. GRUB 单用户模式 | ❌ Ubuntu 26.04 GRUB Timeout=0,菜单不显示 |
| 6. EBS 卷救援 | ✅ 成功 |
/dev/sdf 挂到救援机sudo mount /dev/nvme1n1p1 /mnt/broken/dev/sda1(root device name)挂回原实例这次事故的根本原因是缺乏运维救援通道。现在所有实例都附加了 IAM Role + SSM 权限:
IAM Role: EC2-SSM-Access
Policy: AmazonSSMManagedInstanceCore
下次 SSH 出问题,可以直接 SSM Session Manager 进去,不用动 EBS 卷。
注册了一个域名 zhenyuruan.com(用 Cloudflare Registrar,$10/年无加价)。配 DNS 时关键点:
dig zhenyuruan.com +short
104.21.0.139
172.67.128.15
# 返回的是 Cloudflare IP,不是 AWS Tokyo IP ✅
Tokyo 上 nginx 配置要点:
server {
listen 443 ssl;
http2 on;
server_name zhenyuruan.com www.zhenyuruan.com;
ssl_certificate /etc/nginx/ssl/zhenyuruan.crt;
ssl_certificate_key /etc/nginx/ssl/zhenyuruan.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy strict-origin-when-cross-origin;
root /var/www/zhenyuruan.com;
server_tokens off; # 隐藏 nginx 版本
}
证书目前用自签(因为 Cloudflare SSL 模式是 Full,不验证证书链)。未来升级到 Full (strict) 模式时,会改用 Cloudflare Origin Certificate(15 年有效期,免费)。
SSH 配置:
| 资源 | 月费 |
|---|---|
| 3 × t3.micro (Tokyo + Melb + Oregon) | ~$24 |
| 3 × Elastic IP | $0(attached) |
| EBS 24 GB | ~$2.5 |
| 域名 zhenyuruan.com | $0.83 (摊销) |
| Cloudflare CDN | $0 (免费层) |
| 合计 | ~$27/月 |
这一晚学到的 SAA 考点比刷一周题都扎实。如果你也在准备 SAA,建议至少做一遍真实部署 —— 哪怕只跑 t3.micro 一台。理论 + 实战才是完整学习。
© 2026 ZR · ~/zr