私有Direct3D观察性示例
演示当日志分析查询发生以下情况时,Azure SRE代理如何调查和调试私有ExpressRoute中的资源 被私人链接阻止--使用Direct3D集成的MCP服务器作为查询代理。
场景概述
问题:您已使用配置了Azure Monitor专用链接作用域(AMPLS) queryAccessMode: PrivateOnly 并禁用了日志分析工作区上的公共查询访问。现在 所有外部查询都被阻止--包括来自Azure SRE代理的那些。
SRE代理价值:通过在ExpressRoute内部署MCP服务器,SRE代理仍然可以查询日志。MCP服务器在受信任的网络边界内运行,并代表代理查询日志分析。
建筑
┌─────────────────────────────────────────────────────────────────────────────┐
│ Private VNet (VNet-Integrated Environment) │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ Azure Container Apps Environment ││
│ │ (VNet-Integrated) ││
│ │ ││
│ │ ┌────────────────────────────────────────────────────────────────┐ ││
│ │ │ Log Analytics MCP Server │ ││
│ │ │ log-analytics-mcp-vnet.*.azurecontainerapps.io │ ││
│ │ │ │ ││
│ │ │ Tools: query_logs, list_tables, get_workspace_info, │ ││
│ │ │ analyze_errors (multi-source), check_vm_health │ ││
│ │ │ + analyze_linux_errors, analyze_windows_errors, │ ││
│ │ │ analyze_container_errors, analyze_azure_failures │ ││
│ │ │ │ ││
│ │ │ Auth: Managed Identity (Log Analytics Reader) │ ││
│ │ └──────────────────────────┬─────────────────────────────────────┘ ││
│ │ │ ││
│ └─────────────────────────────┼────────────────────────────────────────────┘│
│ │ Query via Private Endpoint │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ Log Analytics Workspace ││
│ │ ││
│ │ publicNetworkAccessForQuery: Disabled ││
│ │ AMPLS queryAccessMode: PrivateOnly ││
│ └─────────────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────────────┘
│
│ Streamable HTTP (MCP Protocol)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Azure SRE Agent │
│ (Outside the VNet) │
│ │
│ ✓ Calls MCP server tools over HTTPS │
│ ✓ MCP server queries Log Analytics from inside VNet │
│ ✓ Results returned to agent for analysis │
│ ✓ No direct VNet access required │
└─────────────────────────────────────────────────────────────────────────────┘关键见解
数据摄取 和 查询访问 使用不同的网络路径:
| 路径 | 方向 | 访问 |
|---|---|---|
| Azure监控代理→ 日志分析 | 摄取 | 可以使用私有端点或公共端点 |
| 外部查询→ 日志分析 | 查询 | 已屏蔽 通过私人链接 |
| Direct3D MCP→ 日志分析 | 查询 | 允许 通过专用端点 |
| SRE代理→ MCP服务器 | 查询 | 公共HTTPS(MCP协议) |
先决条件
- 具有参与者访问权限的Azure订阅
- 已安装Azure CLI
- Docker(用于构建MCP服务器镜像)
证明它有效
测试1:来自外部ExpressRoute的查询(已阻止)
curl -X POST "https://log-analytics-mcp.happydune-ad37d82a.eastus2.azurecontainerapps.io/mcp/" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-API-Key: your-api-key" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"list_tables"},"id":1}'结果:阻塞 ❌
InsufficientAccessError: The query was blocked due to private link configuration.测试2:从Direct3D内部查询(成功)
curl -X POST "https://log-analytics-mcp-vnet.redbay-525c1802.eastus.azurecontainerapps.io/mcp/" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-API-Key: your-api-key" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"list_tables"},"id":1}'结果:成功 ✅
{"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"Found 15 tables..."}]}}快速开始
1.部署ExpressRoute集成环境
# Create resource group
az group create --name vnet-test-rg --location eastus
# Create VNet
az network vnet create --resource-group vnet-test-rg --name vnet-test-vnet \
--address-prefix 10.0.0.0/16 --subnet-name infrastructure --subnet-prefix 10.0.0.0/23
# Create VNet-integrated Container Apps environment
az containerapp env create --name vnet-test-env --resource-group vnet-test-rg \
--location eastus --infrastructure-subnet-resource-id /subscriptions/.../infrastructure
# Create Log Analytics workspace
az monitor log-analytics workspace create --resource-group vnet-test-rg \
--workspace-name workspace-vnettest --location eastus2.配置专用链接(阻止公共查询)
# Create AMPLS and link workspace
az monitor private-link-scope create --name vnet-test-ampls --resource-group vnet-test-rg
# Set to Private Only
az monitor private-link-scope update --name vnet-test-ampls --resource-group vnet-test-rg \
--query-access PrivateOnly
# Disable public query access
az monitor log-analytics workspace update --resource-group vnet-test-rg \
--workspace-name workspace-vnettest --set properties.publicNetworkAccessForQuery=Disabled3.部署MCP服务器
# Create ACR (VNet environments can't pull from public registries)
az acr create --resource-group vnet-test-rg --name yourregistryname --sku Basic
# Build and push image
az acr build --registry yourregistryname --image log-analytics-mcp:latest .
# Deploy with Managed Identity
az containerapp create --name log-analytics-mcp-vnet --resource-group vnet-test-rg \
--environment vnet-test-env --image yourregistryname.azurecr.io/log-analytics-mcp:latest \
--target-port 8000 --ingress external --system-assigned
# Grant Log Analytics Reader role
az role assignment create --assignee-object-id $(az containerapp show ...) \
--role "Log Analytics Reader" --scope /subscriptions/.../workspaces/workspace-vnettest4.配置SRE代理
name: PrivateVNetObservabilityAgent
mcp_tools:
- LogAnalyticsMCP
tool_definitions:
LogAnalyticsMCP:
type: mcp
transport: streamable_http
url: https://log-analytics-mcp-vnet.*.azurecontainerapps.io/mcp/
headers:
X-API-Key: "${MCP_API_KEY}"5.使用SRE代理进行调试
“显示我的私人日志分析工作区中可用的表”
“从应用程序日志中查询最近10个错误”
6.清理
az group delete --name vnet-test-rg --yes --no-wait你将学到什么
- 在ExpressRoute集成的容器应用程序中部署MCP服务器
- 配置私有链接以阻止公共查询
- 使用托管身份进行安全的Azure身份验证
- 用于远程MCP访问的流式HTTP传输
此示例中的文件
| 文件 | 描述 |
|---|---|
deploy-sample.ps1 | 全面环境部署 |
inject-failure.ps1 | 模拟应用程序问题 |
fix-issue.ps1 | 应用补救措施 |
cleanup.ps1 | 删除所有资源 |
blog-post.md | 完整教程文章 |
预计成本
| 资源 | 小时成本 | 备注 |
|---|---|---|
| 容器应用程序(MCP服务器) | ~0.05美元 | 消费计划 |
| 日志分析摄取量 | ~0.10 | 基于日志量 |
| 集装箱登记(基本) | ~0.01 | 每小时 |
| 总计 | 约0.16美元/小时 | 用于演示持续时间 |
💡 小贴士:演示结束后立即运行清理,以最大限度地降低成本。
证券收益
该架构提供:
- 已强制执行查询阻止 -
publicNetworkAccessForQuery: Disabled实际上阻止了外部查询 - MCP作为可信代理 -只有WM_MCP服务器可以查询日志
- 管理身份 -没有存储秘密,Azure处理身份验证
- API密钥保护 -MCP端点需要身份验证
- 审计跟踪 -容器应用程序中记录的所有MCP查询
关键模式:MCP作为查询代理
此示例演示了任何受Private Link保护的资源的可重用模式:
- 在ExpressRoute内部部署MCP服务器
- 通过托管身份授予其访问权限
- 通过流式HTTP公开它
- 配置SRE代理以将其用作工具
适用于:日志分析、应用程序洞察、Azure SQL、Cosmos DB等。
后续步骤
- 为其他专用链路服务构建MCP服务器
- 为特定于域的查询添加自定义工具
- 配置警报以进行主动事件检测
- 与Azure Monitor工作簿集成以用于仪表板
