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

v1.7.0 — マルチアカウント + リアルタイムストリーミング

· 約4分で読めます

マルチアカウント対応(PR #6)とリアルタイム Bedrock ストリーミングを核心とする大規模リリースです。セキュリティ修正 25 件が反映されました。

主要な変化

マルチアカウント (PR #6) · リアルタイムストリーミング · キャッシュプリウォーミング · セキュリティ修正 25 件 · 顧客ロゴのカスタマイズ

マルチアカウントアーキテクチャ (PR #6)

Steampipe Aggregator パターンで複数の AWS アカウントを単一ダッシュボードから管理します。data/config.jsonaccounts[] 配列を変更するだけで、コード修正なしにアカウントを追加できます。

コンポーネントファイル役割
AccountContextsrc/components/アカウント状態管理 + useAccount() フック
AccountSelectorsrc/components/アカウント切り替えドロップダウン (ARIA、キーボード対応)
AccountBadgesrc/components/アカウント別カラードット + alias 表示
buildSearchPath()src/lib/steampipe.tspublic, aws_{id}, kubernetes, trivy を返す
runCostQueriesPerAccount()src/lib/steampipe.tsアカウント別 Cost クエリ実行後、account_id タグ付けでマージ
/accounts ページsrc/app/accounts/アカウント追加/削除/テスト UI
cross_account.pyagent/STS AssumeRole (credential キャッシング、ExternalId、監査ロギング)
設定スクリプトscripts/11-setup-multi-account.shAggregator + クロスアカウント IAM ロールの自動化
コード変更範囲

すべての 25 個の SQL クエリaccount_id カラムを追加し、35 ページuseAccountContext() を適用しました。DataTable は isMultiAccount && data[0].account_id を検知すると Account カラムを自動追加します。

config.json の構造

{
"accounts": [
{
"accountId": "111111111111",
"alias": "Host",
"connectionName": "aws_111111111111",
"region": "ap-northeast-2",
"isHost": true,
"features": {
"costEnabled": true,
"eksEnabled": true,
"k8sEnabled": true
}
},
{
"accountId": "222222222222",
"alias": "Staging",
"connectionName": "aws_222222222222",
"region": "ap-northeast-2",
"isHost": false,
"features": {
"costEnabled": false,
"eksEnabled": false,
"k8sEnabled": false
}
}
]
}

セキュリティ修正 (25 件)

3 段階の深刻度に分類し、25 件のセキュリティ課題を修正しました。

CRITICAL 修正事項

クロスアカウント AssumeRole に監査ログExternalId を必須化し、権限エスカレーションと Confused Deputy 攻撃を防止します。

深刻度件数主要項目
CRITICAL2AssumeRole 監査ログ、ExternalId 必須化
HIGH5Rate Limiting (5 req/min)、入力検証の強化、execFileSync セキュリティ
MEDIUM18Pool exhaustion 防止、コネクション破棄、エラーメッセージのフィルタリング

CRITICAL 詳細:

課題リスク修正
AssumeRole 監査の不在クロスアカウントアクセスの追跡不可cross_account.py にすべての AssumeRole 呼び出しをロギング
ExternalId 未使用Confused Deputy 攻撃が可能AssumeRole に ExternalId 必須パラメータを追加

HIGH 詳細:

課題リスク修正
Rate Limiting の不在API 濫用、コスト急増AI ルートに 5 req/min の制限を適用
入力検証の不足SQL Injection が可能クエリパラメータのホワイトリスト検証
execFileSync の使用Command Injection引数配列方式へ変換

リアルタイム Bedrock ストリーミング

Bedrock 応答をチャンク単位でリアルタイム送信します。

項目Before (v1.6.0)After (v1.7.0)
Bedrock 応答全テキストを一括チャンク単位でリアルタイム
APIInvokeModelCommandInvokeModelWithResponseStreamCommand
送信方式完了後に done イベントchunk イベントを連続送信
クライアント全テキストをレンダリングstreamingContent 状態でリアルタイムレンダリング
ストリーミングヘルパー

streamBedrockToSSE() 関数(src/app/api/ai/route.ts)が Bedrock ストリームからチャンクを読み取り、SSE chunk イベントに変換します。

キャッシュプリウォーミング

ダッシュボードのロード速度を改善するため、バックグラウンドのキャッシュプリウォーミングを導入しました。

項目説明
クエリ数ダッシュボード 23 + モニタリング 10 = 33 個
更新周期4 分 (キャッシュ TTL 5 分の満了前)
初期化ensureCacheWarmerStarted() — lazy-init パターン
効果初回ページロード時にキャッシュヒットで即時応答

顧客ロゴのカスタマイズ

data/config.json で顧客ロゴを設定すると、サーバー再起動なしに 1 分以内に反映されます。

{
"customerLogo": "/logos/customer-logo.png",
"customerName": "Customer Corp",
"customerLogoBg": "#ffffff"
}
  • public/logos/ ディレクトリにロゴファイルを配置
  • config の変更のみでブランディングを切り替え — コード修正は不要

バージョン比較

項目v1.6.0v1.7.0変化
Pages3536+accounts
Components1517+AccountBadge, AccountSelector
ADRs78+マルチアカウント
デプロイスクリプト1011+Step 11
SQL クエリ2525+account_id カラム追加
セキュリティ修正-25 件CRITICAL 2, HIGH 5, MEDIUM 18