跳到主要内容

v1.7.2 — External Datasources + Dynamic VPC CIDR

· 阅读需 6 分钟

新增了以 Grafana 风格管理 Prometheus、Loki、ClickHouse 等 7 种外部数据源的功能。本次发布还包含涵盖 SSRF 防护和 SQL 注入防范的安全层、动态 VPC CIDR 配置,以及用于诊断数据源连接问题的专用代理

核心变化

7 种外部数据源 · SSRF 防护 · SQL 注入防范 · 动态 VPC CIDR · 数据源诊断代理

外部数据源管理

您可以采用与 Grafana 数据源管理类似的方式,在 AWSops 中直接连接并查询外部可观测性(Observability)工具。

支持的 7 种数据源

类型查询语言主要用途
PrometheusPromQL指标采集/查询
LokiLogQL日志聚合/检索
TempoTraceQL分布式追踪
ClickHouseSQL分析型数据仓库
JaegerTrace API分布式追踪
DynatraceAPIAPM / 全栈可观测
DatadogAPI监控 / APM

功能详情

功能说明
CRUD数据源注册/修改/删除(仅限 Admin)
Connection Test一键连接测试 + 响应时间(ms)测量
Query Execution按类型使用相应查询语言即时执行
4 种认证None、Basic Auth、Bearer Token、Custom Header
Credential MaskingAPI 响应中的密码/令牌 → *** 掩码
i18n支持韩语 + 英语

认证配置示例

支持 4 种认证方式,可根据数据源类型选择合适的方式:

// src/lib/datasource-client.ts
type AuthType = 'none' | 'basic' | 'bearer' | 'custom-header';

// Basic Auth → Authorization: Basic base64(user:pass)
// Bearer Token → Authorization: Bearer <token>
// Custom Header → 自定义头名称: 值

config.json 数据源配置

通过在 data/config.json 中添加 datasources 数组来管理数据源:

{
"costEnabled": true,
"agentRuntimeArn": "arn:aws:bedrock-agentcore:...",
"datasources": [
{
"id": "prom-1",
"name": "Production Prometheus",
"type": "prometheus",
"url": "https://prometheus.example.com:9090",
"authType": "bearer",
"authConfig": { "token": "***" },
"isDefault": true
},
{
"id": "ch-1",
"name": "Analytics ClickHouse",
"type": "clickhouse",
"url": "https://clickhouse.example.com:8443",
"authType": "basic",
"authConfig": { "username": "reader", "password": "***" }
}
]
}
数据源管理原则

与现有 accounts[] 数组采用相同的模式 — 只需修改 data/config.json,无需更改代码即可添加/移除数据源。只有拥有 Admin 权限的用户才能执行 CRUD 操作。

安全:SSRF 防护

在向外部 URL 发送请求之前,会应用一层验证来防止 SSRF(Server-Side Request Forgery,服务器端请求伪造) 攻击。

// src/lib/datasource-client.ts (简化版)
function validateUrl(url: string): void {
const parsed = new URL(url);
const hostname = parsed.hostname;

// 拦截私有 IP 网段
const privatePatterns = [
/^10\./, // 10.0.0.0/8
/^172\.(1[6-9]|2\d|3[01])\./, // 172.16.0.0/12
/^192\.168\./, // 192.168.0.0/16
/^127\./, // Loopback
/^169\.254\./, // Link-local
/^0\./, // Current network
];

// 拦截 Cloud metadata endpoint
if (hostname === '169.254.169.254') {
throw new Error('SSRF blocked: cloud metadata endpoint');
}

for (const pattern of privatePatterns) {
if (pattern.test(hostname)) {
throw new Error(`SSRF blocked: private IP range (${hostname})`);
}
}
}
SSRF 为何重要

在任何允许用户输入外部 URL 的功能中,SSRF 防护都是必不可少的。如果没有防护,攻击者可以通过 http://169.254.169.254/latest/meta-data/ 窃取 EC2 IAM 凭证,或访问内部网络中的服务。AWSops 会阻断所有私有 IP 段、Cloud metadata endpoint、Link-local 和 Loopback 地址。

安全:ClickHouse SQL 注入防范

ClickHouse 查询不会将用户输入直接插入字符串,而是使用参数化查询

