AWS Resilience Hub 新一代实测:AI 帮你做弹性评估,单点故障藏不住了

AWS Resilience Hub 新一代实测:AI 帮你做弹性评估,单点故障藏不住了

去年有个微服务挂了 40 分钟。事后复盘发现问题不复杂——一个 Redis 集群没开跨 AZ 副本,单个可用区故障直接把缓存层干翻了。

这种单点故障其实一直在那里,只是没人系统性地去查。手工做架构评审?太慢了,而且容易遗漏。

亚马逊云科技的 Resilience Hub 最近升级了一版,加入了生成式 AI 能力。简单说就是:AI 帮你扫描架构,找出弹性短板,给出具体修复建议。我用它跑了一遍我们的订单服务,确实揪出来几个之前没注意到的问题。

Resilience Hub 是干什么的

先给没用过的同学补个背景。

AWS Resilience Hub 是一个弹性评估工具。核心逻辑是:

  1. 你告诉它你的 RTO/RPO 目标(恢复时间/恢复点目标)
  2. 它自动扫描你的架构资源和配置
  3. 出一份弹性评估报告,告诉你哪里不达标

举个例子:你说"这个服务 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 就完事。

适合什么场景

  1. 上线前检查 — 新服务部署前跑一次评估,确认弹性达标
  2. 定期巡检 — 每周/每月自动跑评估,发现配置漂移
  3. 合规审计 — 出具弹性报告给审计团队
  4. 架构评审 — 用评估结果辅助架构决策

自动化:集成到 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}: 弹性策略不达标!")
        # 可以选择阻断部署或发告警

参考链接

posted @ 2026-06-08 19:36  亚马逊云开发者  阅读(4)  评论(0)    收藏  举报