v1.7.0 — 多账户 + 实时流式传输
· 阅读需 4 分钟
这是一次以多账户支持(PR #6)和实时 Bedrock 流式传输为核心的大规模发布,并包含 25 项安全修复。
核心变化
多账户 (PR #6) · 实时流式传输 · 缓存预热 · 25 项安全修复 · 客户 Logo 自定义
多账户架构 (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 项)
按三级严重程度分类,修复了 25 项安全问题。
CRITICAL 修复事项
在跨账户 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 流式传输
以块(chunk)为单位实时发送 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 模式 |
| 效果 | 首次页面加载时命中缓存,即时响应 |
客户 Logo 自定义
在 data/config.json 中配置客户 Logo 后,无需重启服务器,1 分钟内即可生效。
{
"customerLogo": "/logos/customer-logo.png",
"customerName": "Customer Corp",
"customerLogoBg": "#ffffff"
}
- 将 Logo 文件放置在
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 |