深入解析 DevOps Agent + MCP Server 架构:混合云 BGP 排障的自动化实现

混合云网络排障有个老大难问题:云侧和 IDC 侧的可观测性是割裂的。CloudWatch 告诉你 BGP 会话状态变了,但具体是对端路由器哪条策略改了、什么时候改的,你得 SSH 上去手动查。

亚马逊云科技最近发布了 DevOps Agent + MCP Server 的集成方案,通过 MCP 协议让 Agent 能直接调用 IDC 设备的只读命令,实现跨界自动取证。我搭完整套环境跑了两个测试场景,这篇文章把架构细节、安全设计和实测数据整理出来。

先说核心思路:MCP Server 当 Agent 的"手"

传统做法是写一堆 Lambda 采集脚本,定时拉数据回来。问题是:告警千变万化,你不可能预判所有需要的命令组合。

MCP Server 换了个思路——把路由器的只读命令封装成标准化的 Tool,暴露给 AI Agent。Agent 根据告警上下文,自己决定调哪些命令、按什么顺序调。

说白了,MCP Server 就是 Agent 伸进 IDC 机房的"手",而且这只手被严格限制:只能执行 show 和 dir 开头的命令,连个 config 都碰不了。

整体架构长什么样

画个简单的数据流:

CloudWatch 告警
    ↓
EventBridge 规则触发
    ↓
DevOps Agent(Agent Space)
    ↓ Private Connection(VPC Lattice)
MCP Server(EC2)
    ↓ SSH
IDC Cisco 路由器
    ↓
Agent 生成调查结论
    ↓
EventBridge Scheduler + Lambda
    ↓
飞书群通知

几个关键点:

  1. Private Connection 基于 VPC Lattice,Agent 到 MCP Server 的流量全程走亚马逊云科技骨干网,不过公网。
  2. MCP Server 跑在 EC2 上,通过 SSH 连接 IDC 路由器。这台 EC2 既在 VPC 内被 Agent 调用,又能通过 Direct Connect/VPN 触达 IDC。
  3. Agent Space 三级模型:Service → Association → Skill,把 MCP Tool 组织得很清晰。

10 个 MCP Tool 的设计

这套方案定义了 10 个只读 Tool,分三类:

BGP 状态类

{
  "name": "get_bgp_summary",
  "description": "获取 BGP 邻居摘要信息",
  "inputSchema": {
    "type": "object",
    "properties": {
      "router_id": { "type": "string", "pattern": "^router-[a-z0-9]+$" }
    },
    "required": ["router_id"]
  }
}
{
  "name": "get_bgp_neighbor_detail",
  "description": "获取指定邻居的详细 BGP 会话信息"
}
{
  "name": "get_bgp_prefix_count",
  "description": "获取当前接收的前缀数量"
}

路由策略类

{
  "name": "get_route_map",
  "description": "查看 route-map 配置"
}
{
  "name": "get_prefix_list",
  "description": "查看 prefix-list 条目"
}
{
  "name": "get_running_config_section",
  "description": "查看指定 section 的 running-config"
}

变更历史类

{
  "name": "get_config_changelog",
  "description": "获取配置变更记录"
}
{
  "name": "get_log_events",
  "description": "获取设备日志中的关键事件"
}
{
  "name": "get_interface_status",
  "description": "获取接口状态和流量统计"
}
{
  "name": "get_directory_listing",
  "description": "列出设备存储中的文件(用于查看历史配置备份)"
}

注意看 inputSchema 里的 pattern 字段——入参用正则白名单限制,防止注入。

安全边界设计:四道防线

这是我觉得方案里设计得很讲究的部分:

第一道:命令前缀白名单

MCP Server 只允许执行 showdir 开头的命令。哪怕 Agent 幻觉了想执行 configure terminal,直接被拦。

第二道:入参白名单正则

每个 Tool 的输入参数都有正则校验。比如 router_id 必须匹配 ^router-[a-z0-9]+$,你传个 ; rm -rf / 进来,正则就挡住了。

第三道:输出脱敏

MCP Server 返回结果前,会把敏感信息(比如邻居 IP、AS 号以外的细节)做脱敏处理。Agent 拿到的是"够用但不过量"的信息。

第四道:IAM 权限收紧

Agent 调用 MCP Server 走的 IAM Role,只开了 bedrock:InvokeAgentvpc-lattice:Invoke 两类权限。连 EC2 的 SSH 密钥都碰不到。

