v1.7.0 — マルチアカウント + リアルタイムストリーミング
マルチアカウント対応(PR #6)とリアルタイム Bedrock ストリーミングを核心とする大規模リリースです。セキュリティ修正 25 件が反映されました。
マルチアカウント (PR #6) · リアルタイムストリーミング · キャッシュプリウォーミング · セキュリティ修正 25 件 · 顧客ロゴのカスタマイズ
マルチアカウントアーキテクチャ (PR #6)
Steampipe Aggregator パターンで複数の AWS アカウントを単一ダッシュボードから管理します。data/config.json の accounts[] 配列を変更するだけで、コード修正なしにアカウントを追加できます。
| コンポーネント | ファイル | 役割 |
|---|---|---|
AccountContext | src/components/ | アカウント状態管理 + useAccount() フック |
AccountSelector | src/components/ | アカウント切り替えドロップダウン (ARIA、キーボード対応) |
AccountBadge | src/components/ | アカウント別カラードット + alias 表示 |
buildSearchPath() | src/lib/steampipe.ts | public, aws_{id}, kubernetes, trivy を返す |
runCostQueriesPerAccount() | src/lib/steampipe.ts | アカウント別 Cost クエリ実行後、account_id タグ付けでマージ |
/accounts ページ | src/app/accounts/ | アカウント追加/削除/テスト UI |
cross_account.py | agent/ | STS AssumeRole (credential キャッシング、ExternalId、監査ロギング) |
| 設定スクリプト | scripts/11-setup-multi-account.sh | Aggregator + クロスアカウント 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 件のセキュリティ課題を修正しました。
クロスアカウント AssumeRole に監査ログと ExternalId を必須化し、権限エスカレーションと Confused Deputy 攻撃を防止します。
| 深刻度 | 件数 | 主要項目 |
|---|---|---|
| CRITICAL | 2 | AssumeRole 監査ログ、ExternalId 必須化 |
| HIGH | 5 | Rate Limiting (5 req/min)、入力検証の強化、execFileSync セキュリティ |
| MEDIUM | 18 | Pool 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 応答 | 全テキストを一括 | チャンク単位でリアルタイム |
| API | InvokeModelCommand | InvokeModelWithResponseStreamCommand |
| 送信方式 | 完了後に 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.0 | v1.7.0 | 変化 |
|---|---|---|---|
| Pages | 35 | 36 | +accounts |
| Components | 15 | 17 | +AccountBadge, AccountSelector |
| ADRs | 7 | 8 | +マルチアカウント |
| デプロイスクリプト | 10 | 11 | +Step 11 |
| SQL クエリ | 25 | 25 | +account_id カラム追加 |
| セキュリティ修正 | - | 25 件 | CRITICAL 2, HIGH 5, MEDIUM 18 |