← 返回文章列表

跨云 MCP 迁移:从跳板机到阿里云函数计算的 Serverless 实践

背景

上一篇文章中,我们将阿里云 Observable MCP Server 部署在腾讯云跳板机上,通过 Nginx 反向代理让智能顾问 CloudQ 访问阿里云 SLS 日志。方案虽然可行,但存在几个问题:

  • 跳板机资源紧张:MCP Server 进程常驻占用约 139MB 内存,跳板机仅 2G 内存已达 92%
  • AK/SK 跨云存储:阿里云的 AK/SK 存放在腾讯云跳板机上,存在凭证泄露风险
  • 网络延迟:跳板机(腾讯云上海)→ 阿里云 SLS API(公网调用),存在跨云网络延迟
  • 运维负担:需要手动维护 MCP Server 进程、Nginx 配置和 systemd 服务

本文记录将 MCP Server 迁移到阿里云函数计算(FC)的完整过程,实现零运维、AK/SK 不出阿里云、内网调用 SLS API 的最优方案。

架构对比

腾讯云 智能顾问 CloudQ 自定义 MCP 连接器 企业微信交互 👨‍💻 运维人员(企微) 阿里云 函数计算 FC (cn-hangzhou) 全托管 · 极速模式 · 沙箱隔离 Observable MCP Server SSE 传输 · :9000 · Python 🔑 AK/SK 环境变量(不出阿里云) HTTPS + Bearer Token 鉴权(FC 内置) SLS 日志服务 日志查询 API 内网调用(零延迟) RAM 只读权限 Logstore 应用日志 Logstore 访问日志 新方案:CloudQ → FC HTTPS/SSE → MCP Server → 内网 → SLS API ✅ AK/SK不出阿里云 · ✅ HTTPS加密 · ✅ 内网零延迟 · ✅ 零运维 自然语言 SSE/HTTPS 内网

智能顾问 CloudQ 通过阿里云 FC 部署的 MCP Server 访问 SLS 日志(内网链路)

旧方案:跳板机部署

CloudQ → http://122.51.160.127:8080/sse (Basic Auth)
  → Nginx 反向代理
    → 127.0.0.1:8000 (MCP Server)
      → 阿里云 SLS API (公网)

新方案:阿里云 FC 部署

CloudQ → https://xxxx.cn-hangzhou.fcapp.run/sse (Bearer Token)
  → 阿里云函数计算 (FC)
    → MCP Server 进程
      → 阿里云 SLS API (内网调用)

方案对比

维度 跳板机方案 FC 方案
运维手动维护进程 + Nginx全托管,零运维
AK/SK 安全存在腾讯云跳板机(跨云)仅存在阿里云 FC 环境变量
网络跳板机→公网→SLS APIFC→SLS 内网调用
认证Nginx Basic AuthFC 内置 Bearer Token
弹性固定资源常驻按需弹性,空闲不计费
成本占跳板机 139MB 内存按调用计费,轻量使用几乎免费
跳板机释放释放 ~150MB 内存

前置条件

