v1.7.2 — External Datasources + Dynamic VPC CIDR
Prometheus、Loki、ClickHouse など 7 種の外部データソースを Grafana スタイルで管理できる機能を追加しました。SSRF 防御と SQL Injection 防止を含むセキュリティレイヤー、動的 VPC CIDR 設定、そしてデータソース接続の問題を診断する専用エージェントも同時にリリースします。
外部データソース 7 種 · SSRF 防御 · SQL Injection 防止 · 動的 VPC CIDR · データソース診断エージェント
外部データソース管理
Grafana のデータソース管理と同様の方式で、外部オブザーバビリティ(Observability)ツールを AWSops から直接接続してクエリできます。
サポートするデータソース 7 種
| タイプ | クエリ言語 | 主な用途 |
|---|---|---|
| Prometheus | PromQL | メトリクス収集/クエリ |
| Loki | LogQL | ログ集約/検索 |
| Tempo | TraceQL | 分散トレーシング |
| ClickHouse | SQL | 分析用データウェアハウス |
| Jaeger | Trace API | 分散トレーシング |
| Dynatrace | API | APM / フルスタック可観測性 |
| Datadog | API | モニタリング / APM |
機能詳細
| 機能 | 説明 |
|---|---|
| CRUD | データソースの登録/更新/削除(Admin 専用) |
| Connection Test | ワンクリック接続テスト + 応答時間(ms)測定 |
| Query Execution | タイプ別クエリ言語で即時実行 |
| 4 種の認証 | None、Basic Auth、Bearer Token、Custom Header |
| Credential Masking | API 応答でパスワード/トークン → *** にマスキング |
| 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;
// Private 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})`);
}
}
}
外部 URL をユーザーが入力するすべての機能で、SSRF 防御は必須です。防御がない場合、攻撃者が http://169.254.169.254/latest/meta-data/ を通じて EC2 の IAM 認証情報を窃取したり、内部ネットワークのサービスにアクセスしたりできます。AWSops は Private IP レンジ、Cloud metadata endpoint、Link-local、Loopback アドレスをすべてブロックします。
セキュリティ: ClickHouse SQL Injection 防止
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 は {name:Type} 形式のパラメータバインディングをサポートします。URL クエリパラメータとして param_name=value を渡すと、サーバーが安全にバインドします。この方式により SQL Injection を根本から防止できます。
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 CIDR | tgwRouteCidr(単一) | 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 11 の datasource ルートが新たに登録されます。
| 項目 | Before (v1.7.1) | After (v1.7.2) |
|---|---|---|
| AI ルート数 | 10 | 11 |
| 新規ルート | — | datasource(priority 11) |
| 診断対象 | — | ネットワーク、認証、SSL/TLS、DNS |
診断エージェントが確認する項目:
- ネットワーク: 対象ホストへの到達可能性、ファイアウォール/セキュリティグループの設定
- 認証: 認証情報の有効性、トークンの期限切れ、権限不足
- SSL/TLS: 証明書の有効性、期限切れ、チェーンの問題
- DNS: ホスト名の解決失敗、DNS 伝播の遅延
バージョン比較
| 項目 | v1.7.1 | v1.7.2 | 変更 |
|---|---|---|---|
| ページ | 36 | 37 | +datasources |
| API ルート | 13 | 14 | +datasources API |
| AI ルート | 10 | 11 | +datasource 診断 |
| データソースタイプ | 0 | 7 | 新機能 |
| 認証方式 | — | 4 種 | None/Basic/Bearer/Custom |
主なファイル変更
| ファイル | 変更内容 |
|---|---|
src/app/datasources/page.tsx | データソース管理ページ(Registry + Explore) |
src/app/api/datasources/route.ts | データソース CRUD + 接続テスト + クエリ実行 API |
src/lib/datasource-client.ts | HTTP クライアント(SSRF 防御 + 認証 + クエリ) |
src/lib/datasource-registry.ts | 7 種データソースタイプのレジストリ |
src/lib/app-config.ts | DatasourceConfig タイプを追加 |
src/components/layout/Sidebar.tsx | Monitoring カテゴリに Datasources を追加 |
infra-cdk/lib/awsops-stack.ts | newVpcCidr コンテキストパラメータ + tgwRouteCidrs |
src/app/api/ai/route.ts | datasource ルート(priority 11)を追加 |
今回のデータソースページは、既存の Steampipe クエリではなく外部 HTTP エンドポイントと通信する最初のページです。今後外部サービスを連携する際は、datasource-client.ts の SSRF 防御 + 認証レイヤーを参考にしてください。