背景
在多云架构下,业务日志分散在不同云平台是常态——腾讯云的应用日志在 CLS,阿里云的服务日志在 SLS。当需要排查跨云问题时,运维人员不得不在多个控制台之间切换,效率低下。
腾讯云智能顾问 CloudQ 已经能分析腾讯云 CLS 日志,但如何让它也能"看到"阿里云的 SLS 日志?答案是 MCP(Model Context Protocol)——一个让 AI 助手调用外部工具的标准协议。
阿里云官方提供了 Observable MCP Server(GitHub),支持通过自然语言查询 SLS 日志。我们要做的就是把它部署起来,然后让智能顾问 CloudQ 通过自定义 MCP 连接到它。
架构
智能顾问 CloudQ 通过自定义 MCP 连接器访问阿里云 SLS 日志
架构分为三个区域:
- 用户端:运维人员在企业微信中用自然语言向 CloudQ 提问(如"帮我查一下阿里云 SLS 最近 1 小时的错误日志")
- 腾讯云:智能顾问 CloudQ 接收问题后,通过自定义 MCP 连接器发起 SSE 请求,经 CVM 上的 Nginx 反向代理(Basic Auth + Rate Limit)转发到本地 MCP Server
- 阿里云:MCP Server 使用 RAM 子账号(最小 SLS 只读权限)调用阿里云 SLS API 查询日志,结果沿链路返回,CloudQ 整理后在企微中呈现
前置条件
| 项目 | 要求 |
|---|---|
| 阿里云账号 | RAM 子账号,仅授予 SLS 只读权限(log:Get* + log:List*) |
| 腾讯云 CVM | 一台有公网 IP 的 CVM(1核1G即可),安装 Python 3.8+ 和 Nginx |
| 智能顾问 | 已开通自定义 MCP 连接能力 |
Step 1:安装 MCP Server
创建 systemd 服务 /etc/systemd/system/aliyun-mcp.service:
Description=Aliyun Observable MCP Server (SSE)
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 -m mcp_server_aliyun_observability \
--transport sse --transport-port 8000 --host 127.0.0.1 \
--access-key-id <ALIYUN_AK> \
--access-key-secret <ALIYUN_SK>
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl enable aliyun-mcp
systemctl start aliyun-mcp
关键:MCP Server 仅监听 127.0.0.1:8000,不直接暴露公网。所有外部访问通过 Nginx 代理。
Step 2:Nginx 反向代理
安装 Nginx 和 htpasswd 工具:
apt install -y nginx apache2-utils # Ubuntu/Debian
生成 Basic Auth 密码文件:
chmod 644 /etc/nginx/mcp_htpasswd
Nginx 配置 /etc/nginx/conf.d/aliyun-mcp.conf:
listen 8080;
server_name <你的公网IP>;
auth_basic "CloudQ MCP Auth";
auth_basic_user_file /etc/nginx/mcp_htpasswd;
location /sse {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_buffering off;
proxy_cache off;
proxy_set_header Connection '';
proxy_set_header Host 127.0.0.1:8000;
proxy_read_timeout 300s;
}
location /messages/ {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_buffering off;
proxy_cache off;
proxy_set_header Connection '';
proxy_set_header Host 127.0.0.1:8000;
proxy_read_timeout 300s;
}
location / { return 403; }
}
SSE 必需配置:proxy_buffering off和proxy_cache off是 SSE 长连接的关键,否则事件流会被缓冲导致连接超时。/messages/路径也需要代理(MCP 协议的消息通道)。
Step 3:安全组
在 CVM 所属的安全组中添加入站规则:
| 协议 | 端口 | 来源 | 说明 |
|---|---|---|---|
| TCP | 8080 | 0.0.0.0/0(或智能顾问出口 IP) | MCP Server HTTP 代理 |
如果能确认智能顾问的出口 IP 段,建议收紧为 IP 白名单 + Basic Auth 双重防护。
Step 4:智能顾问配置
在腾讯云智能顾问控制台,添加自定义 MCP 连接:
| 配置项 | 值 |
|---|---|
| SSE 地址 | http://<公网IP>:8080/sse |
| Header Key | Authorization |
| Header Value | Basic <base64(用户名:密码)> |
Base64 编码生成:
Step 5:验证
本地验证:
curl -s -o /dev/null -w "%{http_code}" http://<公网IP>:8080/sse
# 有认证应返回 SSE 事件流
curl -s -N -m 5 -u 用户名:密码 http://<公网IP>:8080/sse
企微验证:在 CloudQ 对话中输入——
"帮我查一下阿里云 SLS 中有哪些 logstore"
CloudQ 会调用 sls_list_logstores 工具并返回结果。
可用工具
MCP Server 接入后,CloudQ 可调用以下 SLS 工具:
| 工具 | 功能 | 典型用法 |
|---|---|---|
sls_list_logstores | 列出所有 logstore | "有哪些日志库" |
sls_describe_logstore | 获取字段结构 | "xxx 日志库有哪些字段" |
sls_translate_natural_language_to_query | 自然语言转 SLS SQL | "最近1小时ERROR日志" |
sls_execute_query | 执行查询 | 执行上一步生成的 SQL |
踩坑记录
| 问题 | 现象 | 解决 |
|---|---|---|
| Nginx 代理 Host Header 不匹配 | MCP Server 返回 "Invalid Host header" | proxy_set_header Host 127.0.0.1:8000 |
| htpasswd 权限不足 | Nginx 500 错误,日志报 Permission denied | chmod 644 /etc/nginx/mcp_htpasswd |
| 自签 TLS 证书 | 智能顾问报 "tls: failed" | 改用 HTTP + Basic Auth(智能顾问不信任自签证书) |
| SSE 被缓冲 | 连接超时无响应 | proxy_buffering off; proxy_cache off; |
| Nginx 80 端口被占用 | 启动失败 Address in use | 使用其他端口(如 8080),注释 nginx.conf 默认 server |
安全建议
| 层级 | 措施 |
|---|---|
| 应用层 | Nginx Basic Auth + Rate Limit (10r/s) |
| 网络层 | 安全组仅开放代理端口,后续收紧为智能顾问 IP 白名单 |
| 进程层 | MCP Server 仅监听 127.0.0.1,不直接暴露 |
| 凭证层 | 阿里云 RAM 子账号最小权限(仅 SLS 只读) |
总结
通过 MCP 协议,智能顾问 CloudQ 的能力边界从腾讯云扩展到了阿里云。整个部署只需一台 CVM、一个 Nginx 代理和一行 pip install,即可让 CloudQ 在企微对话中自然语言查询阿里云 SLS 日志。
这种"MCP Server 作为桥梁"的模式具有通用性——不仅限于 SLS,任何支持 MCP 协议的第三方工具都可以用同样的方式接入智能顾问,实现多云、多源的统一可观测。