在 AWS 上构建远程 MCP Server:从安全边界到弹性扩缩容

2026-07-18 44 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

Smartsheet 构建远程 MCP Server 的案例,重点不只是“让模型调用几个工具”,而是如何把 MCP 服务纳入成熟的云基础设施:身份认证、权限治理、弹性扩缩、持续部署,以及面向 AI 工作负载的专门优化。远程 MCP 一旦连接企业数据和写操作,就应当按生产 API,而不是按实验性提示词组件来设计。

远程 MCP 的核心是受控的数据通路

一个典型的 AWS 部署可以把流量链路拆成几层:客户端通过 HTTPS 连接入口,入口完成 TLS、限流和基础防护;容器服务运行 MCP Server;服务再凭受限身份访问业务 API、数据库或消息系统。

可以这样实践一套参考架构。以下是通用设计示意,不代表 Smartsheet 的具体资源配置:

MCP Client / AI Agent
        |
        | HTTPS + OAuth access token
        v
CloudFront or Application Load Balancer
        |
        +---- AWS WAF: rate limits and request filtering
        |
        v
ECS Fargate: remote MCP server
        |
        +---- Secrets Manager: downstream credentials
        +---- CloudWatch: logs, metrics and alarms
        +---- X-Ray / OpenTelemetry: request traces
        |
        v
Business APIs and governed data services

入口认证和工具授权需要分开处理。一个合法用户能够连接 MCP Server,并不意味着他可以调用全部工具。服务应把用户身份、租户、OAuth scope 和资源权限带到每一次工具调用中,避免用服务器的高权限角色替用户完成所有操作。

对于写入、删除或批量导出之类的高风险工具,还应增加明确的审批或确认机制。至少记录以下审计字段:

  • 调用者和租户标识
  • 工具名称及版本
  • 经过脱敏的参数摘要
  • 下游资源标识
  • 执行结果、耗时和错误类型
  • MCP 请求与下游请求的关联 ID

不要把访问令牌、完整提示词或敏感业务数据直接写入日志。结构化日志和字段级脱敏应当在应用层完成,而不是依赖运维人员事后清理。

扩缩容不能只盯着 CPU

远程 MCP Server 面对的是突发、并发且耗时差异很大的工具调用。只使用 CPU 利用率扩容,可能无法及时反映下游 API 等待、长连接数量或任务积压。

更有价值的指标包括:

  • 活跃 MCP 会话数和并发工具调用数
  • 每个工具的 P50、P95、P99 延迟
  • 429、超时和下游依赖错误率
  • 每个任务的内存与连接占用
  • 请求队列深度或正在执行的异步任务数

如果服务运行在 ECS Fargate,可以先用 CPU 建立基础扩缩策略,再逐步接入 CloudWatch 自定义指标。下面的命令可直接改造使用。运行前需要替换集群名、服务名,并确认 AWS CLI 已登录目标账户:

#!/usr/bin/env bash
set -euo pipefail

CLUSTER="mcp-prod"
SERVICE="remote-mcp-server"
RESOURCE_ID="service/${CLUSTER}/${SERVICE}"

aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id "${RESOURCE_ID}" \
  --min-capacity 2 \
  --max-capacity 20

aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id "${RESOURCE_ID}" \
  --policy-name mcp-cpu-target \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 55.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "ScaleOutCooldown": 30,
    "ScaleInCooldown": 180
  }'

生产环境通常保留至少两个任务,并分布在不同可用区。扩容要快,缩容则应更谨慎,避免终止仍在处理工具调用或维持流式响应的任务。应用还需要捕获终止信号、停止接收新请求,并在宽限期内完成已有请求。

部署治理要覆盖工具本身

MCP Server 的变化不仅是代码变化。工具名称、输入模式、权限要求和返回结构都会影响 Agent 的决策,因此工具定义本身也应被版本化和测试。

一条稳妥的发布链路可以包含:

  1. 对工具 schema 做静态校验和兼容性检查。
  2. 使用固定输入运行契约测试,验证授权、超时与错误映射。
  3. 构建不可变容器镜像,并生成软件物料清单。
  4. 在隔离环境执行真实下游依赖的集成测试。
  5. 通过蓝绿或金丝雀发布逐步引流。
  6. 根据错误率、工具延迟和异常调用量自动回滚。

IAM 权限也应跟随代码审查。任务角色只获取运行时所需权限,部署角色负责更新服务,两者不要混用。不同环境使用独立的密钥和资源边界,避免测试 Agent 误触生产数据。

AI 工作负载需要额外的成本与可靠性控制

传统 API 往往返回面向人或程序的完整对象,但 MCP 工具结果最终会进入模型上下文。返回字段越多,令牌成本、延迟以及敏感信息暴露面就越大。

可以这样实践结果裁剪:允许调用者请求字段和分页大小,同时在服务端设置硬上限。对于大型列表,返回摘要、游标和稳定资源 ID,而不是一次塞入全部记录。工具错误也应转成简短、可行动的结构化结果,避免把下游堆栈或 HTML 错误页送给模型。

{
  "items": [
    {"id": "row-1042", "name": "Q3 plan", "status": "blocked"}
  ],
  "next_cursor": "eyJvZmZzZXQiOjI1fQ==",
  "truncated": true
}

还需要考虑 Agent 的自动重试行为。读取操作可以通过幂等设计和短期缓存降低压力;写操作应接受幂等键,防止模型、SDK 或网关重试造成重复提交。遇到下游限流时,应返回明确的可重试状态并采用带抖动的指数退避,同时设置每个租户和每个工具的并发上限。

上线前检查清单

远程 MCP 的价值来自开放工具能力,它的风险也来自同一件事。落地时可以沿着下面的顺序收紧边界:

  • 认证用户,同时在每个工具调用中重新执行资源授权。
  • 使用最小权限任务角色,并把密钥放入 Secrets Manager。
  • 为危险工具增加确认、审批或默认只读模式。
  • 对 schema、权限和错误行为建立契约测试。
  • 同时监控基础设施指标和工具级指标。
  • 验证断连、超时、限流、重试和优雅终止行为。
  • 对结果做分页、裁剪和脱敏,控制令牌成本。
  • 从小流量金丝雀开始,保留快速回滚能力。

Smartsheet 的案例说明,远程 MCP Server 已经进入标准云工程需要解决的范围。真正决定系统能否长期运行的,不是工具数量,而是身份能否贯穿链路、权限是否可审计、流量是否可控,以及模型触发异常行为时系统能否把影响限制在清晰的边界内。


相关推荐