项目 要求
阿里云账号RAM 子账号,仅授予 SLS 只读权限(log:Get* + log:List*
阿里云函数计算已开通 FC 服务(Function AI 控制台)
智能顾问已开通自定义 MCP 连接能力

Step 1:在 Function AI 创建 MCP 服务

  1. 登录 Function AI 控制台
  2. 点击「创建项目」→「创建空白项目」
  3. 项目名:cloudq-sls-mcp
  4. 点击项目 →「新建服务」→「MCP 服务」

Step 2:配置 MCP 服务参数

配置项 说明
传输类型SSE 协议智能顾问通过 SSE 长连接通信
开启鉴权开启自动生成 Bearer Token
运行环境自定义运行时(Python)MCP Server 是 Python 包
弹性策略极速模式SSE 长连接需要会话一致性
预置快照1 个避免冷启动
实例限额1确保 SSE 请求分配到同一实例
vCPU / 内存1 vCPU / 2GBMCP Server 运行需求
关键配置:由于 MCP SSE 协议依赖 session 机制,必须选择极速模式 + 实例限额 1,确保同一 session 的请求始终路由到同一实例。

Step 3:编写启动脚本

创建 bootstrap 启动脚本(FC 自定义运行时入口):

#!/bin/bash
pip install mcp-server-aliyun-observability -q
python3 -m mcp_server_aliyun_observability \
  --transport sse \
  --transport-port 9000 \
  --access-key-id $ALIYUN_ACCESS_KEY_ID \
  --access-key-secret $ALIYUN_ACCESS_KEY_SECRET

Step 4:配置环境变量

在 FC 控制台的「服务变量」中配置:

变量名 说明
ALIYUN_ACCESS_KEY_IDRAM 子账号 AKSLS 只读权限
ALIYUN_ACCESS_KEY_SECRETRAM 子账号 SKFC 环境变量托管
安全优势:AK/SK 通过 FC 环境变量管理,不出阿里云,无需在腾讯云侧存储任何阿里云凭证。

Step 5:部署并获取端点

点击「预览&部署」完成部署后,在项目详情页获取:

  • SSE 端点地址https://xxxx.cn-hangzhou.fcapp.run/sse
  • Bearer Token:控制台自动生成(用于鉴权)

Step 6:验证连通性

curl -N -H "Authorization: Bearer <Token>" \
  https://xxxx.cn-hangzhou.fcapp.run/sse

# 成功返回:
event: endpoint
data: /message?sessionId=xxx-xxx-xxx

看到 event: endpoint 响应即表示 MCP Server 正常运行。

Step 7:更新智能顾问 MCP 配置

在腾讯云智能顾问控制台,修改阿里云 SLS 的 MCP 连接配置:

配置项 旧值(跳板机) 新值(FC)
URLhttp://122.51.160.127:8080/ssehttps://xxxx.cn-hangzhou.fcapp.run/sse
认证Basic AuthBearer Token
协议HTTPHTTPS(FC 内置)

Step 8:停用跳板机旧服务

FC 验证通过后,停用跳板机上的 MCP Server 释放资源:

systemctl stop aliyun-mcp
systemctl disable aliyun-mcp
# 释放约 150MB 内存

迁移前后跳板机内存对比:

状态 可用内存
迁移前159 MB
迁移后311 MB(+152MB)

可用工具

与跳板机方案完全相同,CloudQ 可调用以下 SLS 工具:

工具 功能 典型用法
sls_list_logstores列出所有 logstore"有哪些日志库"
sls_describe_logstore获取字段结构"xxx 日志库有哪些字段"
sls_translate_natural_language_to_query自然语言转 SLS SQL"最近1小时ERROR日志"
sls_execute_query执行查询执行上一步生成的 SQL

踩坑记录

问题 现象 解决
Python 版本不匹配从跳板机(3.11)打包的依赖在FC(3.10)上报 ModuleNotFoundError改用 Function AI 控制台直接部署,pip install 在运行时环境执行
SSE 会话不一致多实例时 SSE session 断裂极速模式 + 实例限额=1,确保请求路由到同一实例
冷启动超时首次调用 pip install 耗时导致超时预置 1 个快照,避免冷启动
智能顾问连接不上 FC复制 URL 时带入不可见字符从纯文本文件复制 URL,避免从聊天工具复制

安全对比

安全维度 跳板机方案 FC 方案
AK/SK 存储位置腾讯云跳板机(跨云)阿里云 FC 环境变量(不出阿里云)
传输加密HTTP(无 TLS)HTTPS(FC 内置证书)
认证方式Nginx Basic AuthFC Bearer Token(自动管理)
进程隔离与其他服务共享跳板机FC 沙箱隔离
SLS 调用链路跳板机→公网→SLSFC→SLS 内网

成本估算

费用项 规格 预估费用
函数调用前 100 万次/月免费免费
执行时长前 40 万 GB·s/月免费免费
预留实例1 个(2GB) × 24h约 ¥15/月
公网流量返回查询结果文本极少
月度合计约 ¥15(不预留则接近免费)

总结

通过将 MCP Server 迁移到阿里云函数计算,实现了三重优化:

1. 安全提升:AK/SK 不出阿里云,HTTPS 加密传输,FC 沙箱隔离
2. 性能提升:FC 到 SLS 走内网,延迟更低;跳板机释放 150MB 内存
3. 运维简化:全托管零运维,无需维护进程/Nginx/证书

对于需要跨云接入 MCP Server 的场景,优先部署在数据源所在云的 Serverless 平台是最佳实践——既避免了凭证跨云,又获得了内网调用的低延迟优势。