// src/lib/datasource-client.ts — ClickHouse 查询执行

// 危险: 直接字符串插值 (不使用)
// const query = `SELECT * FROM logs WHERE service = '${userInput}'`;

// 安全: 参数化查询
const response = await fetch(`${url}/?param_service=${encodeURIComponent(service)}`, {
method: 'POST',
body: `SELECT * FROM logs WHERE service = {service:String}`,
headers: { 'Content-Type': 'text/plain' },
});
ClickHouse 参数语法

ClickHouse 支持 {name:Type} 格式的参数绑定。通过 URL 查询参数传递 param_name=value,服务器会安全地进行绑定。这种方式从根本上杜绝了 SQL 注入。

PromQL 查询示例

在 Prometheus 数据源中使用 PromQL 查询指标的示例:

# 最近 5 分钟的 CPU 使用率 (按 Pod)
rate(container_cpu_usage_seconds_total{namespace="production"}[5m])

# 内存使用量排名前 10 的 Pod
topk(10, container_memory_working_set_bytes{namespace="production"})

# HTTP 请求错误率 (5xx)
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) * 100
// 通过 API 执行 PromQL
const response = await fetch('/awsops/api/datasources', {
method: 'POST',
body: JSON.stringify({
action: 'query',
datasourceId: 'prom-1',
query: 'rate(container_cpu_usage_seconds_total{namespace="production"}[5m])',
}),
});

Dynamic VPC CIDR

CDK 栈中的 VPC CIDR 现在可以通过上下文参数进行配置。

Before / After

项目Before (v1.7.1)After (v1.7.2)
VPC CIDR硬编码newVpcCidr 上下文参数
默认值10.10.0.0/16
TGW Route CIDRtgwRouteCidr(单个)tgwRouteCidrs(多个,逗号分隔)
向下兼容保留原有 tgwRouteCidr 参数
# 默认 VPC CIDR (10.10.0.0/16)
cdk deploy -c newVpcCidr=10.10.0.0/16

# 自定义 VPC CIDR + 多个 TGW 路由
cdk deploy \
-c newVpcCidr=10.20.0.0/16 \
-c tgwRouteCidrs=10.10.0.0/16,10.30.0.0/16,172.16.0.0/12
向下兼容性

原有的 tgwRouteCidr 参数继续有效。新的 tgwRouteCidrs 支持逗号分隔的多个 CIDR,两个参数也可以同时使用。tgwRouteCidrs 优先生效。

数据源诊断代理

新增了用于系统化诊断外部数据源连接问题的专用代理。AI 路由中新注册了 priority 11datasource 路由。

项目Before (v1.7.1)After (v1.7.2)
AI 路由数1011
新增路由datasource(priority 11)
诊断对象网络、认证、SSL/TLS、DNS

诊断代理检查的项目:

  • 网络:目标主机是否可达、防火墙/安全组配置
  • 认证:凭证有效性、令牌过期、权限不足
  • SSL/TLS:证书有效性、过期、证书链问题
  • DNS:主机名解析失败、DNS 传播延迟

版本对比

项目v1.7.1v1.7.2变更
页面3637+datasources
API 路由1314+datasources API
AI 路由1011+datasource 诊断
数据源类型07新功能
认证方式4 种None/Basic/Bearer/Custom

主要文件变更

文件变更内容
src/app/datasources/page.tsx数据源管理页面(Registry + Explore)
src/app/api/datasources/route.ts数据源 CRUD + 连接测试 + 查询执行 API
src/lib/datasource-client.tsHTTP 客户端(SSRF 防护 + 认证 + 查询)
src/lib/datasource-registry.ts7 种数据源类型注册表
src/lib/app-config.ts新增 DatasourceConfig 类型
src/components/layout/Sidebar.tsx在 Monitoring 分类中新增 Datasources
infra-cdk/lib/awsops-stack.tsnewVpcCidr 上下文参数 + tgwRouteCidrs
src/app/api/ai/route.ts新增 datasource 路由(priority 11)
新页面添加模式

本次数据源页面是第一个不依赖现有 Steampipe 查询、而与外部 HTTP 端点通信的页面。未来对接外部服务时,请参考 datasource-client.ts 中的 SSRF 防护 + 认证层。