跳到主要内容

v1.7.0 — 多账户 + 实时流式传输

· 阅读需 4 分钟

这是一次以多账户支持(PR #6)和实时 Bedrock 流式传输为核心的大规模发布,并包含 25 项安全修复

核心变化

多账户 (PR #6) · 实时流式传输 · 缓存预热 · 25 项安全修复 · 客户 Logo 自定义

多账户架构 (PR #6)

通过 Steampipe Aggregator 模式在单一仪表板中管理多个 AWS 账户。只需修改 data/config.jsonaccounts[] 数组,无需改动代码即可添加账户。

组件文件作用
AccountContextsrc/components/账户状态管理 + useAccount() 钩子
AccountSelectorsrc/components/账户切换下拉框(支持 ARIA、键盘)
AccountBadgesrc/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.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 项)

按三级严重程度分类,修复了 25 项安全问题。

CRITICAL 修复事项

在跨账户 AssumeRole 中强制启用审计日志ExternalId,防止权限升级和 Confused Deputy 攻击。

严重程度数量主要项目
CRITICAL2AssumeRole 审计日志、强制 ExternalId
HIGH5Rate Limiting(5 req/min)、强化输入验证、execFileSync 安全
MEDIUM18防止 Pool exhaustion、销毁连接、过滤错误消息

CRITICAL 详情

问题风险修复
缺少 AssumeRole 审计无法追踪跨账户访问cross_account.py 中记录所有 AssumeRole 调用
未使用 ExternalId可能遭受 Confused Deputy 攻击在 AssumeRole 中添加 ExternalId 必需参数

HIGH 详情

问题风险修复
缺少 Rate LimitingAPI 滥用、费用暴涨对 AI 路由应用 5 req/min 限制
输入验证不足可能发生 SQL Injection查询参数白名单验证
使用 execFileSyncCommand Injection转换为参数数组方式

实时 Bedrock 流式传输

以块(chunk)为单位实时发送 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 模式
效果首次页面加载时命中缓存,即时响应

客户 Logo 自定义

data/config.json 中配置客户 Logo 后,无需重启服务器,1 分钟内即可生效。

{
"customerLogo": "/logos/customer-logo.png",
"customerName": "Customer Corp",
"customerLogoBg": "#ffffff"
}
  • 将 Logo 文件放置在 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