大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
观测与 CDN
这一课你将能做到
- 配置 CloudWatch 监控告警,对 CPU、内存、磁盘、自定义业务指标实现实时监控
- 用 CloudFront 加速本站静态资源和 API,并配置 HTTPS 和缓存策略
- 设置 Route53 健康检查和故障转移路由,实现多 Region 容灾
为什么要学
没有监控的系统就像没有仪表盘的飞机,飞得再高也不知道什么时候会坠毁。本站如果迁到 AWS,CloudWatch 是默认监控方案,CloudFront 是全球加速方案,Route53 是 DNS 和故障切换方案。面试中「怎么监控系统」「CDN 怎么配」「DNS 故障切换怎么做」是必问题。
人话:CloudWatch 是 AWS 的「仪表盘」,显示 CPU、内存、请求量、错误率。CloudFront 是「全球快递中转站」,把静态文件放到离用户最近的节点。Route53 是「智能导航」,用户访问你的域名时,自动把他指向最近或最健康的服务器。
先建立图像
AWS 观测体系全景图:
┌─────────────────────────────────────────────────────────────┐
│ 观测与加速体系 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ 监控 │ CDN │ DNS/高可用 │
│ │ │ │
│ CloudWatch │ CloudFront │ Route53 │
│ ├─ Metrics │ ├─ 边缘节点 │ ├─ A/CNAME记录 │
│ ├─ Logs │ ├─ 缓存控制 │ ├─ 健康检查 │
│ ├─ Alarms │ ├─ HTTPS/TLS │ ├─ 故障转移 │
│ └─ Dashboards │ └─ 源站保护 │ └─ 地理路由 │
│ │ │ │
│ X-Ray(链路追踪)│ S3/ALB/API GW │ 多 Region │
└─────────────────┴─────────────────┴─────────────────────────┘
跟着做
步骤 1:安装 CloudWatch Agent 收集系统指标
在 EC2 实例上安装 CloudWatch Agent:
# Amazon Linux 2023
sudo dnf install amazon-cloudwatch-agent -y
配置 amazon-cloudwatch-agent.json:
{
"metrics": {
"namespace": "CodeNav",
"metrics_collected": {
"cpu": {
"measurement": ["cpu_usage_idle", "cpu_usage_iowait", "cpu_usage_user", "cpu_usage_system"],
"metrics_collection_interval": 60
},
"disk": {
"measurement": ["used_percent"],
"metrics_collection_interval": 60,
"resources": ["/"]
},
"memory": {
"measurement": ["mem_used_percent"],
"metrics_collection_interval": 60
}
}
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/home/ec2-user/app.log",
"log_group_name": "code-nav-app",
"log_stream_name": "{instance_id}"
}
]
}
}
}
}
# 启动 Agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
步骤 2:创建 CloudWatch 告警
# CPU 告警(>80% 持续 2 分钟)
aws cloudwatch put-metric-alarm --alarm-name codenav-cpu-high --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average --period 120 --threshold 80 --comparison-operator GreaterThanThreshold --evaluation-periods 2 --dimensions Name=InstanceId,Value=i-xxxxxxxx --alarm-actions arn:aws:sns:ap-southeast-1:123456789012:code-nav-alerts
# 自定义业务指标告警(5XX 错误数)
aws cloudwatch put-metric-alarm --alarm-name codenav-5xx-errors --metric-name 5XXError --namespace AWS/ApplicationELB --statistic Sum --period 60 --threshold 10 --comparison-operator GreaterThanThreshold --evaluation-periods 1 --dimensions Name=LoadBalancer,Value=app/codenav-alb/xxxxxxxx --alarm-actions arn:aws:sns:ap-southeast-1:123456789012:code-nav-alerts
步骤 3:创建 CloudWatch Dashboard
aws cloudwatch put-dashboard --dashboard-name CodeNav-Production --dashboard-body file://dashboard.json
dashboard.json 示例:
{
"widgets": [
{
"type": "metric",
"properties": {
"title": "CPU 使用率",
"metrics": [["AWS/EC2", "CPUUtilization", "InstanceId", "i-xxxxxxxx"]],
"period": 300,
"yAxis": {"left": {"min": 0, "max": 100}}
}
},
{
"type": "metric",
"properties": {
"title": "请求量",
"metrics": [["AWS/ApplicationELB", "RequestCount", "LoadBalancer", "app/codenav-alb/xxxxxxxx"]],
"period": 60
}
}
]
}
步骤 4:创建 CloudFront 分发
# 创建 CloudFront Origin Access Control(OAC)
aws cloudfront create-origin-access-control --origin-access-control-config Name=codenav-oac,Description="CodeNav S3 OAC",SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3
# 创建 CloudFront 分发(源站为 S3)
aws cloudfront create-distribution --origin-domain-name codenav-uploads-2024.s3.ap-southeast-1.amazonaws.com --default-cache-behavior 'ViewerProtocolPolicy=redirect-to-https,CachePolicyId=658327ea-f89d-4fab-a63d-7e88639e58f6' --comment "CodeNav Static Assets" --default-root-object index.html
# 更新 S3 桶策略,只允许 CloudFront OAC 访问
aws s3api put-bucket-policy --bucket codenav-uploads-2024 --policy file://s3-policy.json
s3-policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": {"Service": "cloudfront.amazonaws.com"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::codenav-uploads-2024/*",
"Condition": {
"StringEquals": {"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/xxxxxxxx"}
}
}
]
}
步骤 5:配置 Route53 和 CloudFront 域名
# 创建托管区域(如果还没有)
aws route53 create-hosted-zone --name codenav.io --caller-reference 20241007-1
# 添加 A 记录,指向 CloudFront
aws route53 change-resource-record-sets --hosted-zone-id ZXXXXXXXXXX --change-batch file://route53.json
route53.json:
{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "static.codenav.io",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z2FDTNDATAQYW2",
"DNSName": "xxxxxxxx.cloudfront.net",
"EvaluateTargetHealth": false
}
}
}
]
}
步骤 6:Route53 健康检查与故障转移
# 创建健康检查(检查主 Region ALB)
aws route53 create-health-check --caller-reference 20241007-2 --health-check-config '{
"IPAddress": "1.2.3.4",
"Port": 80,
"Type": "HTTP",
"ResourcePath": "/health",
"FullyQualifiedDomainName": "prod-ap-southeast-1.codenav.io",
"RequestInterval": 30,
"FailureThreshold": 3
}'
# 创建故障转移记录(主 + 备)
aws route53 change-resource-record-sets --hosted-zone-id ZXXXXXXXXXX --change-batch file://failover.json
failover.json:
{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "api.codenav.io",
"Type": "A",
"SetIdentifier": "primary",
"Failover": "PRIMARY",
"HealthCheckId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"AliasTarget": {
"HostedZoneId": "Z1LMS91P8UQ5BY",
"DNSName": "prod-alb-ap-southeast-1.elb.amazonaws.com",
"EvaluateTargetHealth": true
}
}
},
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "api.codenav.io",
"Type": "A",
"SetIdentifier": "secondary",
"Failover": "SECONDARY",
"AliasTarget": {
"HostedZoneId": "Z2FDTNDATAQYW2",
"DNSName": "prod-alb-us-east-1.elb.amazonaws.com",
"EvaluateTargetHealth": true
}
}
}
]
}
讲清楚要点
- CloudWatch Logs Insights:用类似 SQL 的语法查日志,比如
fields @timestamp, @message | filter @message like /ERROR/ | stats count() by bin(5m)。比 grep 强大得多。 - CloudWatch Metrics 的保留期:1 分钟粒度保留 15 天,5 分钟粒度保留 63 天,1 小时粒度保留 455 天。超过 15 个月自动归档到 S3。
- CloudFront 缓存控制:通过 HTTP Header
Cache-Control和Expires控制缓存时间。不常变的资源(如 CSS/JS)设长缓存,API 响应设短缓存或不缓存。 - Route53 路由策略:简单路由(A 记录)、加权路由(A/B 测试)、延迟路由(选最近 Region)、地理位置路由(按国家/地区)、故障转移路由(健康检查)。
- CloudTrail vs CloudWatch:CloudWatch 监控资源和应用指标,CloudTrail 记录 API 调用审计日志。安全事件先看 CloudTrail,性能问题先看 CloudWatch。
你可能会懵的地方
-
CloudWatch 和 Prometheus/Grafana 怎么选? CloudWatch 是 AWS 托管的,开箱即用,适合 AWS 原生环境。Prometheus + Grafana 更灵活,适合混合云和 Kubernetes。本站初期用 CloudWatch,容器化后上 Prometheus。
-
CloudFront 缓存命中率高但某些文件没更新? CloudFront 按 URL 缓存。部署新版本时,给文件名加 hash(如
main.a3f2b1.js),或创建 Invalidation 强制刷新缓存(前 1000 个路径/月免费)。 -
Route53 的 TTL 怎么设? 稳定服务设长 TTL(如 300-3600 秒),减少 DNS 查询。灾备场景设短 TTL(如 60 秒),故障时快速切换。注意:TTL 短会增加 DNS 查询费用。
-
CloudFront 能缓存 API 响应吗? 可以,但通常不缓存动态 API。GET 请求且响应头带
Cache-Control: max-age=300的可以缓存。POST/PUT/DELETE 不缓存。API 缓存用 CloudFront 的「缓存策略」精细控制。 -
X-Ray 是干什么的? X-Ray 是 AWS 的分布式链路追踪服务。请求经过 API Gateway → Lambda → DynamoDB 时,X-Ray 会生成调用链,显示每个阶段的延迟。排查慢请求很有用。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| CloudFront 源站开 S3 桶公开访问 | 任何人都能绕开 CloudFront 直接访问源站 | 用 OAC 或 OAI,S3 桶策略只允许 CloudFront |
| 告警阈值设太低 | 邮件轰炸,狼来了效应 | 根据历史数据设 95 分位值,配合告警抑制 |
| 只监控 CPU 不监控业务指标 | CPU 正常但业务挂了不知道 | 监控请求量、错误率、延迟、自定义业务指标 |
| DNS TTL 设太长 | 故障切换要等很久 | 灾备场景 TTL 设 60-300 秒 |
| CloudWatch Logs 不设保留期 | 日志无限增长,费用爆炸 | 设 7-30 天保留期,重要日志长期归档到 S3 |
卡点急救
- CloudFront 返回 403:OAC 没配置好,或 S3 桶策略没允许 CloudFront。检查 OAC ID 和桶策略里的
AWS:SourceArn是否匹配。 - CloudWatch 没有内存指标:EC2 默认只上报 CPU/网络/磁盘,内存需要装 CloudWatch Agent。检查 Agent 是否运行,配置是否包含
memory。 - Route53 故障转移没生效:健康检查可能不够敏感(间隔太长、失败阈值太高),或者 DNS 缓存导致客户端没刷新。用 dig/nslookup 确认解析结果。
面试常问
-
CloudWatch 和 CloudTrail 的区别? CloudWatch 监控资源性能和应用指标(CPU、内存、请求量),CloudTrail 记录 API 调用审计日志(谁在什么时候做了什么操作)。两者互补,安全和运维都需要。
-
CDN 的缓存刷新策略? 优先用版本化文件名(hash 后缀),避免手动刷新。必须刷新时用 CloudFront Invalidation(前 1000 个路径/月免费),或设置合理的 TTL。Cache-Control 头由源站控制,CloudFront 遵守这个头的指示。
-
Route53 有哪些路由策略? 简单路由、加权路由(流量分配)、基于延迟的路由(选最近 Region)、地理位置路由(按国家/地区定向)、故障转移路由(健康检查 + 主备切换)。混合使用可以实现复杂的多活架构。
自测三问
- CloudFront 缓存动态 API 时需要注意什么?怎么避免缓存了不该缓存的数据?
- Route53 的故障转移路由中,如果主区域 ALB 健康检查失败,DNS 解析结果多久会变?
- CloudWatch 默认不监控 EC2 内存,怎么解决?
小结一句话
CloudWatch 看指标、CloudTrail 查审计、CloudFront 做加速、Route53 管路由和容灾,四者配合构成完整的云上观测与加速体系。
延伸
- AWS CloudWatch 官方文档
- CloudFront 官方文档
- Route53 官方文档
- 下一课:容器服务——学会把本站后端容器化并跑在 ECS/Fargate 上。