AWS Resilience Hub 新一代实测:AI 帮你做弹性评估,单点故障藏不住了
AWS Resilience Hub 新一代实测:AI 帮你做弹性评估,单点故障藏不住了
去年有个微服务挂了 40 分钟。事后复盘发现问题不复杂——一个 Redis 集群没开跨 AZ 副本,单个可用区故障直接把缓存层干翻了。
这种单点故障其实一直在那里,只是没人系统性地去查。手工做架构评审?太慢了,而且容易遗漏。
亚马逊云科技的 Resilience Hub 最近升级了一版,加入了生成式 AI 能力。简单说就是:AI 帮你扫描架构,找出弹性短板,给出具体修复建议。我用它跑了一遍我们的订单服务,确实揪出来几个之前没注意到的问题。
Resilience Hub 是干什么的
先给没用过的同学补个背景。
AWS Resilience Hub 是一个弹性评估工具。核心逻辑是:
- 你告诉它你的 RTO/RPO 目标(恢复时间/恢复点目标)
- 它自动扫描你的架构资源和配置
- 出一份弹性评估报告,告诉你哪里不达标
举个例子:你说"这个服务 RTO 要 5 分钟"。Resilience Hub 一扫发现你的 RDS 没开 Multi-AZ,故障恢复时间远超 5 分钟。它就会标红告诉你不达标,并给出建议。
新版本加了什么 AI 能力
这次升级引入的 AI 功能主要有三块:
1. 自然语言描述架构
以前你得手动选 CloudFormation Stack 或者 Resource Group 来导入资源。现在可以用自然语言描述你的应用架构,AI 自动识别相关资源和依赖关系。
比如你说:"我有一个订单服务,前端 ALB + ECS Fargate,后端 Aurora PostgreSQL + ElastiCache Redis,消息队列用 SQS"。AI 会自动关联这些资源并建立依赖图。
2. AI 生成修复建议
以前的建议比较模板化——"建议开启 Multi-AZ"。现在 AI 给的建议具体到配置级别,甚至给出 CLI 命令。
3. 弹性分数持续监控
不是评估一次就完事了。AI 会持续监控你的架构变化,弹性分数下降时主动告警。新部署一个单 AZ 的组件进来,它能马上发现。
实操:给订单服务做弹性评估
第一步:创建应用
# 创建 Resilience Hub 应用
aws resiliencehub create-app \
--name "order-service-prod" \
--description "生产环境订单微服务" \
--region us-east-1
返回 App ARN,后面的操作都基于它:
{
"app": {
"appArn": "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "order-service-prod",
"status": "Active"
}
}
第二步:定义弹性策略
弹性策略定义了不同故障类型下的 RTO/RPO 目标:
aws resiliencehub create-resiliency-policy \
--policy-name "production-critical" \
--tier "Critical" \
--policy '{
"AZ": {"rtoInSecs": 300, "rpoInSecs": 60},
"Hardware": {"rtoInSecs": 3600, "rpoInSecs": 300},
"Region": {"rtoInSecs": 86400, "rpoInSecs": 3600},
"Software": {"rtoInSecs": 600, "rpoInSecs": 300}
}' \
--region us-east-1
这里我设的是:
- AZ 故障:5 分钟恢复,1 分钟数据丢失
- 硬件故障:1 小时恢复,5 分钟数据丢失
- 区域故障:24 小时恢复,1 小时数据丢失
- 软件故障:10 分钟恢复,5 分钟数据丢失
根据业务 SLA 来调,不同服务可以用不同策略。
第三步:导入资源
# 通过 CloudFormation Stack 导入
aws resiliencehub import-resources-to-draft-app-version \
--app-arn "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4" \
--source-arns "arn:aws:cloudformation:us-east-1:123456789012:stack/order-service/xxx"
# 或者通过 Resource Group
aws resiliencehub import-resources-to-draft-app-version \
--app-arn "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4" \
--source-arns "arn:aws:resource-groups:us-east-1:123456789012:group/order-service-resources"
第四步:发布版本并运行评估
# 发布应用版本
aws resiliencehub publish-app-version \
--app-arn "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4"
# 运行评估
aws resiliencehub start-app-assessment \
--app-arn "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4" \
--app-version "release" \
--assessment-name "weekly-check-$(date +%Y%m%d)" \
--region us-east-1
第五步:查看评估结果
# 列出评估结果
aws resiliencehub list-app-assessments \
--app-arn "arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4" \
--region us-east-1
结果会告诉你每个资源组件的弹性状态:
- ✅ Policy met — 达标
- ⚠️ Policy breached — 不达标,附带具体原因和修复建议
我踩到的几个问题
1. ElastiCache 单 AZ 部署被标红
我有个 Redis 集群只在单个 AZ 部署,Resilience Hub 直接标了 "AZ policy breached"。建议是开启跨 AZ 副本:
aws elasticache modify-replication-group \
--replication-group-id "order-cache" \
--multi-az-enabled \
--automatic-failover-enabled
这个确实是我的技术债。
2. SQS 死信队列没配置
有个 SQS 队列没配 DLQ(Dead Letter Queue),被标为软件故障风险。消息处理失败后会无限重试,没有兜底机制。
3. ECS 服务最小任务数为 1
我的一个非核心微服务 desiredCount 设的 1。Resilience Hub 提示这意味着任何单点故障都会导致服务中断。建议至少设为 2 并跨 AZ 分布。
和 Well-Architected 的关系
Resilience Hub 的评估维度和 AWS Well-Architected Framework 的 Reliability Pillar 对齐。
如果你做过 Well-Architected Review,Resilience Hub 相当于把 Review 里弹性相关的检查项自动化了。而且它能持续跑,不是做一次 Review 就完事。
适合什么场景
- 上线前检查 — 新服务部署前跑一次评估,确认弹性达标
- 定期巡检 — 每周/每月自动跑评估,发现配置漂移
- 合规审计 — 出具弹性报告给审计团队
- 架构评审 — 用评估结果辅助架构决策
自动化:集成到 CI/CD
可以在部署流水线里加一步弹性评估:
import boto3
import time
def run_resilience_check(app_arn, region='us-east-1'):
"""在部署后自动运行弹性评估"""
client = boto3.client('resiliencehub', region_name=region)
# 发布新版本
client.publish_app_version(appArn=app_arn)
# 启动评估
response = client.start_app_assessment(
appArn=app_arn,
appVersion='release',
assessmentName=f'ci-check-{int(time.time())}'
)
assessment_arn = response['assessment']['assessmentArn']
# 等待完成
while True:
result = client.describe_app_assessment(assessmentArn=assessment_arn)
status = result['assessment']['assessmentStatus']
if status == 'Success':
compliance = result['assessment']['compliance']
return compliance
elif status == 'Failed':
raise Exception("Assessment failed")
time.sleep(30)
# 在部署后调用
compliance = run_resilience_check(
"arn:aws:resiliencehub:us-east-1:123456789012:app/a1b2c3d4"
)
# 检查是否有策略违规
for disruption_type, detail in compliance.items():
if detail['complianceStatus'] == 'PolicyBreached':
print(f"⚠️ {disruption_type}: 弹性策略不达标!")
# 可以选择阻断部署或发告警
参考链接
- AWS Resilience Hub 文档:https://docs.aws.amazon.com/resilience-hub/latest/userguide/what-is.html
- Well-Architected Reliability Pillar:https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/welcome.html
- Resilience Hub API 参考:https://docs.aws.amazon.com/resilience-hub/latest/APIReference/Welcome.html
- AWS re:Post Resilience Hub 专区:https://repost.aws/tags/TAqmOOXKbKR1Oyl-N0Wbllkw/aws-resilience-hub

浙公网安备 33010602011771号