# IAM Policy 示例(简化版)
Statement:
  - Effect: Allow
    Action:
      - bedrock:InvokeAgent
      - bedrock:Retrieve
    Resource: "arn:aws:bedrock:*:*:agent/*"
  - Effect: Allow
    Action:
      - vpc-lattice:Invoke
    Resource: "arn:aws:vpc-lattice:*:*:service/*"

实测:两个告警场景

场景一:BGP Prefix High

模拟对端路由器突然宣告 92 条前缀(正常是 20 条以内)。

Agent 收到告警后的动作链:

  1. 调用 get_bgp_prefix_count → 确认前缀数异常
  2. 调用 get_bgp_neighbor_detail → 看邻居会话状态
  3. 调用 get_prefix_list → 检查过滤规则
  4. 调用 get_route_map → 核实路由策略
  5. 调用 get_config_changelog → 查最近变更
  6. 调用 get_log_events → 翻设备日志

20 秒识别症状,8 次 MCP 调用,总耗时约 2 分钟。

Agent 的结论:"对端在 14:32 修改了 prefix-list,移除了前缀数量限制,导致全表泄漏。建议联系对端恢复原始 prefix-list 配置。"

换成人来做,光是 SSH 上去跑完这些命令、肉眼比对输出,少说半小时。

场景二:BGP Prefix Asymmetry

去程走 Direct Connect,回程却绕到了公网。用户报延迟飙高。

Agent 的诊断路径不一样——它重点看了 get_route_mapget_running_config_section,发现是 Local Preference 配置不一致导致的路径不对称。

这个场景更能体现 Agent 的价值:它不是按固定脚本跑,而是根据症状动态调整排查策略。

Agent Space 的三级集成模型

亚马逊云科技的 Agent Space 用三级结构管理能力:

Service(MCP Server 注册为一个 Service)
    ↓
Association(绑定到某个 Agent)
    ↓
Skill(Agent 可调用的具体能力集合)

好处是解耦。同一个 MCP Server 可以被多个 Agent 共享,不同 Agent 可以被授权使用不同的 Tool 子集。比如一线 On-Call 的 Agent 只开放状态查询类 Tool,高级排障 Agent 才开放变更历史类。

自动通知:EventBridge + Lambda 推飞书

Agent 跑完调查后,结论会写入一个结构化的 JSON。然后:

  1. EventBridge Scheduler 定时(或事件触发)启动 Lambda
  2. Lambda 读取调查结论,格式化成飞书消息卡片
  3. 推送到指定飞书群
import json
import urllib.request

def lambda_handler(event, context):
    conclusion = event.get("conclusion", "")
    severity = event.get("severity", "info")
    
    card = {
        "msg_type": "interactive",
        "card": {
            "header": {
                "title": {"tag": "plain_text", "content": " 网络排障结论"},
                "template": "red" if severity == "critical" else "blue"
            },
            "elements": [
                {"tag": "markdown", "content": conclusion}
            ]
        }
    }
    
    req = urllib.request.Request(
        url=WEBHOOK_URL,
        data=json.dumps(card).encode("utf-8"),
        headers={"Content-Type": "application/json"}
    )
    urllib.request.urlopen(req)
    return {"statusCode": 200}

这样 On-Call 的同事不用盯着 Agent 跑,结论自动推到群里。凌晨三点的告警,Agent 自己查完、自己通知,人只要看结论决定是否需要人工介入。

我的判断

这套方案解决了混合云排障里一个很现实的痛点:Agent 不止看云侧指标,还能跨到 IDC 设备取证。

以前的 AIOps 工具大多只能分析自家平台的数据。一旦问题出在云下,还是得人工去 SSH。现在 MCP Server 把这个"跨界取证"的能力标准化了,而且安全控制做得很严。

迭代速度也挺快的——从 Agent 只能调云服务 API,到现在能跨到任意设备,这个能力边界的扩展节奏让人期待后面还能接什么。

当然也有局限:目前 MCP Server 还是需要自己写和部署,Tool 的定义也需要手动维护。如果路由器型号多、命令差异大,维护成本不低。但作为起步,这个方向是对的。

参考资料

posted @ 2026-05-16 07:36  亚马逊云开发者  阅读(6)  评论(0)    收藏  举报