メインコンテンツへスキップ

v1.7.2 — External Datasources + Dynamic VPC CIDR

· 約7分で読めます

Prometheus、Loki、ClickHouse など 7 種の外部データソースを Grafana スタイルで管理できる機能を追加しました。SSRF 防御と SQL Injection 防止を含むセキュリティレイヤー、動的 VPC CIDR 設定、そしてデータソース接続の問題を診断する専用エージェントも同時にリリースします。

主な変更点

外部データソース 7 種 · SSRF 防御 · SQL Injection 防止 · 動的 VPC CIDR · データソース診断エージェント

外部データソース管理

Grafana のデータソース管理と同様の方式で、外部オブザーバビリティ(Observability)ツールを AWSops から直接接続してクエリできます。

サポートするデータソース 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.jsondatasources 配列を追加してデータソースを管理します:

{
"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})`);
}
}
}
SSRF が重要な理由

外部 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 パラメータ構文

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 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.tsDatasourceConfig タイプを追加
src/components/layout/Sidebar.tsxMonitoring カテゴリに Datasources を追加
infra-cdk/lib/awsops-stack.tsnewVpcCidr コンテキストパラメータ + tgwRouteCidrs
src/app/api/ai/route.tsdatasource ルート(priority 11)を追加
新規ページ追加パターン

今回のデータソースページは、既存の Steampipe クエリではなく外部 HTTP エンドポイントと通信する最初のページです。今後外部サービスを連携する際は、datasource-client.ts の SSRF 防御 + 認証レイヤーを参考にしてください。