<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.atomai.click/awsops/zh/whatsnew</id>
    <title>AWSops 사용자 가이드 Blog</title>
    <updated>2026-06-17T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.atomai.click/awsops/zh/whatsnew"/>
    <subtitle>AWSops 사용자 가이드 Blog</subtitle>
    <icon>https://www.atomai.click/awsops/zh/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[v2.0.0 — 在全新架构之上重建的 AWSops]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[基于 Terraform 的 MSA 全面重建 — 私有边缘（CloudFront VPC Origin → 内部 ALB → Fargate）、Aurora 持久化状态、应用内登录、AgentCore 分区代理、异步 Worker。流式 AI 助手·AI 诊断·拓扑·EKS·主题·移动端全面强化。]]></summary>
        <content type="html"><![CDATA[<p>我们发布了<strong>在全新架构之上从零重建的 AWSops v2.0.0</strong>。单台 EC2 单体应用被重构为<strong>基于 Terraform 的 MSA</strong>，并在其之上重新打造了 AI 助手、AI 诊断、拓扑、EKS、成本等几乎所有页面。从用户角度看，从专属域名、应用内登录到主题、移动端，整体体验焕然一新。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>Terraform MSA 转型（ECS Fargate + Aurora）</strong> · <strong>私有边缘 + 应用内登录（RS256）</strong> · <strong>流式 AI 助手（领域自动路由·线程持久化）</strong> · <strong>AI 诊断报告（深度可选 · MD/DOCX/PDF）</strong> · <strong>请求流拓扑图</strong> · <strong>EKS 集群舰队 + 集群内查询</strong> · <strong>3 种主题 + 移动端响应式</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="新架构全面重建">新架构（全面重建）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#%E6%96%B0%E6%9E%B6%E6%9E%84%E5%85%A8%E9%9D%A2%E9%87%8D%E5%BB%BA" class="hash-link" aria-label="新架构（全面重建）的直接链接" title="新架构（全面重建）的直接链接" translate="no">​</a></h2>
<p>我们解构了 v1 的单台 EC2 主机（构建、运维、本地状态全部耦合在一起的架构），重新设计为可独立部署、独立扩展各组件的架构。</p>
<table><thead><tr><th>领域</th><th>内容</th></tr></thead><tbody><tr><td><strong>IaC</strong></td><td>CDK → <strong>Terraform</strong>（S3 backend）</td></tr><tr><td><strong>计算</strong></td><td>单台 EC2 → <strong>ECS Fargate</strong>（web/worker 分离，arm64）</td></tr><tr><td><strong>数据</strong></td><td>本地状态 → <strong>Aurora Serverless v2（PostgreSQL 17）</strong> 持久化</td></tr><tr><td><strong>边缘</strong></td><td>公开 ALB → <strong>CloudFront VPC Origin → 内部 ALB → Fargate</strong>（无公开 ALB，TLS 端到端）</td></tr><tr><td><strong>认证</strong></td><td>边缘仅校验 exp → <strong>Cognito + Lambda@Edge RS256 JWKS 验证</strong></td></tr><tr><td><strong>长时任务</strong></td><td>进程内执行 → <strong>异步 Worker 层</strong>（SQS + Step Functions + Lambda/Fargate）</td></tr><tr><td><strong>路径</strong></td><td><code>/awsops</code> 前缀 → <strong>根路径（<code>/</code>）</strong>，专属域名</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="焕新的体验">焕新的体验<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#%E7%84%95%E6%96%B0%E7%9A%84%E4%BD%93%E9%AA%8C" class="hash-link" aria-label="焕新的体验的直接链接" title="焕新的体验的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>应用内登录</strong> — 在自有 <code>/login</code> 表单中使用邮箱·密码登录。未认证的请求会在边缘被引导至登录页面。</li>
<li class=""><strong>3 种主题</strong> — <strong>Cobalt（默认）· Teal · Dark</strong> 主题选择器。选择会被保存，图表和品牌标识也会随主题变化。</li>
<li class=""><strong>移动端响应式</strong> — 通过顶部栏 + 底部 5 个标签 + 滑出式抽屉，在窄屏上也能使用全部功能。</li>
<li class=""><strong>命令面板</strong> — 通过 <code>Cmd-K</code>（或 <code>Ctrl-K</code>）直达任意页面·资源，并可切换主题。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai--更快更聪明">AI — 更快、更聪明<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#ai--%E6%9B%B4%E5%BF%AB%E6%9B%B4%E8%81%AA%E6%98%8E" class="hash-link" aria-label="AI — 更快、更聪明的直接链接" title="AI — 更快、更聪明的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>AI 助手</strong> — 以令牌为单位<strong>流式输出</strong>回答，并以 <strong>Markdown（表格·代码·列表）<strong>呈现。问题会</strong>自动路由到相应领域（网络·成本·安全等）</strong>，对话<strong>持久化保存</strong>，抽屉与全屏视图共享同一份记录。</li>
<li class=""><strong>AI 诊断</strong> — 以 <strong>Light / Mid / Deep</strong> 深度生成账户运维状态综合报告，并可导出为 <strong>MD · DOCX · PDF</strong>。同时提供意图与实际的（不变式）核对，以及与上一份报告对比的变化洞察。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="更广的可见性">更广的可见性<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#%E6%9B%B4%E5%B9%BF%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7" class="hash-link" aria-label="更广的可见性的直接链接" title="更广的可见性的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>拓扑</strong> — 由 Route53 → CloudFront → LB → Target Group → 目标构成的<strong>请求流图</strong>。点击节点可进入聚焦模式 + 详情面板（复制 ARN·向 AI 提问）。</li>
<li class=""><strong>资源库存</strong> — 对 EC2·Lambda·RDS·S3·VPC·IAM 等 <strong>20 多种</strong>资源进行排序·搜索·详情查看。</li>
<li class=""><strong>EKS / Kubernetes</strong> — 集群<strong>舰队摘要</strong>与节点·Pod·Deployment 的<strong>集群内查询</strong>（只读），以及 OpenCost 安装指南。</li>
<li class=""><strong>成本</strong> — 按服务的成本分解·下钻、月末预测，以及 <strong>Bedrock 模型使用量</strong>（令牌·延迟·成本·缓存节省）。</li>
<li class=""><strong>数据源探索</strong> — 以**原生查询语言（PromQL/LogQL/TraceQL/SQL）**只读查询已连接的可观测性数据源。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="只读运维姿态">只读运维姿态<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#%E5%8F%AA%E8%AF%BB%E8%BF%90%E7%BB%B4%E5%A7%BF%E6%80%81" class="hash-link" aria-label="只读运维姿态的直接链接" title="只读运维姿态的直接链接" translate="no">​</a></h2>
<p>AWSops 专注于<strong>观察·分析·诊断</strong>运维状况，**不会变更 AWS 资源。**对于需要安装·变更的操作，我们提供脚本和指南，供用户自行执行。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用指南">使用指南<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/06/17/v2.0.0#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97" class="hash-link" aria-label="使用指南的直接链接" title="使用指南的直接链接" translate="no">​</a></h2>
<p>各个新页面的使用方法请参阅指南文档：</p>
<ul>
<li class=""><a class="" href="https://www.atomai.click/awsops/zh/intro">AWSops 简介</a></li>
<li class=""><a class="" href="https://www.atomai.click/awsops/zh/getting-started/login">登录</a> · <a class="" href="https://www.atomai.click/awsops/zh/getting-started/navigation">页面布局与主题</a></li>
<li class=""><a class="" href="https://www.atomai.click/awsops/zh/overview/dashboard">仪表盘</a> · <a class="" href="https://www.atomai.click/awsops/zh/overview/assistant">AI 助手</a> · <a class="" href="https://www.atomai.click/awsops/zh/operations/ai-diagnosis">AI 诊断</a></li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Infrastructure" term="Infrastructure"/>
        <category label="Deployment" term="Deployment"/>
        <category label="Monitoring" term="Monitoring"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.9.0 — 事件预扩容 + Aurora 数据层基础（ADR-030）]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0"/>
        <updated>2026-05-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ADR-010 Phase 1+2 事件预扩容（BedRock 计划 + 先审后执行脚本）、ADR-030 Aurora Serverless v2 基础（CDK 栈 + Schema + db.ts）、ADR-029 变更操作门禁、AI 代码审查工作流。]]></summary>
        <content type="html"><![CDATA[<p>v1.9.0 新增了<strong>事件预扩容</strong>功能，用于在可预测运维负载的事件（促销、直播、季度结算等）之前预热资源。同时，为了解构单台 EC2 主机上构建、运维、本地 JSON 状态全部耦合在一起的架构，本次还引入了 <strong>ADR-030 Aurora 数据层基础</strong>（CDK 栈、Schema、<code>db.ts</code>）。本次发布中的 Aurora 以<strong>默认 off / opt-in</strong> 的方式引入，对现有单主机部署没有影响。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>事件预扩容（ADR-010 Phase 1+2）</strong> · <strong>Aurora Serverless v2 基础（ADR-030 Phase 1）</strong> · <strong>ADR-029 变更操作门禁</strong> · <strong>AI 代码审查工作流</strong> · <strong>僵尸连接清理强化</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="事件预扩容adr-010-phase-12">事件预扩容（ADR-010 Phase 1+2）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E4%BA%8B%E4%BB%B6%E9%A2%84%E6%89%A9%E5%AE%B9adr-010-phase-12" class="hash-link" aria-label="事件预扩容（ADR-010 Phase 1+2）的直接链接" title="事件预扩容（ADR-010 Phase 1+2）的直接链接" translate="no">​</a></h2>
<p>为了能在大型流量事件开始之前预热资源，新增了 <code>/event-scaling</code> 管理员页面。从注册到脚本下载分为 4 个步骤：</p>
<ol>
<li class=""><strong>注册事件</strong> — 事件名称、开始/结束时间、受影响资源标签</li>
<li class=""><strong>采集历史指标</strong> — 如果过去发生过同类事件，则通过 GetMetricData 批量采集该时段的 CloudWatch 指标（ASG·RDS·MSK·EBS·ALB）</li>
<li class=""><strong>AI 生成预热计划</strong> — Bedrock Sonnet 4.6 为每种资源生成多阶段预扩容计划，并通过 <code>PLAN_JSON</code> 标记返回结构化结果</li>
<li class=""><strong>下载 bash 脚本</strong> — 按资源类型生成安全脚本（KEDA·HPA、Aurora 添加 Reader、MSK 分区扩展、ASG warm pool、EBS IOPS 提升）</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="先审后执行mutation-by-review">先审后执行（mutation-by-review）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E5%85%88%E5%AE%A1%E5%90%8E%E6%89%A7%E8%A1%8Cmutation-by-review" class="hash-link" aria-label="先审后执行（mutation-by-review）的直接链接" title="先审后执行（mutation-by-review）的直接链接" translate="no">​</a></h3>
<p>仪表盘**不会直接执行变更操作。**脚本仅供下载，由运维人员审阅后在合适的环境（<code>kubectl</code>、<code>aws cli</code>）中自行应用。这与 ADR-029（Proposed）的变更操作门禁模型 —「AI 生成的 mutating action 只有在获得明确的人工批准后才可执行」— 保持一致。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="相关文件">相关文件<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6" class="hash-link" aria-label="相关文件的直接链接" title="相关文件的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>文件</th><th>职责</th></tr></thead><tbody><tr><td><code>src/app/event-scaling/page.tsx</code></td><td>事件注册·指标图表·计划显示·脚本下载 UI（仅限 admin）</td></tr><tr><td><code>src/app/api/event-scaling/route.ts</code></td><td>CRUD + 指标 + Bedrock 计划 + 脚本（GET/POST/PUT/DELETE）</td></tr><tr><td><code>src/lib/event-scaling.ts</code></td><td>数据模型 + JSON 持久化（<code>data/event-scaling/</code>）</td></tr><tr><td><code>src/lib/event-scaling-prompts.ts</code></td><td>Bedrock Sonnet 4.6 提示词 + <code>PLAN_JSON</code> 解析</td></tr><tr><td><code>src/lib/event-scaling-scripts.ts</code></td><td>按资源类型的 bash 脚本生成器</td></tr><tr><td><code>src/lib/queries/event-scaling.ts</code></td><td>CloudWatch GetMetricData + ASG/RDS/MSK/EBS/ALB 资源状态查询</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aurora-数据层基础adr-030-phase-1">Aurora 数据层基础（ADR-030 Phase 1）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#aurora-%E6%95%B0%E6%8D%AE%E5%B1%82%E5%9F%BA%E7%A1%80adr-030-phase-1" class="hash-link" aria-label="Aurora 数据层基础（ADR-030 Phase 1）的直接链接" title="Aurora 数据层基础（ADR-030 Phase 1）的直接链接" translate="no">​</a></h2>
<p>由于构建服务器和运维服务器绑定在同一台 EC2 上，AgentCore Docker 构建时 Next.js 延迟会飙升、Steampipe FDW 查询会超时。为解决此问题，ADR-030 决定转向 <strong>ECS Fargate 工作负载 + Aurora 应用状态 + 双 ECR（Dev=Private、Prod=Public）</strong>。v1.9.0 仅包含其中的 <strong>Phase 1 基础</strong>部分。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="本次引入的内容">本次引入的内容<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E6%9C%AC%E6%AC%A1%E5%BC%95%E5%85%A5%E7%9A%84%E5%86%85%E5%AE%B9" class="hash-link" aria-label="本次引入的内容的直接链接" title="本次引入的内容的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>组件</th><th>说明</th></tr></thead><tbody><tr><td><code>infra-cdk/lib/awsops-data-stack.ts</code></td><td>Aurora Serverless v2 PostgreSQL 15.5（0.5–4 ACU、Writer + Reader、KMS 加密、IAM 认证、Private Subnet、<code>rds.logical_replication=1</code>）</td></tr><tr><td><code>infra-cdk/data/schema.sql</code></td><td>幂等的 7 表 Schema（<code>inventory_snapshots</code>、<code>cost_snapshots</code>、<code>agentcore_memory</code>、<code>agentcore_stats</code>、<code>alert_diagnosis</code>、<code>event_scaling_plans</code>、<code>report_schedules</code>）+ <code>schema_migrations</code> 版本追踪 + <code>touch_updated_at</code> 触发器</td></tr><tr><td><code>src/lib/db.ts</code></td><td>应用侧 pg Pool（与 Steampipe 池分离）。支持 <code>AURORA_DATABASE_URL</code> DSN 或 <code>AURORA_HOST/USER/PASSWORD/DB</code> 独立环境变量，提供 <code>isAuroraEnabled()</code> / <code>checkDbHealth()</code> 辅助函数</td></tr><tr><td><code>scripts/13-deploy-aurora.sh</code></td><td>CDK 部署 + 从 Secrets Manager 获取凭证并通过 <code>psql</code> 应用 Schema。支持 <code>deploy / schema / status / dsn</code> 子命令</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opt-in-部署">opt-in 部署<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#opt-in-%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="opt-in 部署的直接链接" title="opt-in 部署的直接链接" translate="no">​</a></h3>
<p>默认为 off。要启用，需明确指定上下文标志：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> infra-cdk</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">npx cdk deploy AwsopsDataStack </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-c</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">enableAurora</span><span class="token operator">=</span><span class="token plain">true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 或使用脚本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/scripts/13-deploy-aurora.sh deploy</span><br></span></code></pre></div></div>
<p>如此设置门禁的原因是：(1) Aurora Serverless v2 最低 0.5 ACU 计费（约 $43/月）并不适合所有环境；(2) Phase 1 dual-write 尚未引入，实际数据仍写入 <code>data/*.json</code>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="steampipe-保持不变">Steampipe 保持不变<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#steampipe-%E4%BF%9D%E6%8C%81%E4%B8%8D%E5%8F%98" class="hash-link" aria-label="Steampipe 保持不变的直接链接" title="Steampipe 保持不变的直接链接" translate="no">​</a></h3>
<p>ADR-030 的微妙之处在于：<strong>Steampipe 是 stateless 的</strong>。FDW 实时查询 AWS API 并将结果短暂存放在内存中，因此即使容器重启也没有会丢失的「数据」。Aurora 所替代的不是 Steampipe，而是仪表盘自身在 EC2 磁盘上积累的 <code>data/*.json</code>（库存·Cost·内存·alert 记录·event-scaling 计划等）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="下个版本计划phase-1-dual-write">下个版本计划（Phase 1 dual-write）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E4%B8%8B%E4%B8%AA%E7%89%88%E6%9C%AC%E8%AE%A1%E5%88%92phase-1-dual-write" class="hash-link" aria-label="下个版本计划（Phase 1 dual-write）的直接链接" title="下个版本计划（Phase 1 dual-write）的直接链接" translate="no">​</a></h3>
<p>7 个源文件将获得双写路径。写入同时进入 JSON 和 Aurora 两侧，读取在<strong>7 天奇偶校验门禁通过之前</strong>继续从 JSON 侧进行：</p>
<ul>
<li class=""><code>resource-inventory.ts</code>、<code>cost-snapshot.ts</code>、<code>agentcore-memory.ts</code>、<code>agentcore-stats.ts</code>、<code>alert-knowledge.ts</code>、<code>event-scaling.ts</code>、<code>report-scheduler.ts</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adr-029变更操作框架proposed">ADR-029：变更操作框架（Proposed）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#adr-029%E5%8F%98%E6%9B%B4%E6%93%8D%E4%BD%9C%E6%A1%86%E6%9E%B6proposed" class="hash-link" aria-label="ADR-029：变更操作框架（Proposed）的直接链接" title="ADR-029：变更操作框架（Proposed）的直接链接" translate="no">​</a></h2>
<p>事件预扩容以先审后执行的方式引入，是因为 ADR-010 Phase 3（自动执行）的门禁模型尚未确定。ADR-029 将该门禁 —「在什么条件下、以什么权限模型允许执行 AI 生成的变更操作」— 以 Proposed 状态登记，明确其为未来 Phase 3 工作的先决条件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-代码审查工作流">AI 代码审查工作流<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#ai-%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E5%B7%A5%E4%BD%9C%E6%B5%81" class="hash-link" aria-label="AI 代码审查工作流的直接链接" title="AI 代码审查工作流的直接链接" translate="no">​</a></h2>
<p>新增了在 PR 打开或更新时由 Claude 自动执行代码审查的 GitHub Actions 工作流（<code>.github/workflows/claude-review.yml</code>）。审查提示词针对 AWSops 约定（Steampipe pg Pool、basePath、SCP 阻断列等）进行了定制。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="僵尸连接清理强化">僵尸连接清理强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E5%83%B5%E5%B0%B8%E8%BF%9E%E6%8E%A5%E6%B8%85%E7%90%86%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="僵尸连接清理强化的直接链接" title="僵尸连接清理强化的直接链接" translate="no">​</a></h2>
<p><code>src/lib/steampipe.ts</code> 的僵尸清理任务改为使用专用的短生命周期 <code>Client</code>，而不再从池中借用 connection。即使 Cost Explorer/IAM 摘要 FDW 处于 hung 状态导致整个池耗尽，清理也能继续运行。阈值也缩短到了 90 秒。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="统计对比">统计对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E7%BB%9F%E8%AE%A1%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="统计对比的直接链接" title="统计对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.8.1</th><th>v1.9.0</th><th>变更</th></tr></thead><tbody><tr><td>页面</td><td>41</td><td><strong>43</strong></td><td>+2（<code>/event-scaling</code>、<code>/login</code> 修正后计入）</td></tr><tr><td>API 路由</td><td>18</td><td><strong>19</strong></td><td>+1（<code>/api/event-scaling</code>）</td></tr><tr><td>SQL 查询文件</td><td>25</td><td><strong>26</strong></td><td>+1（<code>event-scaling.ts</code>）</td></tr><tr><td>ADR</td><td>28 篇（001-028）</td><td><strong>30 篇（001-030）</strong></td><td>+2（029 Proposed、030 Accepted）</td></tr><tr><td>CDK 栈</td><td>3（Awsops·Cognito·AgentCore）</td><td><strong>4</strong></td><td>+1（<code>AwsopsDataStack</code>，opt-in）</td></tr><tr><td>部署脚本</td><td>12 步</td><td><strong>13 步</strong></td><td>+1（<code>13-deploy-aurora.sh</code>）</td></tr><tr><td>lib 文件</td><td>27</td><td><strong>31</strong></td><td>+4（<code>event-scaling*</code> 3 个、<code>db.ts</code>）</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="参考">参考<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/05/27/v1.9.0#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/whchoi98/awsops/blob/main/docs/decisions/010-event-driven-pre-scaling.md" target="_blank" rel="noopener noreferrer" class="">ADR-010: 事件驱动预扩容</a>（Phase 1+2 Accepted）</li>
<li class=""><a href="https://github.com/whchoi98/awsops/blob/main/docs/decisions/029-mutating-action-framework.md" target="_blank" rel="noopener noreferrer" class="">ADR-029: 变更操作框架</a>（Proposed）</li>
<li class=""><a href="https://github.com/whchoi98/awsops/blob/main/docs/decisions/030-ecs-fargate-aurora-split.md" target="_blank" rel="noopener noreferrer" class="">ADR-030: ECS Fargate + Aurora + 双 ECR</a>（Accepted，Phase 1 部分实现）</li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Infrastructure" term="Infrastructure"/>
        <category label="Deployment" term="Deployment"/>
        <category label="Monitoring" term="Monitoring"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.8.1 — 告警触发 AI 诊断 + 文档大幅扩充]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1"/>
        <updated>2026-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ADR-009 告警管道（CloudWatch/Alertmanager/Grafana Webhook → 关联分析 → 自动 Bedrock 诊断 → Slack 通知），新增 ADR 18 篇 + Runbook 5 篇 + 模块 CLAUDE.md 11 个。]]></summary>
        <content type="html"><![CDATA[<p>新增了接收外部告警系统事件、一站式完成<strong>关联分析 → 自动 AI 根因分析 → Slack 通知</strong>的管道。同时新增 ADR 18 篇、Runbook 5 篇、模块 CLAUDE.md 11 个、Web 指南 2 个页面（KO+EN），项目文档得到大幅加强。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>告警触发 AI 诊断（ADR-009）</strong> · <strong>4 种 Webhook（CloudWatch/Alertmanager/Grafana/Generic）</strong> · <strong>HMAC 认证</strong> · <strong>Slack Block Kit</strong> · <strong>新增 ADR 18 篇</strong> · <strong>新增 Runbook 5 篇</strong> · <strong>Web 指南扩充</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="告警触发-ai-诊断adr-009">告警触发 AI 诊断（ADR-009）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E5%91%8A%E8%AD%A6%E8%A7%A6%E5%8F%91-ai-%E8%AF%8A%E6%96%ADadr-009" class="hash-link" aria-label="告警触发 AI 诊断（ADR-009）的直接链接" title="告警触发 AI 诊断（ADR-009）的直接链接" translate="no">​</a></h2>
<p>当发生严重程度为 <code>critical</code> 的事件（incident）时，会自动执行局部 AI 诊断。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="管道流程">管道流程<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E7%AE%A1%E9%81%93%E6%B5%81%E7%A8%8B" class="hash-link" aria-label="管道流程的直接链接" title="管道流程的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[CloudWatch Alarm] → SNS Topic → SQS Queue</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                                    ↓</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                            [EC2 Poller (15s)]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                                    ↓</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">[Alertmanager/Grafana/Generic] → POST /api/alert-webhook</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                                    ↓</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                            [alert-correlation.ts]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                                    ↓</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                         [alert-diagnosis.ts (AI)]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                                    ↓</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                          [Slack/SNS 发送]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="支持的来源">支持的来源<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E6%94%AF%E6%8C%81%E7%9A%84%E6%9D%A5%E6%BA%90" class="hash-link" aria-label="支持的来源的直接链接" title="支持的来源的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>来源</th><th>接收方式</th><th>规范化 Schema</th></tr></thead><tbody><tr><td><strong>CloudWatch Alarms</strong></td><td>SNS → SQS → EC2 轮询</td><td>CloudWatch 事件</td></tr><tr><td><strong>Prometheus Alertmanager</strong></td><td>直接 Webhook（HMAC）</td><td>Alertmanager v4</td></tr><tr><td><strong>Grafana Alerting</strong></td><td>直接 Webhook（HMAC）</td><td>Grafana unified</td></tr><tr><td><strong>Generic JSON</strong></td><td>直接 Webhook（HMAC）</td><td>自定义 Schema</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="关联分析引擎">关联分析引擎<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E5%85%B3%E8%81%94%E5%88%86%E6%9E%90%E5%BC%95%E6%93%8E" class="hash-link" aria-label="关联分析引擎的直接链接" title="关联分析引擎的直接链接" translate="no">​</a></h3>
<p><code>src/lib/alert-correlation.ts</code> 将各个告警分组为<strong>事件（incident）</strong>：</p>
<table><thead><tr><th>标准</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td>时间窗口</td><td>5 分钟</td><td>合并同一服务 5 分钟内发生的告警</td></tr><tr><td>公共服务</td><td>1 个以上</td><td><code>labels.service</code> 或 <code>resource</code> 匹配</td></tr><tr><td>公共命名空间</td><td>1 个以上</td><td>K8s 告警 <code>labels.namespace</code> 匹配</td></tr><tr><td>去重</td><td>1 分钟</td><td>抑制相同 <code>fingerprint</code> 告警在 1 分钟内的重复</td></tr><tr><td>严重程度升级</td><td>5 分钟内 3 条 warning</td><td>→ 升级为 critical</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="范围受限的自动诊断">范围受限的自动诊断<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E8%8C%83%E5%9B%B4%E5%8F%97%E9%99%90%E7%9A%84%E8%87%AA%E5%8A%A8%E8%AF%8A%E6%96%AD" class="hash-link" aria-label="范围受限的自动诊断的直接链接" title="范围受限的自动诊断的直接链接" translate="no">​</a></h3>
<p>与完整的 15 部分诊断不同，它<strong>仅限于触发告警的范围</strong>，1~2 分钟内即可完成：</p>
<ol>
<li class=""><strong>构建 AlertContext</strong> — 提取受影响的服务/资源/命名空间、触发时刻（<code>since</code>）</li>
<li class=""><strong>范围受限采集</strong> — 以 <code>since</code> 为基准 ±10 分钟过滤 CloudWatch 指标，仅限相关资源</li>
<li class=""><strong>选择相关部分</strong> — 仅执行 Compute / Network / Container 等 3~5 个部分</li>
<li class=""><strong>变更检测</strong> — 对比 Terraform state / CloudTrail 近期变更</li>
<li class=""><strong>Bedrock Sonnet 分析</strong> — 推断根因 + 提出 Next Steps 建议</li>
</ol>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/alert-diagnosis.ts (核心接口)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">interface</span><span class="token plain"> </span><span class="token class-name maybe-class-name">AlertContext</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  services</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  resources</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  namespaces</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  since</span><span class="token operator">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">     </span><span class="token comment" style="color:rgb(98, 114, 164)">// 触发时刻 − 10 分钟</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  until</span><span class="token operator">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">     </span><span class="token comment" style="color:rgb(98, 114, 164)">// 触发时刻 + 10 分钟</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slack-通知block-kit">Slack 通知（Block Kit）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#slack-%E9%80%9A%E7%9F%A5block-kit" class="hash-link" aria-label="Slack 通知（Block Kit）的直接链接" title="Slack 通知（Block Kit）的直接链接" translate="no">​</a></h3>
<p>按严重程度进行频道路由 + 线程更新：</p>
<table><thead><tr><th>严重程度</th><th>默认频道</th><th>颜色</th></tr></thead><tbody><tr><td><code>critical</code></td><td><code>#incidents</code></td><td>🔴 红色</td></tr><tr><td><code>warning</code></td><td><code>#alerts</code></td><td>🟠 橙色</td></tr><tr><td><code>info</code></td><td><code>#alerts-low</code></td><td>🔵 蓝色</td></tr></tbody></table>
<ul>
<li class="">首次告警为<strong>主消息</strong>，后续事件（追加告警合并、AI 诊断结果、已解决）作为<strong>同一线程内的 reply</strong></li>
<li class="">Webhook 模式和 Bot Token 模式均支持线程（复用 <code>thread_ts</code>）</li>
<li class="">收到 CloudWatch <code>OK</code> 或 Alertmanager <code>resolved</code> 时发送 ✅ 已解决通知</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hmac-认证">HMAC 认证<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#hmac-%E8%AE%A4%E8%AF%81" class="hash-link" aria-label="HMAC 认证的直接链接" title="HMAC 认证的直接链接" translate="no">​</a></h3>
<p>共享密钥存储在 <code>data/config.json</code> 的 <code>alertWebhookSecret</code> 中：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST https://awsops.example.com/awsops/api/alert-webhook </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'X-Alert-Source: generic'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"X-Signature-256: sha256=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">printf</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'%s'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$BODY</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> openssl dgst </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-sha256</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-hmac</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$SECRET</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">awk</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'{print $2}'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Content-Type: application/json'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BODY</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="告警知识库">告警知识库<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E5%91%8A%E8%AD%A6%E7%9F%A5%E8%AF%86%E5%BA%93" class="hash-link" aria-label="告警知识库的直接链接" title="告警知识库的直接链接" translate="no">​</a></h3>
<p>诊断记录会永久保存在 <code>data/alert-diagnosis/</code> 下：</p>
<table><thead><tr><th>文件</th><th>内容</th></tr></thead><tbody><tr><td><code>incidents/&lt;id&gt;.json</code></td><td>单个事件 + AI 诊断结果</td></tr><tr><td><code>summary-&lt;YYYY-MM&gt;.json</code></td><td>月度统计（top services、alert names、resolution time）</td></tr></tbody></table>
<p>可在 UI 的 <strong>Knowledge Base</strong> 标签页中搜索过去的类似事件，当发生新事件时会基于相似度自动推荐。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="文档大幅扩充">文档大幅扩充<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E6%96%87%E6%A1%A3%E5%A4%A7%E5%B9%85%E6%89%A9%E5%85%85" class="hash-link" aria-label="文档大幅扩充的直接链接" title="文档大幅扩充的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="新增-adr-18-篇011-028">新增 ADR 18 篇（011-028）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E6%96%B0%E5%A2%9E-adr-18-%E7%AF%87011-028" class="hash-link" aria-label="新增 ADR 18 篇（011-028）的直接链接" title="新增 ADR 18 篇（011-028）的直接链接" translate="no">​</a></h3>
<p>将 v1.8.0 中新增功能的设计决策正式化：</p>
<table><thead><tr><th>编号</th><th>主题</th></tr></thead><tbody><tr><td>ADR-011</td><td>外部数据源集成（SSRF 防护 + allowlist）</td></tr><tr><td>ADR-012</td><td>SNS 通知策略</td></tr><tr><td>ADR-013</td><td>自动采集调查代理</td></tr><tr><td>ADR-014</td><td>报告生成与调度</td></tr><tr><td>ADR-015</td><td>AI 路由优先级</td></tr><tr><td>ADR-016</td><td>Bedrock 模型选择策略</td></tr><tr><td>ADR-017</td><td>缓存预热器设计</td></tr><tr><td>ADR-018</td><td>Cognito 认证流程</td></tr><tr><td>ADR-019</td><td>SSE 流式传输</td></tr><tr><td>ADR-020</td><td>HMAC Webhook 认证</td></tr><tr><td>ADR-021</td><td>Admin Email 权限模型</td></tr><tr><td>ADR-022</td><td>CDK 栈拆分</td></tr><tr><td>ADR-023</td><td>多路由并行执行</td></tr><tr><td>ADR-024</td><td>i18n（ko/en）支持</td></tr><tr><td>ADR-025</td><td>Code Interpreter 沙箱</td></tr><tr><td>ADR-026</td><td>CloudFront + Lambda@Edge</td></tr><tr><td>ADR-027</td><td>OpenCost + Prometheus（EKS 成本）</td></tr><tr><td>ADR-028</td><td>Memory Store（对话历史）</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="新增-runbook-5-篇">新增 Runbook 5 篇<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E6%96%B0%E5%A2%9E-runbook-5-%E7%AF%87" class="hash-link" aria-label="新增 Runbook 5 篇的直接链接" title="新增 Runbook 5 篇的直接链接" translate="no">​</a></h3>
<p>可在实际运维场景中使用的故障排查/配置指南：</p>
<ul>
<li class=""><code>alert-pipeline-troubleshoot.md</code> — Webhook 收不到时、关联分析无法生成事件时、Slack 不显示时</li>
<li class=""><code>cache-warmer-operations.md</code> — 缓存预热器调试、查询的添加/移除</li>
<li class=""><code>cognito-auth-troubleshoot.md</code> — Lambda@Edge、HttpOnly Cookie、OAuth2 回调问题</li>
<li class=""><code>deploy-flow.md</code> — 11 步部署脚本运维手册</li>
<li class=""><code>multi-account-setup.md</code> — Aggregator 配置、跨账户 IAM 角色、验证流程</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="新增模块-claudemd-11-个">新增模块 CLAUDE.md 11 个<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E6%96%B0%E5%A2%9E%E6%A8%A1%E5%9D%97-claudemd-11-%E4%B8%AA" class="hash-link" aria-label="新增模块 CLAUDE.md 11 个的直接链接" title="新增模块 CLAUDE.md 11 个的直接链接" translate="no">​</a></h3>
<p>将各源码模块的职责/规则/主要文件整理为 Claude 上下文文件：</p>
<table><thead><tr><th>路径</th><th>说明</th></tr></thead><tbody><tr><td><code>docs/CLAUDE.md</code></td><td>文档结构</td></tr><tr><td><code>runbooks/CLAUDE.md</code></td><td>Runbook 索引</td></tr><tr><td><code>decisions/CLAUDE.md</code></td><td>ADR 索引</td></tr><tr><td><code>agent/CLAUDE.md</code></td><td>Strands Agent + 19 Lambda</td></tr><tr><td><code>scripts/CLAUDE.md</code></td><td>11 步部署脚本</td></tr><tr><td><code>tests/CLAUDE.md</code></td><td>Vitest 结构</td></tr><tr><td><code>infra-cdk/CLAUDE.md</code></td><td>CDK 栈构成</td></tr><tr><td><code>src/app/ai-diagnosis/CLAUDE.md</code></td><td>AI 综合诊断页面</td></tr><tr><td><code>src/app/alert-settings/CLAUDE.md</code></td><td>告警设置页面</td></tr><tr><td><code>src/app/k8s/CLAUDE.md</code></td><td>K8s 页面</td></tr><tr><td><code>src/lib/collectors/CLAUDE.md</code></td><td>7 种 Auto-Collect 代理</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-指南扩充">Web 指南扩充<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#web-%E6%8C%87%E5%8D%97%E6%89%A9%E5%85%85" class="hash-link" aria-label="Web 指南扩充的直接链接" title="Web 指南扩充的直接链接" translate="no">​</a></h3>
<p>在 Docusaurus 指南中反映了 v1.8 的功能：</p>
<ul>
<li class=""><code>monitoring/ai-diagnosis.md</code> — 15 部分诊断、导出格式（DOCX/MD/PDF/PPTX）、调度、成本控制技巧</li>
<li class=""><code>monitoring/alerts.md</code> — 告警管道整体流程、HMAC、关联分析、Slack 线程、知识库</li>
<li class=""><code>intro.md</code> — 反映 40 页面 / 18 API / 11 AI 路由，新增「AI 综合诊断 &amp; 告警管道」功能块</li>
<li class=""><code>faq/troubleshooting.md</code> — Slack 通知失败 / AI 诊断部分失败案例</li>
<li class="">韩语（<code>docs/</code>）+ 英语（<code>i18n/en/docusaurus-plugin-content-docs/current/</code>）双语均已更新</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-修复亮点">Bug 修复亮点<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#bug-%E4%BF%AE%E5%A4%8D%E4%BA%AE%E7%82%B9" class="hash-link" aria-label="Bug 修复亮点的直接链接" title="Bug 修复亮点的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td><strong>Webpack 动态 import</strong></td><td>在采集器动态 import 中添加 <code>/* webpackInclude: /\.(ts|tsx|js)$/ */</code> 魔法注释 — 解决 CLAUDE.md 被包含进 webpack context 导致构建失败的问题</td></tr><tr><td><strong>Bedrock 模型 ID</strong></td><td>告警诊断使用 <code>global.anthropic.claude-sonnet-4-6</code></td></tr><tr><td><strong>Slack 线程复用</strong></td><td>在 Webhook 模式下也保存 <code>thread_ts</code>，后续事件以 reply 发送</td></tr><tr><td><strong>报告下载</strong></td><td>使用代理 URL 代替 S3 presigned URL — 解决 STS 会话过期时的 404</td></tr><tr><td><strong>SNS 邮件</strong></td><td>将 Markdown 转换为纯文本后再发送</td></tr><tr><td><strong>缓存预热器</strong></td><td>排除 Monitoring 查询（CloudWatch FDW 调用会耗尽 pg Pool）</td></tr><tr><td><strong>静默 Cookie 删除</strong></td><td>HttpOnly Cookie 通过 <code>POST /api/auth</code> 在服务器端删除</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="主要文件变更">主要文件变更<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E4%B8%BB%E8%A6%81%E6%96%87%E4%BB%B6%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="主要文件变更的直接链接" title="主要文件变更的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>文件</th><th>变更内容</th></tr></thead><tbody><tr><td><code>src/app/api/alert-webhook/route.ts</code></td><td>4 种来源 Webhook 接收 + HMAC 验证 + 关联分析触发 + 活动事件 GET</td></tr><tr><td><code>src/app/api/notification/route.ts</code></td><td>Slack Block Kit / SNS 发送（严重程度频道路由、Markdown→纯文本）</td></tr><tr><td><code>src/lib/alert-types.ts</code></td><td>各来源的规范化函数（CloudWatch/Alertmanager/Grafana/Generic）</td></tr><tr><td><code>src/lib/alert-correlation.ts</code></td><td>关联分析引擎（30 秒缓冲区、时间/服务/资源匹配）</td></tr><tr><td><code>src/lib/alert-diagnosis.ts</code></td><td>诊断编排器（策略选择、并行采集器、AlertContext 范围）</td></tr><tr><td><code>src/lib/alert-knowledge.ts</code></td><td>知识库（JSONL 存储、月度摘要、相似度检索）</td></tr><tr><td><code>src/lib/slack-notification.ts</code></td><td>Slack 客户端（Bot Token/Webhook、线程更新）</td></tr><tr><td><code>src/lib/alert-sqs-poller.ts</code></td><td>SQS 后台轮询器（SNS→SQS→EC2、DLQ、Rate Limit）</td></tr><tr><td><code>src/app/alert-settings/page.tsx</code></td><td>告警设置管理页面（仅限 Admin）</td></tr><tr><td><code>docs/decisions/ADR-011~028.md</code></td><td>新增 18 篇 ADR</td></tr><tr><td><code>docs/runbooks/*.md</code></td><td>新增 5 篇 Runbook</td></tr><tr><td><code>web/docs/monitoring/ai-diagnosis.md</code></td><td>AI 综合诊断指南</td></tr><tr><td><code>web/docs/monitoring/alerts.md</code></td><td>告警管道指南</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="版本对比">版本对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="版本对比的直接链接" title="版本对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.8.0</th><th>v1.8.1</th><th>变更</th></tr></thead><tbody><tr><td>告警管道</td><td>—</td><td><strong>Webhook + 关联分析 + AI 诊断</strong></td><td>新增</td></tr><tr><td>支持的告警来源</td><td>—</td><td><strong>4 种（CloudWatch/Alertmanager/Grafana/Generic）</strong></td><td>新增</td></tr><tr><td>Slack 通知</td><td>—</td><td><strong>Block Kit + 线程更新</strong></td><td>新增</td></tr><tr><td>ADR</td><td>10 篇（001-010）</td><td><strong>28 篇（001-028）</strong></td><td>+18</td></tr><tr><td>Runbook</td><td>—</td><td><strong>5 篇</strong></td><td>新增</td></tr><tr><td>模块 CLAUDE.md</td><td>7 个</td><td><strong>18 个</strong></td><td>+11</td></tr><tr><td>Web 指南页面</td><td>39</td><td><strong>41</strong></td><td>+2（ai-diagnosis、alerts）</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="参考">参考<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/23/v1.8.1#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接" translate="no">​</a></h2>
<ul>
<li class="">ADR-009: 告警触发 AI 诊断</li>
<li class="">ADR-012: SNS 通知策略</li>
<li class="">ADR-013: 自动采集调查代理</li>
<li class="">ADR-020: HMAC Webhook 认证</li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="alerts" term="alerts"/>
        <category label="AI" term="AI"/>
        <category label="observability" term="observability"/>
        <category label="Docs" term="Docs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.8.0 — 外部可观测性集成 + AI 综合诊断]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0"/>
        <updated>2026-04-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[对接 7 种外部可观测性平台 + 自然语言→查询、AI 路由 10→11（datasource）、15 部分 AI 综合诊断（DOCX/PDF/调度）、SSRF 防范。]]></summary>
        <content type="html"><![CDATA[<p>这是一个大型发布，将外部可观测性栈作为数据源对接，并新增了<strong>将自然语言转换为查询</strong>的功能和 <strong>15 部分 AI 综合诊断</strong>报告。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>7 种可观测性集成</strong> · <strong>自然语言 → PromQL/LogQL/TraceQL/SQL</strong> · <strong>AI 路由 10→11（<code>datasource</code>）</strong> · <strong>15 部分综合诊断 + DOCX/PDF/调度</strong> · <strong>SSRF 防范</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="外部可观测性集成7-种">外部可观测性集成（7 种）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0#%E5%A4%96%E9%83%A8%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%E9%9B%86%E6%88%907-%E7%A7%8D" class="hash-link" aria-label="外部可观测性集成（7 种）的直接链接" title="外部可观测性集成（7 种）的直接链接" translate="no">​</a></h2>
<p>在 AWS 数据之外，还可将现有可观测性平台作为数据源对接。</p>
<table><thead><tr><th>类别</th><th>平台</th></tr></thead><tbody><tr><td>Metrics</td><td>Prometheus · Dynatrace · Datadog</td></tr><tr><td>Logs</td><td>Loki · ClickHouse</td></tr><tr><td>Traces</td><td>Tempo · Jaeger</td></tr></tbody></table>
<ul>
<li class=""><code>/datasources</code> — 数据源 CRUD · 连接测试 · 认证配置</li>
<li class=""><code>/datasources/explore</code> — 直接执行查询 + <strong>AI 查询生成（自然语言 → PromQL/LogQL/TraceQL/SQL）</strong></li>
<li class="">AI 助手的 <code>datasource</code> 路由会自动分类外部指标相关问题（AI 路由从 <strong>10 → 11</strong> 扩展）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-综合诊断15-部分">AI 综合诊断（15 部分）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0#ai-%E7%BB%BC%E5%90%88%E8%AF%8A%E6%96%AD15-%E9%83%A8%E5%88%86" class="hash-link" aria-label="AI 综合诊断（15 部分）的直接链接" title="AI 综合诊断（15 部分）的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Bedrock Opus 自动将整个基础设施分析为 <strong>15 个部分</strong> — 以成本/安全/稳定性为核心</li>
<li class=""><strong>DOCX · Markdown · 浏览器 Print-to-PDF</strong> 导出</li>
<li class=""><strong>每周/双周/每月</strong>自动调度（report scheduler）</li>
<li class="">打印用报告页面 <code>/ai-diagnosis/report</code>（A4 分页）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全ssrf-防范">安全（SSRF 防范）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0#%E5%AE%89%E5%85%A8ssrf-%E9%98%B2%E8%8C%83" class="hash-link" aria-label="安全（SSRF 防范）的直接链接" title="安全（SSRF 防范）的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><code>datasource-client.ts</code> 的 URL 验证保护包括 AI 路由在内的所有外部 fetch 路径</li>
<li class="">基于 allowlist 的私有网络访问控制 + IPv6 私有/链路本地（<code>fc00::/7</code>、<code>fe80::/10</code>）检测</li>
<li class="">数据源查询和 AI 查询生成仅限管理员使用</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="其他">其他<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/07/v1.8.0#%E5%85%B6%E4%BB%96" class="hash-link" aria-label="其他的直接链接" title="其他的直接链接" translate="no">​</a></h2>
<ul>
<li class="">多路由合成引入 <strong>Converse Stream API</strong> + AgentCore 响应打字效果</li>
<li class="">自动清理僵尸 PostgreSQL 连接，通过监控查询时间范围过滤防止 pg pool 耗尽</li>
<li class="">EKS Access Entry 状态显示 + kubeconfig 注册、EKS 服务资源标签页</li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="observability" term="observability"/>
        <category label="AI" term="AI"/>
        <category label="diagnosis" term="diagnosis"/>
        <category label="Security" term="Security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.7.3 — AI 综合诊断 Overhaul + Auto-Collect 代理]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3"/>
        <updated>2026-04-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AI 综合诊断焕新（DOCX/MD/PDF 导出、定时报告）、6 种自动采集代理、FinOps MCP、EKS UX 大幅改进。]]></summary>
        <content type="html"><![CDATA[<p><strong>AI 综合诊断</strong>焕然一新。新增 DOCX/Markdown/PDF <strong>3 种导出格式</strong>、<strong>定时报告</strong>（每周/双周/每月），以及自动采集数据的 <strong>6 种 Auto-Collect 代理</strong>。EKS 页面也得到大幅改进，包括集群访问管理、Describe 面板、Service Resources 标签页等。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>AI 综合诊断焕新</strong> · <strong>DOCX/MD/PDF 导出</strong> · <strong>定时报告</strong> · <strong>6 种 Auto-Collect 代理</strong> · <strong>FinOps MCP 5 个工具</strong> · <strong>EKS 集群访问管理</strong> · <strong>Powerpipe exit code 2 处理</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-综合诊断焕新">AI 综合诊断焕新<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#ai-%E7%BB%BC%E5%90%88%E8%AF%8A%E6%96%AD%E7%84%95%E6%96%B0" class="hash-link" aria-label="AI 综合诊断焕新的直接链接" title="AI 综合诊断焕新的直接链接" translate="no">​</a></h2>
<p>原 <code>/diagnosis</code> 路径变更为 <code>/ai-diagnosis</code>，整体 UI 焕然一新。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after">Before / After<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#before--after" class="hash-link" aria-label="Before / After的直接链接" title="Before / After的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>项目</th><th>Before (v1.7.2)</th><th>After (v1.7.3)</th></tr></thead><tbody><tr><td>路径</td><td><code>/diagnosis</code></td><td><strong><code>/ai-diagnosis</code></strong></td></tr><tr><td>名称</td><td>综合诊断</td><td><strong>AI 综合诊断</strong></td></tr><tr><td>导出</td><td>PPTX</td><td><strong>DOCX + Markdown + PDF</strong></td></tr><tr><td>定时报告</td><td>—</td><td><strong>每周/双周/每月</strong></td></tr><tr><td>S3 上传</td><td>—</td><td><strong>DOCX + MD 自动上传</strong></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-种导出格式">3 种导出格式<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#3-%E7%A7%8D%E5%AF%BC%E5%87%BA%E6%A0%BC%E5%BC%8F" class="hash-link" aria-label="3 种导出格式的直接链接" title="3 种导出格式的直接链接" translate="no">​</a></h3>
<p><strong>DOCX</strong> — 基于 <code>docx</code> 包的 A4 专业报告：</p>
<ul>
<li class="">封面（标题、健康评分、账户别名、日期）</li>
<li class="">目录（超链接、Heading 1-3）</li>
<li class="">各部分强调色（成本=绿色、安全=红色、网络/EKS=紫色、闲置/MSK=橙色）</li>
<li class="">Markdown 解析（标题、表格、列表、引用、行内代码/粗体/斜体）</li>
</ul>
<p><strong>Markdown</strong> — 将所有部分合并为单个 <code>.md</code> 文件导出。</p>
<p><strong>PDF</strong> — <code>/ai-diagnosis/report</code> 专用打印页面：</p>
<ul>
<li class="">白色背景 A4 布局，CSS <code>@media print</code> 分页</li>
<li class="">通过「打印 / 保存为 PDF」按钮使用浏览器 Print-to-PDF</li>
</ul>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/report-docx.ts (主要结构)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> doc </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Document</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  sections</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">coverPage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> healthScore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> accountAlias</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">tableOfContents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token spread operator">...</span><span class="token plain">sections</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">map</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">s </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sectionPage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> accentColor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token maybe-class-name">Packer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">toBuffer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">doc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="定时报告">定时报告<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E5%AE%9A%E6%97%B6%E6%8A%A5%E5%91%8A" class="hash-link" aria-label="定时报告的直接链接" title="定时报告的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>频率</td><td>每周 / 双周 / 每月</td></tr><tr><td>时区</td><td>KST (UTC+9)</td></tr><tr><td>设置</td><td>星期（0-6）、日期（1-28）、小时（0-23）</td></tr><tr><td>存储</td><td><code>data/report-schedule.json</code></td></tr><tr><td>检查周期</td><td>每 5 分钟检查一次调度</td></tr></tbody></table>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/report-scheduler.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Schedule</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  enabled</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">boolean</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  frequency</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'weekly'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'biweekly'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'monthly'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  dayOfWeek</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)">// 0=周日 ~ 6=周六</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  dayOfMonth</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// 1~28</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  hour</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">number</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">         </span><span class="token comment" style="color:rgb(98, 114, 164)">// 以 KST 为准</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  language</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'ko'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'en'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>在 UI 中切换 ON/OFF、设置频率/星期/时间/语言后，报告会自动生成并上传到 S3。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>S3 上传</div><div class="admonitionContent_BuS1"><p>DOCX 和 Markdown 文件会自动上传到 <code>awsops-deploy-{accountId}/reports/</code> 路径。可以通过 7 天有效的 Presigned URL 下载。CDK 栈会自动添加 S3 PutObject/GetObject 权限。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-种-auto-collect-代理">6 种 Auto-Collect 代理<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#6-%E7%A7%8D-auto-collect-%E4%BB%A3%E7%90%86" class="hash-link" aria-label="6 种 Auto-Collect 代理的直接链接" title="6 种 Auto-Collect 代理的直接链接" translate="no">​</a></h2>
<p>用于自动化 AI 综合诊断报告数据采集的专用代理。每个代理从多个来源并行采集数据，并实时流式传输采集状态。</p>
<table><thead><tr><th>代理</th><th>来源</th><th>采集项目</th></tr></thead><tbody><tr><td><strong>EKS Optimize</strong></td><td>Prometheus + K8s + Steampipe</td><td>CPU/内存使用率、节流、Pod 重启、HTTP 5xx、节点利用率</td></tr><tr><td><strong>DB Optimize</strong></td><td>Steampipe + CloudWatch</td><td>RDS/ElastiCache/OpenSearch 实例发现 + 基于指标的合理调整</td></tr><tr><td><strong>MSK Optimize</strong></td><td>Steampipe + CloudWatch + Prometheus</td><td>Broker 指标、消息吞吐量、消费者滞后、分区数</td></tr><tr><td><strong>Idle Scan</strong></td><td>Steampipe</td><td>未挂载 EBS、gp2 卷、未使用 EIP、已停止 EC2、90 天以上快照、未使用 SG + 成本估算</td></tr><tr><td><strong>Trace Analyze</strong></td><td>Tempo/Jaeger + Prometheus</td><td>各服务的错误追踪、超过 500ms 的慢追踪</td></tr><tr><td><strong>Incident</strong></td><td>CloudWatch + K8s + Prometheus</td><td>ALARM 状态告警、Warning 事件、HTTP 5xx 激增、CPU 尖峰、内存压力</td></tr></tbody></table>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/collectors/types.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">interface</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Collector</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">collect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">send</span><span class="token operator">:</span><span class="token plain"> </span><span class="token maybe-class-name">SendFn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> accountId</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> isEn</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">boolean</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token operator">&lt;</span><span class="token maybe-class-name">CollectorResult</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">formatContext</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">data</span><span class="token operator">:</span><span class="token plain"> </span><span class="token maybe-class-name">CollectorResult</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  analysisPrompt</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  displayName</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Collector 模式</div><div class="admonitionContent_BuS1"><p>所有代理都实现相同的 <code>Collector</code> 接口。<code>collect()</code> 通过 <code>Promise.allSettled</code> 并行采集多个来源，并通过 <code>SendFn</code> 回调实时传递进度。添加新代理时只需实现这个接口即可。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finops-mcp-lambda">FinOps MCP Lambda<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#finops-mcp-lambda" class="hash-link" aria-label="FinOps MCP Lambda的直接链接" title="FinOps MCP Lambda的直接链接" translate="no">​</a></h2>
<p>Cost Gateway 新增了 <strong>5 个 FinOps 工具</strong>。</p>
<table><thead><tr><th>工具</th><th>来源</th><th>说明</th></tr></thead><tbody><tr><td><code>get_rightsizing_recommendations</code></td><td>Compute Optimizer</td><td>EC2/RDS/ECS/Lambda 合理调整 + 每月节省额</td></tr><tr><td><code>get_savings_plans_recommendations</code></td><td>Cost Explorer</td><td>Savings Plans 购买建议（1 年/3 年，No Upfront）</td></tr><tr><td><code>get_reserved_instance_recommendations</code></td><td>Cost Explorer</td><td>RI 购买建议（EC2/RDS/ElastiCache/Redshift）</td></tr><tr><td><code>get_cost_optimization_hub_recommendations</code></td><td>Cost Optimization Hub</td><td>综合优化建议（Rightsize/Stop/Upgrade/SP）</td></tr><tr><td><code>get_trusted_advisor_cost_checks</code></td><td>Trusted Advisor</td><td>成本优化类别检查 + 被标记的资源</td></tr></tbody></table>
<p>所有工具都支持通过 <code>target_account_id</code> 参数进行跨账户查询。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="eksk8s-ux-大幅改进">EKS/K8s UX 大幅改进<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#eksk8s-ux-%E5%A4%A7%E5%B9%85%E6%94%B9%E8%BF%9B" class="hash-link" aria-label="EKS/K8s UX 大幅改进的直接链接" title="EKS/K8s UX 大幅改进的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="集群访问管理">集群访问管理<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E9%9B%86%E7%BE%A4%E8%AE%BF%E9%97%AE%E7%AE%A1%E7%90%86" class="hash-link" aria-label="集群访问管理的直接链接" title="集群访问管理的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td><strong>访问状态徽章</strong></td><td>按集群显示是否已注册 "Access Entry"</td></tr><tr><td><strong>一键注册</strong></td><td>通过 "Register ViewPolicy" 按钮自动创建 Access Entry + Policy</td></tr><tr><td><strong>连接检测</strong></td><td>根据 K8s 查询结果中是否存在 <code>context_name</code> 判断实际连接状态</td></tr><tr><td><strong>CLI 指南</strong></td><td>为未连接的集群提供基于 EC2 Role ARN 的注册命令指南</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="新功能">新功能<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E6%96%B0%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="新功能的直接链接" title="新功能的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>功能</th><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><strong>Describe 面板</strong></td><td><code>K9sDetailPanel</code></td><td>JSONB 详细信息（labels、annotations、containers、volumes、conditions）</td></tr><tr><td><strong>Service Resources 标签页</strong></td><td><code>k8s.ts</code></td><td>各服务的 CPU/Memory 条形图（Pod 选择器关联）</td></tr><tr><td><strong>集群过滤</strong></td><td><code>k8s/page.tsx</code></td><td>点击集群卡片过滤节点/Pod/事件/服务</td></tr><tr><td><strong>StatsCard 导航</strong></td><td><code>StatsCard.tsx</code></td><td>点击跳转，如 Nodes→<code>/k8s/nodes</code>、Pods→<code>/k8s/pods</code></td></tr><tr><td><strong>SQL 整合</strong></td><td><code>queries/k8s.ts</code></td><td>将内联 SQL 移至中央查询文件 + 新增缓存预热器</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-修复">Bug 修复<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#bug-%E4%BF%AE%E5%A4%8D" class="hash-link" aria-label="Bug 修复的直接链接" title="Bug 修复的直接链接" translate="no">​</a></h3>
<ul>
<li class="">修正 <code>external_ip</code> → <code>external_ips</code> 列名（服务 0/0 的 bug）</li>
<li class="">修复 EC2 IAM Role ARN 截断问题（SQL <code>||</code> 运算符与过滤冲突）</li>
<li class="">防止点击 Register 时触发集群过滤切换（<code>stopPropagation</code>）</li>
<li class="">注册后通过轮询确认连接（5 次 × 3 秒）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarkpowerpipe-exit-code-2-处理">Benchmark：Powerpipe Exit Code 2 处理<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#benchmarkpowerpipe-exit-code-2-%E5%A4%84%E7%90%86" class="hash-link" aria-label="Benchmark：Powerpipe Exit Code 2 处理的直接链接" title="Benchmark：Powerpipe Exit Code 2 处理的直接链接" translate="no">​</a></h2>
<p>当基准测试控制项存在告警时，Powerpipe 会以 <strong>exit code 2</strong> 退出。这是正常行为，但原有代码将其视为异常退出。</p>
<table><thead><tr><th>项目</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>判断标准</td><td>exit code === 0</td><td><strong>输出文件存在 + 大小 &gt; 0</strong></td></tr><tr><td>exit code 2</td><td>按错误处理</td><td><strong>按正常处理</strong></td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># 忽略 exit code，以输出文件的有效性来判断</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">powerpipe benchmark run </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">. </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${tmpFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator file-descriptor important">2</span><span class="token operator">&gt;</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${errorFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${tmpFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">mv</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${tmpFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${resultFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"done"</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${statusFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${statusFile}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="基础设施s3-报告上传--update-infra-脚本">基础设施：S3 报告上传 + update-infra 脚本<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BDs3-%E6%8A%A5%E5%91%8A%E4%B8%8A%E4%BC%A0--update-infra-%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="基础设施：S3 报告上传 + update-infra 脚本的直接链接" title="基础设施：S3 报告上传 + update-infra 脚本的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3-策略">S3 策略<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#s3-%E7%AD%96%E7%95%A5" class="hash-link" aria-label="S3 策略的直接链接" title="S3 策略的直接链接" translate="no">​</a></h3>
<p>CDK 栈中新增了 EC2 角色的 S3 权限：</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// infra-cdk/lib/awsops-stack.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ec2Role</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">addToPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">iam</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access maybe-class-name" style="color:rgb(80, 250, 123)">PolicyStatement</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  actions</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'s3:PutObject'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'s3:GetObject'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  resources</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">arn:aws:s3:::awsops-deploy-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">this</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token template-string interpolation property-access">account</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">/reports/*</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-infra-脚本">update-infra 脚本<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#update-infra-%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="update-infra 脚本的直接链接" title="update-infra 脚本的直接链接" translate="no">​</a></h3>
<p>无需替换 EC2 即可安全更新 CDK 栈的 <code>00-update-infra.sh</code> 脚本：</p>
<ol>
<li class=""><strong>读取现有栈参数</strong> — 从 CloudFormation 保留当前值</li>
<li class=""><strong>恢复 CDK 上下文</strong> — 从在线基础设施重新提取 VPC、TGW、域名等</li>
<li class=""><strong>cdk diff 预览</strong> — 警告是否会替换 EC2</li>
<li class=""><strong>部署</strong> — 使用 <code>--no-rollback</code> 安全部署</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="版本对比">版本对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="版本对比的直接链接" title="版本对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.7.2</th><th>v1.7.3</th><th>变更</th></tr></thead><tbody><tr><td>诊断路径</td><td><code>/diagnosis</code></td><td><strong><code>/ai-diagnosis</code></strong></td><td>名称变更</td></tr><tr><td>导出</td><td>PPTX</td><td><strong>DOCX + MD + PDF</strong></td><td>3 种</td></tr><tr><td>定时报告</td><td>—</td><td><strong>每周/双周/每月</strong></td><td>新增</td></tr><tr><td>Auto-Collect</td><td>—</td><td><strong>6 种代理</strong></td><td>新增</td></tr><tr><td>FinOps 工具</td><td>—</td><td><strong>5 个 MCP 工具</strong></td><td>新增</td></tr><tr><td>EKS 访问</td><td>手动</td><td><strong>一键注册</strong></td><td>改进</td></tr><tr><td>Benchmark</td><td>依赖 exit code</td><td><strong>验证输出文件</strong></td><td>修复</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="主要文件变更">主要文件变更<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/06/v1.7.3#%E4%B8%BB%E8%A6%81%E6%96%87%E4%BB%B6%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="主要文件变更的直接链接" title="主要文件变更的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>文件</th><th>变更内容</th></tr></thead><tbody><tr><td><code>src/app/ai-diagnosis/page.tsx</code></td><td>诊断页面焕新（路径变更、定时 UI）</td></tr><tr><td><code>src/app/ai-diagnosis/report/page.tsx</code></td><td>PDF 打印专用页面</td></tr><tr><td><code>src/app/api/report/route.ts</code></td><td>报告生成 API（15 个部分，S3 上传）</td></tr><tr><td><code>src/lib/report-docx.ts</code></td><td>DOCX 生成器（封面、目录、各部分样式）</td></tr><tr><td><code>src/lib/report-scheduler.ts</code></td><td>定时报告调度器（每 5 分钟检查）</td></tr><tr><td><code>src/lib/report-prompts.ts</code></td><td>15 个部分的 Bedrock 分析提示词</td></tr><tr><td><code>src/lib/report-generator.ts</code></td><td>数据采集编排器</td></tr><tr><td><code>src/lib/collectors/*.ts</code></td><td>6 种 Auto-Collect 代理</td></tr><tr><td><code>agent/lambda/aws_finops_mcp.py</code></td><td>FinOps MCP Lambda（5 个工具）</td></tr><tr><td><code>src/app/api/benchmark/route.ts</code></td><td>Powerpipe exit code 2 处理</td></tr><tr><td><code>src/lib/queries/k8s.ts</code></td><td>K8s SQL 查询整合 + Service Resources</td></tr><tr><td><code>src/components/dashboard/StatsCard.tsx</code></td><td>点击导航（<code>href</code> prop）</td></tr><tr><td><code>infra-cdk/lib/awsops-stack.ts</code></td><td>新增 S3 reports/* 策略</td></tr><tr><td><code>scripts/00-update-infra.sh</code></td><td>安全的基础设施更新脚本</td></tr></tbody></table>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Container" term="Container"/>
        <category label="Cost" term="Cost"/>
        <category label="Deployment" term="Deployment"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.7.2 — External Datasources + Dynamic VPC CIDR]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2"/>
        <updated>2026-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Grafana 风格的外部数据源管理（7 种）、SSRF/SQL 注入防护、动态 VPC CIDR、新增数据源诊断代理。]]></summary>
        <content type="html"><![CDATA[<p>新增了以 Grafana 风格管理 Prometheus、Loki、ClickHouse 等 <strong>7 种外部数据源</strong>的功能。本次发布还包含涵盖 SSRF 防护和 SQL 注入防范的安全层、<strong>动态 VPC CIDR</strong> 配置，以及用于诊断数据源连接问题的<strong>专用代理</strong>。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>7 种外部数据源</strong> · <strong>SSRF 防护</strong> · <strong>SQL 注入防范</strong> · <strong>动态 VPC CIDR</strong> · <strong>数据源诊断代理</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="外部数据源管理">外部数据源管理<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E5%A4%96%E9%83%A8%E6%95%B0%E6%8D%AE%E6%BA%90%E7%AE%A1%E7%90%86" class="hash-link" aria-label="外部数据源管理的直接链接" title="外部数据源管理的直接链接" translate="no">​</a></h2>
<p>您可以采用与 Grafana 数据源管理类似的方式，在 AWSops 中直接连接并查询外部可观测性（Observability）工具。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="支持的-7-种数据源">支持的 7 种数据源<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E6%94%AF%E6%8C%81%E7%9A%84-7-%E7%A7%8D%E6%95%B0%E6%8D%AE%E6%BA%90" class="hash-link" aria-label="支持的 7 种数据源的直接链接" title="支持的 7 种数据源的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>类型</th><th>查询语言</th><th>主要用途</th></tr></thead><tbody><tr><td><strong>Prometheus</strong></td><td>PromQL</td><td>指标采集/查询</td></tr><tr><td><strong>Loki</strong></td><td>LogQL</td><td>日志聚合/检索</td></tr><tr><td><strong>Tempo</strong></td><td>TraceQL</td><td>分布式追踪</td></tr><tr><td><strong>ClickHouse</strong></td><td>SQL</td><td>分析型数据仓库</td></tr><tr><td><strong>Jaeger</strong></td><td>Trace API</td><td>分布式追踪</td></tr><tr><td><strong>Dynatrace</strong></td><td>API</td><td>APM / 全栈可观测</td></tr><tr><td><strong>Datadog</strong></td><td>API</td><td>监控 / APM</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="功能详情">功能详情<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E5%8A%9F%E8%83%BD%E8%AF%A6%E6%83%85" class="hash-link" aria-label="功能详情的直接链接" title="功能详情的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td><strong>CRUD</strong></td><td>数据源注册/修改/删除（仅限 Admin）</td></tr><tr><td><strong>Connection Test</strong></td><td>一键连接测试 + 响应时间（ms）测量</td></tr><tr><td><strong>Query Execution</strong></td><td>按类型使用相应查询语言即时执行</td></tr><tr><td><strong>4 种认证</strong></td><td>None、Basic Auth、Bearer Token、Custom Header</td></tr><tr><td><strong>Credential Masking</strong></td><td>API 响应中的密码/令牌 → <code>***</code> 掩码</td></tr><tr><td><strong>i18n</strong></td><td>支持韩语 + 英语</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="认证配置示例">认证配置示例<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E8%AE%A4%E8%AF%81%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="认证配置示例的直接链接" title="认证配置示例的直接链接" translate="no">​</a></h3>
<p>支持 4 种认证方式，可根据数据源类型选择合适的方式：</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/datasource-client.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token class-name maybe-class-name">AuthType</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'none'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'basic'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'bearer'</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'custom-header'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Basic Auth → Authorization: Basic base64(user:pass)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Bearer Token → Authorization: Bearer &lt;token&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Custom Header → 自定义头名称: 值</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configjson-数据源配置">config.json 数据源配置<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#configjson-%E6%95%B0%E6%8D%AE%E6%BA%90%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="config.json 数据源配置的直接链接" title="config.json 数据源配置的直接链接" translate="no">​</a></h3>
<p>通过在 <code>data/config.json</code> 中添加 <code>datasources</code> 数组来管理数据源：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"costEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"agentRuntimeArn"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"arn:aws:bedrock-agentcore:..."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"datasources"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prom-1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Production Prometheus"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prometheus"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://prometheus.example.com:9090"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"authType"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"bearer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"authConfig"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"***"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"isDefault"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ch-1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Analytics ClickHouse"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"clickhouse"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://clickhouse.example.com:8443"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"authType"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"basic"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"authConfig"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"username"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reader"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"password"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"***"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>数据源管理原则</div><div class="admonitionContent_BuS1"><p>与现有 <code>accounts[]</code> 数组采用相同的模式 — 只需修改 <code>data/config.json</code>，无需更改代码即可添加/移除数据源。只有拥有 Admin 权限的用户才能执行 CRUD 操作。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全ssrf-防护">安全：SSRF 防护<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E5%AE%89%E5%85%A8ssrf-%E9%98%B2%E6%8A%A4" class="hash-link" aria-label="安全：SSRF 防护的直接链接" title="安全：SSRF 防护的直接链接" translate="no">​</a></h2>
<p>在向外部 URL 发送请求之前，会应用一层验证来防止 <strong>SSRF（Server-Side Request Forgery，服务器端请求伪造）</strong> 攻击。</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/datasource-client.ts (简化版)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">validateUrl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">url</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> parsed </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name constant" style="color:rgb(189, 147, 249)">URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> hostname </span><span class="token operator">=</span><span class="token plain"> parsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">hostname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// 拦截私有 IP 网段</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> privatePatterns </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token regex regex-delimiter">/</span><span class="token regex regex-source language-regex anchor function" style="color:rgb(80, 250, 123)">^</span><span class="token regex regex-source language-regex">10</span><span class="token regex regex-source language-regex special-escape escape">\.</span><span class="token regex regex-delimiter">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">                          </span><span class="token comment" style="color:rgb(98, 114, 164)">// 10.0.0.0/8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">/</span><span class="token operator">^</span><span class="token number">172</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">6</span><span class="token operator">-</span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">|</span><span class="token number">2</span><span class="token plain">\d</span><span class="token operator">|</span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">01</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// 172.16.0.0/12</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">/</span><span class="token operator">^</span><span class="token number">192</span><span class="token plain">\</span><span class="token number">.168</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">                     </span><span class="token comment" style="color:rgb(98, 114, 164)">// 192.168.0.0/16</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">/</span><span class="token operator">^</span><span class="token number">127</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">                          </span><span class="token comment" style="color:rgb(98, 114, 164)">// Loopback</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">/</span><span class="token operator">^</span><span class="token number">169</span><span class="token plain">\</span><span class="token number">.254</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">                     </span><span class="token comment" style="color:rgb(98, 114, 164)">// Link-local</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">/</span><span class="token operator">^</span><span class="token number">0</span><span class="token plain">\</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">                            </span><span class="token comment" style="color:rgb(98, 114, 164)">// Current network</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// 拦截 Cloud metadata endpoint</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hostname </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'169.254.169.254'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'SSRF blocked: cloud metadata endpoint'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> pattern </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">of</span><span class="token plain"> privatePatterns</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">pattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">hostname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">SSRF blocked: private IP range (</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">hostname</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">)</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>SSRF 为何重要</div><div class="admonitionContent_BuS1"><p>在任何允许用户输入外部 URL 的功能中，SSRF 防护都是必不可少的。如果没有防护，攻击者可以通过 <code>http://169.254.169.254/latest/meta-data/</code> 窃取 EC2 IAM 凭证，或访问内部网络中的服务。AWSops 会阻断所有私有 IP 段、Cloud metadata endpoint、Link-local 和 Loopback 地址。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全clickhouse-sql-注入防范">安全：ClickHouse SQL 注入防范<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E5%AE%89%E5%85%A8clickhouse-sql-%E6%B3%A8%E5%85%A5%E9%98%B2%E8%8C%83" class="hash-link" aria-label="安全：ClickHouse SQL 注入防范的直接链接" title="安全：ClickHouse SQL 注入防范的直接链接" translate="no">​</a></h2>
<p>ClickHouse 查询不会将用户输入直接插入字符串，而是使用<strong>参数化查询</strong>：</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/lib/datasource-client.ts — ClickHouse 查询执行</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// 危险: 直接字符串插值 (不使用)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// const query = `SELECT * FROM logs WHERE service = '${userInput}'`;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// 安全: 参数化查询</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation">url</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string string" style="color:rgb(255, 121, 198)">/?param_service=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">${</span><span class="token template-string interpolation function" style="color:rgb(80, 250, 123)">encodeURIComponent</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token template-string interpolation">service</span><span class="token template-string interpolation punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  method</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'POST'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  body</span><span class="token operator">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token template-string string" style="color:rgb(255, 121, 198)">SELECT * FROM logs WHERE service = {service:String}</span><span class="token template-string template-punctuation string" style="color:rgb(255, 121, 198)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  headers</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string-property property">'Content-Type'</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'text/plain'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>ClickHouse 参数语法</div><div class="admonitionContent_BuS1"><p>ClickHouse 支持 <code>{name:Type}</code> 格式的参数绑定。通过 URL 查询参数传递 <code>param_name=value</code>，服务器会安全地进行绑定。这种方式从根本上杜绝了 SQL 注入。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="promql-查询示例">PromQL 查询示例<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#promql-%E6%9F%A5%E8%AF%A2%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="PromQL 查询示例的直接链接" title="PromQL 查询示例的直接链接" translate="no">​</a></h2>
<p>在 Prometheus 数据源中使用 PromQL 查询指标的示例：</p>
<div class="language-promql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-promql codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 最近 5 分钟的 CPU 使用率 (按 Pod)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">rate(container_cpu_usage_seconds_total{namespace="production"}[5m])</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 内存使用量排名前 10 的 Pod</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">topk(10, container_memory_working_set_bytes{namespace="production"})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># HTTP 请求错误率 (5xx)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sum(rate(http_requests_total{status=~"5.."}[5m]))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  / sum(rate(http_requests_total[5m])) * 100</span><br></span></code></pre></div></div>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// 通过 API 执行 PromQL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">fetch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'/awsops/api/datasources'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  method</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'POST'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  body</span><span class="token operator">:</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">stringify</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    action</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'query'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    datasourceId</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'prom-1'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    query</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'rate(container_cpu_usage_seconds_total{namespace="production"}[5m])'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-vpc-cidr">Dynamic VPC CIDR<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#dynamic-vpc-cidr" class="hash-link" aria-label="Dynamic VPC CIDR的直接链接" title="Dynamic VPC CIDR的直接链接" translate="no">​</a></h2>
<p>CDK 栈中的 VPC CIDR 现在可以通过<strong>上下文参数</strong>进行配置。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after">Before / After<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#before--after" class="hash-link" aria-label="Before / After的直接链接" title="Before / After的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>项目</th><th>Before (v1.7.1)</th><th>After (v1.7.2)</th></tr></thead><tbody><tr><td>VPC CIDR</td><td>硬编码</td><td><strong><code>newVpcCidr</code> 上下文参数</strong></td></tr><tr><td>默认值</td><td>—</td><td><code>10.10.0.0/16</code></td></tr><tr><td>TGW Route CIDR</td><td><code>tgwRouteCidr</code>（单个）</td><td><strong><code>tgwRouteCidrs</code>（多个，逗号分隔）</strong></td></tr><tr><td>向下兼容</td><td>—</td><td>保留原有 <code>tgwRouteCidr</code> 参数</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># 默认 VPC CIDR (10.10.0.0/16)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cdk deploy </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-c</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">newVpcCidr</span><span class="token operator">=</span><span class="token number">10.10</span><span class="token plain">.0.0/16</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 自定义 VPC CIDR + 多个 TGW 路由</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cdk deploy </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-c</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">newVpcCidr</span><span class="token operator">=</span><span class="token number">10.20</span><span class="token plain">.0.0/16 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-c</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">tgwRouteCidrs</span><span class="token operator">=</span><span class="token number">10.10</span><span class="token plain">.0.0/16,10.30.0.0/16,172.16.0.0/12</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>向下兼容性</div><div class="admonitionContent_BuS1"><p>原有的 <code>tgwRouteCidr</code> 参数继续有效。新的 <code>tgwRouteCidrs</code> 支持逗号分隔的多个 CIDR，两个参数也可以同时使用。<code>tgwRouteCidrs</code> 优先生效。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="数据源诊断代理">数据源诊断代理<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E6%95%B0%E6%8D%AE%E6%BA%90%E8%AF%8A%E6%96%AD%E4%BB%A3%E7%90%86" class="hash-link" aria-label="数据源诊断代理的直接链接" title="数据源诊断代理的直接链接" translate="no">​</a></h2>
<p>新增了用于<strong>系统化诊断</strong>外部数据源连接问题的专用代理。AI 路由中新注册了 <strong>priority 11</strong> 的 <code>datasource</code> 路由。</p>
<table><thead><tr><th>项目</th><th>Before (v1.7.1)</th><th>After (v1.7.2)</th></tr></thead><tbody><tr><td>AI 路由数</td><td>10</td><td><strong>11</strong></td></tr><tr><td>新增路由</td><td>—</td><td><code>datasource</code>（priority 11）</td></tr><tr><td>诊断对象</td><td>—</td><td>网络、认证、SSL/TLS、DNS</td></tr></tbody></table>
<p>诊断代理检查的项目：</p>
<ul>
<li class=""><strong>网络</strong>：目标主机是否可达、防火墙/安全组配置</li>
<li class=""><strong>认证</strong>：凭证有效性、令牌过期、权限不足</li>
<li class=""><strong>SSL/TLS</strong>：证书有效性、过期、证书链问题</li>
<li class=""><strong>DNS</strong>：主机名解析失败、DNS 传播延迟</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="版本对比">版本对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="版本对比的直接链接" title="版本对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.7.1</th><th>v1.7.2</th><th>变更</th></tr></thead><tbody><tr><td>页面</td><td>36</td><td><strong>37</strong></td><td>+datasources</td></tr><tr><td>API 路由</td><td>13</td><td><strong>14</strong></td><td>+datasources API</td></tr><tr><td>AI 路由</td><td>10</td><td><strong>11</strong></td><td>+datasource 诊断</td></tr><tr><td>数据源类型</td><td>0</td><td><strong>7</strong></td><td>新功能</td></tr><tr><td>认证方式</td><td>—</td><td><strong>4 种</strong></td><td>None/Basic/Bearer/Custom</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="主要文件变更">主要文件变更<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/04/01/v1.7.2#%E4%B8%BB%E8%A6%81%E6%96%87%E4%BB%B6%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="主要文件变更的直接链接" title="主要文件变更的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>文件</th><th>变更内容</th></tr></thead><tbody><tr><td><code>src/app/datasources/page.tsx</code></td><td>数据源管理页面（Registry + Explore）</td></tr><tr><td><code>src/app/api/datasources/route.ts</code></td><td>数据源 CRUD + 连接测试 + 查询执行 API</td></tr><tr><td><code>src/lib/datasource-client.ts</code></td><td>HTTP 客户端（SSRF 防护 + 认证 + 查询）</td></tr><tr><td><code>src/lib/datasource-registry.ts</code></td><td>7 种数据源类型注册表</td></tr><tr><td><code>src/lib/app-config.ts</code></td><td>新增 <code>DatasourceConfig</code> 类型</td></tr><tr><td><code>src/components/layout/Sidebar.tsx</code></td><td>在 Monitoring 分类中新增 Datasources</td></tr><tr><td><code>infra-cdk/lib/awsops-stack.ts</code></td><td><code>newVpcCidr</code> 上下文参数 + <code>tgwRouteCidrs</code></td></tr><tr><td><code>src/app/api/ai/route.ts</code></td><td>新增 <code>datasource</code> 路由（priority 11）</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>新页面添加模式</div><div class="admonitionContent_BuS1"><p>本次数据源页面是第一个不依赖现有 Steampipe 查询、而与<strong>外部 HTTP 端点</strong>通信的页面。未来对接外部服务时，请参考 <code>datasource-client.ts</code> 中的 SSRF 防护 + 认证层。</p></div></div>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Datasources" term="Datasources"/>
        <category label="Security" term="Security"/>
        <category label="Infrastructure" term="Infrastructure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.7.1 — Converse Stream API + 流式 UX 改进]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在多路由合成中引入 Bedrock Converse Stream API，为 Gateway 响应添加打字效果，并为监控查询新增时间范围过滤。]]></summary>
        <content type="html"><![CDATA[<p>本次发布在多路由合成中引入了 <strong>Bedrock Converse Stream API</strong>，并为 AgentCore Gateway 响应应用了<strong>打字效果</strong>。同时为监控查询新增了<strong>时间范围过滤</strong>，解决了 pg pool 耗尽问题。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>Converse Stream API</strong> · <strong>打字效果（50 字符/15ms）</strong> · <strong>聊天气泡宽度稳定化</strong> · <strong>3 项监控查询时间过滤</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="借助-converse-stream-api-实现实时合成">借助 Converse Stream API 实现实时合成<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#%E5%80%9F%E5%8A%A9-converse-stream-api-%E5%AE%9E%E7%8E%B0%E5%AE%9E%E6%97%B6%E5%90%88%E6%88%90" class="hash-link" aria-label="借助 Converse Stream API 实现实时合成的直接链接" title="借助 Converse Stream API 实现实时合成的直接链接" translate="no">​</a></h2>
<p>多路由响应合成从伪分块转换为<strong>真正的令牌流式传输</strong>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after">Before / After<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#before--after" class="hash-link" aria-label="Before / After的直接链接" title="Before / After的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>项目</th><th>Before (v1.7.0)</th><th>After (v1.7.1)</th></tr></thead><tbody><tr><td>合成 API</td><td><code>InvokeModelCommand</code></td><td><strong><code>ConverseStreamCommand</code></strong></td></tr><tr><td>合成函数</td><td><code>synthesizeResponses()</code></td><td><strong><code>synthesizeResponsesStreaming()</code></strong></td></tr><tr><td>流式方式</td><td>生成完整响应 → <code>simulateStreaming()</code></td><td>令牌生成后立即发送 <code>chunk</code> 事件</td></tr><tr><td>首个令牌延迟</td><td>等待整个响应完成（5~15 秒）</td><td><strong>~200ms</strong>（首个令牌立即到达）</td></tr><tr><td>用户体感</td><td>长时间等待后快速输出</td><td>立即开始，流畅自然</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="代码变更">代码变更<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#%E4%BB%A3%E7%A0%81%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="代码变更的直接链接" title="代码变更的直接链接" translate="no">​</a></h3>
<p><strong>Before</strong> — <code>synthesizeResponses()</code> + <code>simulateStreaming()</code>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/app/api/ai/route.ts (v1.7.0)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> synthesized </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">synthesizeResponses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  lastMsg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> successful</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> modelKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> clientLang</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// 将完成的文本按 50 字符切分做伪流式传输</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">simulateStreaming</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">synthesized</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p><strong>After</strong> — <code>synthesizeResponsesStreaming()</code> + <code>ConverseStreamCommand</code>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/app/api/ai/route.ts (v1.7.1)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> synthesized </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">synthesizeResponsesStreaming</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  lastMsg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> successful</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> modelKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> clientLang</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// send() 回调在每个 contentBlockDelta 时立即发送 chunk</span><br></span></code></pre></div></div>
<p><strong><code>synthesizeResponsesStreaming()</code> 核心逻辑</strong>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> bedrockClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name">ConverseStreamCommand</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  modelId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  system</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> text</span><span class="token operator">:</span><span class="token plain"> systemPrompt </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  messages</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> role</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'user'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> content</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> text</span><span class="token operator">:</span><span class="token plain"> synthesisPrompt </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  inferenceConfig</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> maxTokens</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">4096</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> event </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">of</span><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">stream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">contentBlockDelta</span><span class="token operator">?.</span><span class="token plain">delta</span><span class="token operator">?.</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> text </span><span class="token operator">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">contentBlockDelta</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">delta</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    fullContent </span><span class="token operator">+=</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'chunk'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> delta</span><span class="token operator">:</span><span class="token plain"> text </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// 立即发送令牌</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="打字效果simulatestreaming">打字效果（<code>simulateStreaming</code>）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#%E6%89%93%E5%AD%97%E6%95%88%E6%9E%9Csimulatestreaming" class="hash-link" aria-label="打字效果simulatestreaming的直接链接" title="打字效果simulatestreaming的直接链接" translate="no">​</a></h2>
<p>由于 AgentCore Gateway 会一次性返回完整文本，因此需要模拟打字效果。</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// src/app/api/ai/route.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_SIZE</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">     </span><span class="token comment" style="color:rgb(98, 114, 164)">// 每个分块 50 字符</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_DELAY_MS</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// 分块间 15ms 延迟</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">simulateStreaming</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  text</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function-variable function" style="color:rgb(80, 250, 123)">send</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">event</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> data</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">any</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token operator">&lt;</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">let</span><span class="token plain"> i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_SIZE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> chunk </span><span class="token operator">=</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">slice</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> i </span><span class="token operator">+</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_SIZE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">send</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'chunk'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> delta</span><span class="token operator">:</span><span class="token plain"> chunk </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">i </span><span class="token operator">+</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_SIZE</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name">Promise</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">r </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">setTimeout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">r</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">CHUNK_DELAY_MS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>应用位置</strong>（3 处）：</p>
<ol>
<li class=""><strong>单个 AgentCore Gateway 响应</strong> — 对完整文本应用打字效果</li>
<li class=""><strong>多路由合成（v1.7.0）</strong> — 应用于 <code>synthesizeResponses()</code> 结果（v1.7.1 中已由 Converse Stream 替代）</li>
<li class=""><strong>多路由单一成功</strong> — 仅有 1 个 Gateway 成功的情况</li>
</ol>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>为什么需要模拟？</div><div class="admonitionContent_BuS1"><p>Bedrock 直接调用可以通过 <code>InvokeModelWithResponseStreamCommand</code> 实现真正的流式传输，但 AgentCore Gateway 会在内部多次调用工具后<strong>只返回最终文本</strong>。为了给用户提供一致的流式体验，我们应用了 50 字符/15ms 的打字效果。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="聊天气泡宽度稳定化pr-8">聊天气泡宽度稳定化（PR #8）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#%E8%81%8A%E5%A4%A9%E6%B0%94%E6%B3%A1%E5%AE%BD%E5%BA%A6%E7%A8%B3%E5%AE%9A%E5%8C%96pr-8" class="hash-link" aria-label="聊天气泡宽度稳定化（PR #8）的直接链接" title="聊天气泡宽度稳定化（PR #8）的直接链接" translate="no">​</a></h2>
<p>修复了 SSE 流式传输过程中聊天气泡宽度突然变化的问题。</p>
<table><thead><tr><th>项目</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>CSS</td><td><code>max-w-5xl</code></td><td><strong><code>w-full max-w-5xl</code></strong></td></tr><tr><td>行为</td><td>内容增加时宽度跳变</td><td>从首个 chunk 起固定为最大宽度</td></tr><tr><td>文件</td><td><code>src/app/ai/page.tsx</code></td><td>相同</td></tr></tbody></table>
<p><strong>Before</strong> — 宽度跳变:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">max-w-5xl rounded-lg px-4 py-3 ...</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- 内容短时较窄，内容变长时突然变宽 --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></span></code></pre></div></div>
<p><strong>After</strong> — 宽度稳定:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">w-full max-w-5xl rounded-lg px-4 py-3 ...</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- 从一开始就用 w-full 占满最大宽度，用 max-w-5xl 限制上限 --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>CSS 模式</div><div class="admonitionContent_BuS1"><p>对于像 SSE 流式传输这样内容逐步增加的容器，请使用 <strong><code>w-full max-w-{size}</code></strong> 组合。
只使用 <code>max-w-{size}</code> 时，宽度会随内容量而变化。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="监控查询时间范围过滤">监控查询时间范围过滤<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#%E7%9B%91%E6%8E%A7%E6%9F%A5%E8%AF%A2%E6%97%B6%E9%97%B4%E8%8C%83%E5%9B%B4%E8%BF%87%E6%BB%A4" class="hash-link" aria-label="监控查询时间范围过滤的直接链接" title="监控查询时间范围过滤的直接链接" translate="no">​</a></h2>
<p>修复了没有时间范围限制的监控查询通过 Steampipe API 拉取<strong>全部历史数据</strong>、占满 pg pool 全部 5 个连接的问题。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>查询</th><th>文件</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td><code>ec2CpuHourly</code></td><td><code>queries/metrics.ts</code></td><td>无时间限制</td><td><code>WHERE timestamp &gt;= NOW() - INTERVAL '24 hours'</code></td></tr><tr><td><code>ebsIopsHourly</code></td><td><code>queries/metrics.ts</code></td><td><code>WHERE r.timestamp IS NOT NULL</code></td><td><code>AND r.timestamp &gt;= NOW() - INTERVAL '24 hours'</code></td></tr><tr><td><code>rdsCpuDaily</code></td><td><code>queries/metrics.ts</code></td><td>无时间限制</td><td><code>WHERE timestamp &gt;= NOW() - INTERVAL '30 days'</code></td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>pg Pool 耗尽症状</div><div class="admonitionContent_BuS1"><p>在 46+ 台 EC2 实例 + 大量 EBS 卷的环境中，无时间限制的查询会<strong>占用连接长达数分钟</strong>。
当 pg pool 的 <code>max: 5</code> 全部被占用时，仪表盘和所有页面都会等待到 <code>statement_timeout: 120s</code> 后失败。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-种流式模式概览">3 种流式模式概览<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/29/v1.7.1#3-%E7%A7%8D%E6%B5%81%E5%BC%8F%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%A7%88" class="hash-link" aria-label="3 种流式模式概览的直接链接" title="3 种流式模式概览的直接链接" translate="no">​</a></h2>
<p>在 v1.7.1 中，AWSops AI 响应会根据场景使用 3 种流式模式。</p>
<table><thead><tr><th>模式</th><th>使用时机</th><th>实现</th><th>首个令牌延迟</th></tr></thead><tbody><tr><td><strong>Real Streaming</strong></td><td>Bedrock 直接调用</td><td><code>InvokeModelWithResponseStreamCommand</code></td><td>~200ms</td></tr><tr><td><strong>Converse Stream</strong></td><td>多路由合成</td><td><code>ConverseStreamCommand</code> + <code>contentBlockDelta</code></td><td>~200ms</td></tr><tr><td><strong>Simulated Streaming</strong></td><td>AgentCore Gateway 响应</td><td><code>simulateStreaming()</code>（50 字符/15ms）</td><td>响应完成后立即</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>统一的客户端体验</div><div class="admonitionContent_BuS1"><p>由于 3 种模式都使用相同的 SSE <code>chunk</code> 事件，客户端（<code>src/app/ai/page.tsx</code>）无需区分模式，只需将 delta 累加到 <code>streamingContent</code> 状态中，并通过 ReactMarkdown 实时渲染。</p></div></div>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Streaming" term="Streaming"/>
        <category label="AI" term="AI"/>
        <category label="Monitoring" term="Monitoring"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.7.0 — 多账户 + 实时流式传输]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0"/>
        <updated>2026-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[多账户支持(PR #6)、实时 Bedrock 流式传输、缓存预热、25 项安全修复、客户 Logo 自定义。]]></summary>
        <content type="html"><![CDATA[<p>这是一次以<strong>多账户支持</strong>（PR #6）和<strong>实时 Bedrock 流式传输</strong>为核心的大规模发布，并包含 <strong>25 项安全修复</strong>。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>多账户 (PR #6)</strong> · <strong>实时流式传输</strong> · <strong>缓存预热</strong> · <strong>25 项安全修复</strong> · <strong>客户 Logo 自定义</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="多账户架构-pr-6">多账户架构 (PR #6)<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E5%A4%9A%E8%B4%A6%E6%88%B7%E6%9E%B6%E6%9E%84-pr-6" class="hash-link" aria-label="多账户架构 (PR #6)的直接链接" title="多账户架构 (PR #6)的直接链接" translate="no">​</a></h2>
<p>通过 Steampipe Aggregator 模式在单一仪表板中管理多个 AWS 账户。只需修改 <code>data/config.json</code> 的 <code>accounts[]</code> 数组，无需改动代码即可添加账户。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>组件</th><th>文件</th><th>作用</th></tr></thead><tbody><tr><td><code>AccountContext</code></td><td><code>src/components/</code></td><td>账户状态管理 + <code>useAccount()</code> 钩子</td></tr><tr><td><code>AccountSelector</code></td><td><code>src/components/</code></td><td>账户切换下拉框（支持 ARIA、键盘）</td></tr><tr><td><code>AccountBadge</code></td><td><code>src/components/</code></td><td>各账户彩色圆点 + alias 显示</td></tr><tr><td><code>buildSearchPath()</code></td><td><code>src/lib/steampipe.ts</code></td><td>返回 <code>public, aws_{id}, kubernetes, trivy</code></td></tr><tr><td><code>runCostQueriesPerAccount()</code></td><td><code>src/lib/steampipe.ts</code></td><td>按账户执行 Cost 查询后以 <code>account_id</code> 标记并合并</td></tr><tr><td><code>/accounts</code> 页面</td><td><code>src/app/accounts/</code></td><td>账户添加/删除/测试 UI</td></tr><tr><td><code>cross_account.py</code></td><td><code>agent/</code></td><td>STS AssumeRole（credential 缓存、ExternalId、审计日志）</td></tr><tr><td>配置脚本</td><td><code>scripts/11-setup-multi-account.sh</code></td><td>Aggregator + 跨账户 IAM 角色自动化</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>代码变更范围</div><div class="admonitionContent_BuS1"><p>在全部 <strong>25 个 SQL 查询</strong>中添加了 <code>account_id</code> 列，并在 <strong>35 个页面</strong>中应用了 <code>useAccountContext()</code>。DataTable 在检测到 <code>isMultiAccount &amp;&amp; data[0].account_id</code> 时会自动添加 Account 列。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configjson-结构">config.json 结构<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#configjson-%E7%BB%93%E6%9E%84" class="hash-link" aria-label="config.json 结构的直接链接" title="config.json 结构的直接链接" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"accounts"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"accountId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"111111111111"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"alias"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Host"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"connectionName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"aws_111111111111"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"region"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ap-northeast-2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"isHost"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"features"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"costEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"eksEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"k8sEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"accountId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"222222222222"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"alias"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Staging"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"connectionName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"aws_222222222222"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"region"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ap-northeast-2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"isHost"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"features"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"costEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"eksEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"k8sEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全修复25-项">安全修复（25 项）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E5%AE%89%E5%85%A8%E4%BF%AE%E5%A4%8D25-%E9%A1%B9" class="hash-link" aria-label="安全修复（25 项）的直接链接" title="安全修复（25 项）的直接链接" translate="no">​</a></h2>
<p>按三级严重程度分类，修复了 25 项安全问题。</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>CRITICAL 修复事项</div><div class="admonitionContent_BuS1"><p>在跨账户 AssumeRole 中强制启用<strong>审计日志</strong>和 <strong>ExternalId</strong>，防止权限升级和 Confused Deputy 攻击。</p></div></div>
<table><thead><tr><th>严重程度</th><th>数量</th><th>主要项目</th></tr></thead><tbody><tr><td><strong>CRITICAL</strong></td><td>2</td><td>AssumeRole 审计日志、强制 ExternalId</td></tr><tr><td><strong>HIGH</strong></td><td>5</td><td>Rate Limiting（5 req/min）、强化输入验证、<code>execFileSync</code> 安全</td></tr><tr><td><strong>MEDIUM</strong></td><td>18</td><td>防止 Pool exhaustion、销毁连接、过滤错误消息</td></tr></tbody></table>
<p><strong>CRITICAL 详情</strong>：</p>
<table><thead><tr><th>问题</th><th>风险</th><th>修复</th></tr></thead><tbody><tr><td>缺少 AssumeRole 审计</td><td>无法追踪跨账户访问</td><td>在 <code>cross_account.py</code> 中记录所有 AssumeRole 调用</td></tr><tr><td>未使用 ExternalId</td><td>可能遭受 Confused Deputy 攻击</td><td>在 AssumeRole 中添加 ExternalId 必需参数</td></tr></tbody></table>
<p><strong>HIGH 详情</strong>：</p>
<table><thead><tr><th>问题</th><th>风险</th><th>修复</th></tr></thead><tbody><tr><td>缺少 Rate Limiting</td><td>API 滥用、费用暴涨</td><td>对 AI 路由应用 5 req/min 限制</td></tr><tr><td>输入验证不足</td><td>可能发生 SQL Injection</td><td>查询参数白名单验证</td></tr><tr><td>使用 <code>execFileSync</code></td><td>Command Injection</td><td>转换为参数数组方式</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实时-bedrock-流式传输">实时 Bedrock 流式传输<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E5%AE%9E%E6%97%B6-bedrock-%E6%B5%81%E5%BC%8F%E4%BC%A0%E8%BE%93" class="hash-link" aria-label="实时 Bedrock 流式传输的直接链接" title="实时 Bedrock 流式传输的直接链接" translate="no">​</a></h2>
<p>以块（chunk）为单位实时发送 Bedrock 响应。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>Before (v1.6.0)</th><th>After (v1.7.0)</th></tr></thead><tbody><tr><td>Bedrock 响应</td><td>一次性返回全部文本</td><td><strong>按块实时</strong></td></tr><tr><td>API</td><td><code>InvokeModelCommand</code></td><td><code>InvokeModelWithResponseStreamCommand</code></td></tr><tr><td>发送方式</td><td>完成后 <code>done</code> 事件</td><td>连续发送 <code>chunk</code> 事件</td></tr><tr><td>客户端</td><td>渲染完整文本</td><td>通过 <code>streamingContent</code> 状态实时渲染</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>流式传输辅助函数</div><div class="admonitionContent_BuS1"><p><code>streamBedrockToSSE()</code> 函数（<code>src/app/api/ai/route.ts</code>）从 Bedrock 流中读取块并转换为 SSE <code>chunk</code> 事件。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="缓存预热">缓存预热<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E7%BC%93%E5%AD%98%E9%A2%84%E7%83%AD" class="hash-link" aria-label="缓存预热的直接链接" title="缓存预热的直接链接" translate="no">​</a></h2>
<p>为改善仪表板加载速度，引入了后台缓存预热。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>查询数</td><td>仪表板 23 个 + 监控 10 个 = <strong>33 个</strong></td></tr><tr><td>刷新周期</td><td><strong>4 分钟</strong>（在缓存 TTL 5 分钟到期前）</td></tr><tr><td>初始化</td><td><code>ensureCacheWarmerStarted()</code> — lazy-init 模式</td></tr><tr><td>效果</td><td>首次页面加载时命中缓存，<strong>即时响应</strong></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="客户-logo-自定义">客户 Logo 自定义<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E5%AE%A2%E6%88%B7-logo-%E8%87%AA%E5%AE%9A%E4%B9%89" class="hash-link" aria-label="客户 Logo 自定义的直接链接" title="客户 Logo 自定义的直接链接" translate="no">​</a></h2>
<p>在 <code>data/config.json</code> 中配置客户 Logo 后，无需重启服务器，1 分钟内即可生效。</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"customerLogo"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/logos/customer-logo.png"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"customerName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Customer Corp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"customerLogoBg"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#ffffff"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<ul>
<li class="">将 Logo 文件放置在 <code>public/logos/</code> 目录</li>
<li class="">仅通过修改 config 即可切换品牌 — 无需改动代码</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="版本对比">版本对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/24/v1.7.0#%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="版本对比的直接链接" title="版本对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.6.0</th><th>v1.7.0</th><th>变化</th></tr></thead><tbody><tr><td>Pages</td><td>35</td><td><strong>36</strong></td><td>+accounts</td></tr><tr><td>Components</td><td>15</td><td><strong>17</strong></td><td>+AccountBadge, AccountSelector</td></tr><tr><td>ADRs</td><td>7</td><td><strong>8</strong></td><td>+多账户</td></tr><tr><td>部署脚本</td><td>10</td><td><strong>11</strong></td><td>+Step 11</td></tr><tr><td>SQL 查询</td><td>25</td><td>25</td><td>+添加 account_id 列</td></tr><tr><td>安全修复</td><td>-</td><td><strong>25 项</strong></td><td>CRITICAL 2, HIGH 5, MEDIUM 18</td></tr></tbody></table>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Multi-Account" term="Multi-Account"/>
        <category label="Security" term="Security"/>
        <category label="Streaming" term="Streaming"/>
        <category label="Cost" term="Cost"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.6.0 — 多语言(i18n) + Bedrock 监控]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0"/>
        <updated>2026-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[韩语/英语多语言支持、Bedrock 各模型用量仪表板、AI token 费用显示、搭建 Docusaurus 用户指南站点。]]></summary>
        <content type="html"><![CDATA[<p>本版本新增<strong>多语言（韩/英）支持</strong>和 <strong>Bedrock 监控仪表板</strong>，并搭建了基于 Docusaurus 的用户指南站点。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心新增</div><div class="admonitionContent_BuS1"><p><strong>韩/英多语言</strong> · <strong>500+ 翻译键</strong> · <strong>Bedrock 监控仪表板</strong> · <strong>AI token 费用显示</strong> · <strong>Docusaurus 指南站点</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="多语言支持-i18n">多语言支持 (i18n)<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0#%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%94%AF%E6%8C%81-i18n" class="hash-link" aria-label="多语言支持 (i18n)的直接链接" title="多语言支持 (i18n)的直接链接" translate="no">​</a></h2>
<p>基于 React Context + localStorage，无需 URL 路由即可切换语言。该设计不会与 Next.js 的 <code>basePath: '/awsops'</code> 冲突。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>Before (v1.5)</th><th>After (v1.6.0)</th></tr></thead><tbody><tr><td>语言</td><td>仅韩语</td><td>韩语 + 英语</td></tr><tr><td>翻译键</td><td>0</td><td><strong>500+</strong>（每种语言）</td></tr><tr><td>语言切换</td><td>无</td><td>Sidebar EN/한 切换按钮</td></tr><tr><td>AI 响应语言</td><td>仅韩语</td><td>根据设置自动切换韩/英</td></tr><tr><td>URL 变更</td><td>-</td><td>无（避免 basePath 冲突）</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>为什么不使用基于 URL 的 i18n？</div><div class="admonitionContent_BuS1"><p>由于设置了 Next.js 的 <code>basePath: '/awsops'</code>，Next.js 内置 i18n 的 locale 前缀（<code>/ko/awsops</code>、<code>/en/awsops</code>）会与之冲突。React Context + localStorage 方式不改变 URL，从而规避了这个问题。</p></div></div>
<p><strong>翻译范围</strong>：</p>
<ul>
<li class="">全部 35 个页面的文本</li>
<li class="">Header、Sidebar 菜单标签</li>
<li class="">AI 状态消息（分析中、Gateway 连接中、完成等）</li>
<li class="">DataTable 列标题</li>
<li class="">StatsCard 标签</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bedrock-监控bedrock">Bedrock 监控（<code>/bedrock</code>）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0#bedrock-%E7%9B%91%E6%8E%A7bedrock" class="hash-link" aria-label="bedrock-监控bedrock的直接链接" title="bedrock-监控bedrock的直接链接" translate="no">​</a></h2>
<p>通过 CloudWatch 指标和 AWSops 应用自身的 token 追踪来监控 Bedrock 各模型的用量。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td><strong>各模型用量</strong></td><td>Claude Sonnet、Opus 等各模型的调用次数/token</td></tr><tr><td><strong>Account vs AWSops</strong></td><td>AWSops 应用占 AWS 账户整体 Bedrock 用量的比例</td></tr><tr><td><strong>AI token 费用</strong></td><td>在聊天响应中显示输入/输出 token 数 + USD 费用</td></tr><tr><td><strong>提示词缓存</strong></td><td>显示缓存命中率，确认成本节省效果</td></tr><tr><td><strong>默认范围</strong></td><td>7 天（可更改）</td></tr><tr><td><strong>API 路由</strong></td><td><code>/api/bedrock-metrics</code>（<code>src/app/api/bedrock-metrics/route.ts</code>）</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>AI token 费用显示</div><div class="admonitionContent_BuS1"><p>在聊天响应底部以 <code>输入: 2,450 token · 输出: 1,200 token · $0.0234</code> 的形式显示费用。
用户可以实时确认每个问题的费用，提高成本意识。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docusaurus-用户指南">Docusaurus 用户指南<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0#docusaurus-%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97" class="hash-link" aria-label="Docusaurus 用户指南的直接链接" title="Docusaurus 用户指南的直接链接" translate="no">​</a></h2>
<p>在 <code>web/</code> 目录中搭建了基于 Docusaurus 的用户指南站点。</p>
<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>目录</td><td><code>web/</code></td></tr><tr><td>语言</td><td>韩语（默认）+ 英语</td></tr><tr><td>截图</td><td>Playwright 自动生成（Multi-DPR）</td></tr><tr><td>部署</td><td>GitHub Pages（<code>gh-pages</code> 分支）</td></tr><tr><td>PR</td><td>#4（Multi-DPR 截图）、#5（Docusaurus 指南站点）</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="版本对比">版本对比<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/21/v1.6.0#%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="版本对比的直接链接" title="版本对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>v1.5</th><th>v1.6.0</th></tr></thead><tbody><tr><td>页面</td><td>32</td><td><strong>35</strong></td></tr><tr><td>路由</td><td>47</td><td><strong>50</strong></td></tr><tr><td>翻译键</td><td>0</td><td><strong>500+</strong></td></tr><tr><td>语言支持</td><td>韩语</td><td><strong>韩/英</strong></td></tr><tr><td>Bedrock 监控</td><td>无</td><td><strong>各模型仪表板</strong></td></tr><tr><td>文档站点</td><td>无</td><td><strong>Docusaurus</strong></td></tr></tbody></table>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="i18n" term="i18n"/>
        <category label="Monitoring" term="Monitoring"/>
        <category label="AI" term="AI"/>
        <category label="Docs" term="Docs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.5 — Memory Store + 新页面 + 容器成本]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AgentCore Memory（对话历史保留 365 天）、EBS/MSK/OpenSearch 页面、ECS/EKS 容器成本分析、OpenCost 集成。]]></summary>
        <content type="html"><![CDATA[<p>本版本引入 <strong>AgentCore Memory Store</strong>，按用户保留 365 天的对话历史。同时新增 EBS、MSK、OpenSearch 页面以及 ECS/EKS 容器成本分析。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心新增</div><div class="admonitionContent_BuS1"><p><strong>Memory Store（365 天）</strong> · <strong>4 个新页面</strong> · <strong>ECS/EKS 容器成本</strong> · <strong>OpenCost 集成</strong> · <strong>移除 3 处硬编码值</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-memory-store">AgentCore Memory Store<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5#agentcore-memory-store" class="hash-link" aria-label="AgentCore Memory Store的直接链接" title="AgentCore Memory Store的直接链接" translate="no">​</a></h2>
<p>引入了按用户保留 365 天对话历史的 Memory Store。存储/检索逻辑在 <code>src/lib/agentcore-memory.ts</code> 中管理。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>保留期限</td><td>365 天（<code>eventExpiryDuration</code>）</td></tr><tr><td>用户隔离</td><td>从 Cognito JWT 提取 email（<code>src/lib/auth-utils.ts</code>）</td></tr><tr><td>存储数据</td><td>问题、摘要、路由、使用的工具、响应时间</td></tr><tr><td>配置脚本</td><td><code>06e-setup-agentcore-memory.sh</code></td></tr><tr><td>配置文件</td><td><code>data/config.json</code> 中的 <code>memoryId</code>、<code>memoryName</code></td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Memory 命名规则</div><div class="admonitionContent_BuS1"><p>Memory 名称中<strong>不能使用连字符（-）</strong>，只允许下划线（_）。
正确示例：<code>awsops_memory</code> / 错误示例：<code>awsops-memory</code></p></div></div>
<p><strong>AgentCore 页面集成</strong>：</p>
<ul>
<li class="">6 个 StatsCard：总调用次数、平均响应时间、各 Gateway 调用比例、各模型 token 用量</li>
<li class="">对话历史搜索：关键词、日期范围、按路由过滤</li>
</ul>
<p><strong>AI 页面集成</strong>：</p>
<ul>
<li class="">在底部切换面板中查看对话历史</li>
<li class="">可引用之前的问题/响应上下文</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="新页面4-个">新页面（4 个）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5#%E6%96%B0%E9%A1%B5%E9%9D%A24-%E4%B8%AA" class="hash-link" aria-label="新页面（4 个）的直接链接" title="新页面（4 个）的直接链接" translate="no">​</a></h2>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>页面</th><th>路径</th><th>查询文件</th><th>主要功能</th></tr></thead><tbody><tr><td><strong>EBS</strong></td><td><code>/ebs</code></td><td><code>queries/ebs.ts</code></td><td>卷/快照、加密、EC2 附加、Idle 卷检测</td></tr><tr><td><strong>MSK</strong></td><td><code>/msk</code></td><td><code>queries/msk.ts</code></td><td>Kafka 集群、Broker 节点指标（CPU/Memory/Network）、KRaft 模式</td></tr><tr><td><strong>OpenSearch</strong></td><td><code>/opensearch</code></td><td><code>queries/opensearch.ts</code></td><td>域、N2N/At-Rest 加密、VPC 配置、集群状态</td></tr><tr><td><strong>Resource Inventory</strong></td><td><code>/inventory</code></td><td><code>resource-inventory.ts</code></td><td>18 类资源数量趋势（基于快照，零额外查询）</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Steampipe JSONB 注意事项</div><div class="admonitionContent_BuS1"><ul>
<li class=""><strong>MSK</strong>：<code>provisioned</code> 列为 JSONB，包含 Broker 数量、存储大小等</li>
<li class=""><strong>OpenSearch</strong>：需确认 <code>encryption_at_rest_options</code> JSONB 中的 <code>enabled</code> 字段</li>
<li class="">编写查询前必须通过 <code>information_schema.columns</code> 确认列名</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="容器成本分析">容器成本分析<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5#%E5%AE%B9%E5%99%A8%E6%88%90%E6%9C%AC%E5%88%86%E6%9E%90" class="hash-link" aria-label="容器成本分析的直接链接" title="容器成本分析的直接链接" translate="no">​</a></h2>
<p>新增了分析 ECS 和 EKS 容器成本的 2 个页面和 API。</p>
<table><thead><tr><th>项目</th><th>ECS（<code>/container-cost</code>）</th><th>EKS（<code>/eks-container-cost</code>）</th></tr></thead><tbody><tr><td><strong>数据源</strong></td><td>CloudWatch Container Insights</td><td>OpenCost API</td></tr><tr><td><strong>回退</strong></td><td>无</td><td>基于 Request 的计算</td></tr><tr><td><strong>成本计算</strong></td><td>应用 Fargate vCPU/GB 价格</td><td>Pod CPU/Memory 分配成本</td></tr><tr><td><strong>API 路由</strong></td><td><code>/api/container-cost</code></td><td><code>/api/eks-container-cost</code></td></tr><tr><td><strong>配置</strong></td><td>-</td><td><code>06f-setup-opencost.sh</code>（Prometheus + OpenCost）</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-路由改进">AI 路由改进<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5#ai-%E8%B7%AF%E7%94%B1%E6%94%B9%E8%BF%9B" class="hash-link" aria-label="AI 路由改进的直接链接" title="AI 路由改进的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>AgentCore 配置</td><td>代码内硬编码</td><td>从 <code>data/config.json</code> 读取 ARN</td></tr><tr><td>工具使用显示</td><td>无</td><td>通过关键词匹配推断 MCP 工具 → UI 徽章</td></tr><tr><td>多路由失败</td><td>整体失败</td><td>Bedrock Direct 回退</td></tr><tr><td>超时</td><td>60 秒</td><td><strong>90 秒</strong></td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>工具使用推断</div><div class="admonitionContent_BuS1"><p>AgentCore 仅返回最终文本（没有 <code>tool_call</code> 标签）。<code>extractUsedTools()</code> 函数在响应内容中匹配关键词，推断使用的 MCP 工具并以徽章形式显示在 UI 上。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全强化">安全强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/16/v1.5#%E5%AE%89%E5%85%A8%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="安全强化的直接链接" title="安全强化的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>问题</th><th>修复内容</th></tr></thead><tbody><tr><td>Sign Out</td><td>通过服务端 API 删除 HttpOnly Cookie（<code>POST /api/auth</code>）</td></tr><tr><td>硬编码 #1</td><td>Steampipe 密码 → 动态获取</td></tr><tr><td>硬编码 #2</td><td>Code Interpreter ID → <code>data/config.json</code></td></tr><tr><td>硬编码 #3</td><td>Gateway URL → <code>data/config.json</code></td></tr></tbody></table>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Database" term="Database"/>
        <category label="Cost" term="Cost"/>
        <category label="Container" term="Container"/>
        <category label="Security" term="Security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.4.0 — AgentCore 仪表板 + CloudWatch 指标集成]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0"/>
        <updated>2026-03-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[新增 AgentCore 仪表板、Sign Out、RDS/ElastiCache/OpenSearch CloudWatch 指标表、Resource Inventory(PR#1)、S3 Bucket Map。]]></summary>
        <content type="html"><![CDATA[<p>本版本新增 <strong>AgentCore 仪表板</strong>页面、<strong>4 个服务的 CloudWatch 指标</strong>表，并包含 <strong>Resource Inventory</strong>（PR #1）。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心新增</div><div class="admonitionContent_BuS1"><p><strong>AgentCore 仪表板</strong> · <strong>Sign Out</strong> · <strong>4 个 CloudWatch 指标 API</strong> · <strong>Resource Inventory</strong> · <strong>S3 Bucket Map</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-仪表板agentcore">AgentCore 仪表板（<code>/agentcore</code>）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#agentcore-%E4%BB%AA%E8%A1%A8%E6%9D%BFagentcore" class="hash-link" aria-label="agentcore-仪表板agentcore的直接链接" title="agentcore-仪表板agentcore的直接链接" translate="no">​</a></h2>
<p>可一目了然地掌握 Bedrock AgentCore Runtime 与 8 个 Gateway 状态的专用仪表板。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<ul>
<li class=""><strong>Runtime 状态</strong>：通过 <code>data/config.json</code> 的 <code>agentRuntimeArn</code> 查询状态</li>
<li class=""><strong>8 个 Gateway 卡片</strong>：显示各 Gateway 的状态、工具数、主要功能</li>
<li class=""><strong>125 个工具完整列表</strong>：支持搜索、按 Gateway 过滤</li>
<li class=""><strong>架构图</strong>：可视化 Runtime → Gateway → Lambda 关系</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>API 端点</div><div class="admonitionContent_BuS1"><p><code>/api/agentcore</code>（<code>src/app/api/agentcore/route.ts</code>）从 <code>data/config.json</code> 读取 ARN，并通过 AWS API 查询状态。没有硬编码的账户信息，只需修改 config 即可在任何环境中运行。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sign-out-功能">Sign Out 功能<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#sign-out-%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="Sign Out 功能的直接链接" title="Sign Out 功能的直接链接" translate="no">​</a></h2>
<p>在 Header 中添加了退出登录按钮，可安全地终止 Cognito 会话。</p>
<table><thead><tr><th>项目</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>退出登录</td><td>不可用（只能关闭浏览器）</td><td>Header 退出登录按钮</td></tr><tr><td>Cookie 删除</td><td><code>document.cookie</code>（无法访问 HttpOnly）</td><td><code>POST /api/auth</code> 服务端删除</td></tr><tr><td>认证状态</td><td>依赖浏览器缓存</td><td>强制 Cognito 重新认证</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>HttpOnly Cookie 删除</div><div class="admonitionContent_BuS1"><p>无法通过 <code>document.cookie</code> 删除 HttpOnly Cookie。
必须通过<strong>服务端 API</strong>（<code>src/app/api/auth/route.ts</code>）返回 <code>Set-Cookie: token=; Max-Age=0</code>。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudwatch-指标表4-个服务">CloudWatch 指标表（4 个服务）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#cloudwatch-%E6%8C%87%E6%A0%87%E8%A1%A84-%E4%B8%AA%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="CloudWatch 指标表（4 个服务）的直接链接" title="CloudWatch 指标表（4 个服务）的直接链接" translate="no">​</a></h2>
<p>为 4 个服务添加了专用 API 路由和 CloudWatch 指标表。全部采用相同模式（<code>cloudwatch get-metric-data</code> → 进度条 + 数值）。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>服务</th><th>API 路由</th><th>指标</th></tr></thead><tbody><tr><td><strong>MSK</strong></td><td><code>/api/msk</code></td><td>各 Broker 的 CPU、Memory、BytesIn、BytesOut</td></tr><tr><td><strong>RDS</strong></td><td><code>/api/rds</code></td><td>各实例的 CPU、Memory、Connections、IOPS</td></tr><tr><td><strong>ElastiCache</strong></td><td><code>/api/elasticache</code></td><td>各节点的 CPU、Memory、Network、Connections + Valkey 引擎卡片</td></tr><tr><td><strong>OpenSearch</strong></td><td><code>/api/opensearch</code></td><td>各域的 CPU、JVM Memory、Cluster Status、Search Rate</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-inventory-pr-1">Resource Inventory (PR #1)<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#resource-inventory-pr-1" class="hash-link" aria-label="Resource Inventory (PR #1)的直接链接" title="Resource Inventory (PR #1)的直接链接" translate="no">​</a></h2>
<p>在 <code>/inventory</code> 页面监控 18 类资源数量的变化趋势。</p>
<ul>
<li class=""><strong>多折线图</strong>：各资源数量变化的时间序列</li>
<li class=""><strong>成本影响估算</strong>：显示资源变化带来的预计费用</li>
<li class=""><strong><code>src/lib/resource-inventory.ts</code></strong>：基于快照（<code>data/inventory/</code>），零额外查询</li>
<li class=""><strong>Cost Explorer 可用性</strong>：通过 <code>checkCostAvailability()</code> 自动判别 MSP Payer</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3--rds--elasticache-强化">S3 / RDS / ElastiCache 强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#s3--rds--elasticache-%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="S3 / RDS / ElastiCache 强化的直接链接" title="S3 / RDS / ElastiCache 强化的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>服务</th><th>新增功能</th></tr></thead><tbody><tr><td><strong>S3</strong></td><td>Bucket Map（TreeMap 可视化）、搜索/过滤、显示 IAM Roles</td></tr><tr><td><strong>RDS</strong></td><td>Security Groups 标签页、CloudWatch 迷你图表、Features 详情</td></tr><tr><td><strong>ElastiCache</strong></td><td>Security Groups 标签页、CloudWatch 指标、Valkey 引擎支持</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-强化">Monitoring 强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/14/v1.4.0#monitoring-%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="Monitoring 强化的直接链接" title="Monitoring 强化的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>实例详细指标视图</strong>：Date Range 选择（1h ~ 30d）</li>
<li class=""><strong>Resource Topology</strong>：Graph/Map View 切换（React Flow）</li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Monitoring" term="Monitoring"/>
        <category label="Database" term="Database"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.3.0 — 多路由并行调用 + 仪表板全面重构]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[85 个提交的大规模升级。复合问题时并行调用 1~3 个 Gateway。18 卡片仪表板、SSE 流式传输、VPC Resource Map。]]></summary>
        <content type="html"><![CDATA[<p>这是一次横跨 85 个提交的全面 UX/功能升级。核心是复合问题时<strong>并行调用 1~3 个 Gateway</strong> + Bedrock 响应合成。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心数据</div><div class="admonitionContent_BuS1"><p><strong>85 个提交</strong> · <strong>18 个仪表板卡片</strong> · <strong>多路由（1~3 Gateway 并行）</strong> · <strong>SSE 实时流式传输</strong> · <strong>3 个新页面</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="多路由-ai-架构">多路由 AI 架构<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#%E5%A4%9A%E8%B7%AF%E7%94%B1-ai-%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="多路由 AI 架构的直接链接" title="多路由 AI 架构的直接链接" translate="no">​</a></h2>
<p>分析复合问题后<strong>同时</strong>调用最多 3 个 Gateway，并由 Bedrock 合成响应。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>Before (v1.2.0)</th><th>After (v1.3.0)</th></tr></thead><tbody><tr><td>问题处理</td><td>仅调用单个 Gateway</td><td>并行调用 1~3 个 Gateway</td></tr><tr><td>复合问题</td><td>仅使用首个匹配的路由</td><td>并行处理所有相关路由</td></tr><tr><td>响应合成</td><td>无</td><td>Bedrock <code>synthesizeResponses()</code></td></tr><tr><td>流式传输</td><td>无</td><td>SSE <code>chunk</code> 事件实时发送</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>多路由工作原理</div><div class="admonitionContent_BuS1"><p><code>src/app/api/ai/route.ts</code> 的意图分类器分析问题并返回 <code>routes: string[]</code> 数组。
当数组长度大于等于 2 时，使用 <code>Promise.allSettled()</code> 并行调用，并将成功的响应通过 <code>synthesizeResponses()</code> 进行合成。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="仪表板全面重构">仪表板全面重构<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#%E4%BB%AA%E8%A1%A8%E6%9D%BF%E5%85%A8%E9%9D%A2%E9%87%8D%E6%9E%84" class="hash-link" aria-label="仪表板全面重构的直接链接" title="仪表板全面重构的直接链接" translate="no">​</a></h2>
<p>将 18 个卡片以 6x3 布局排列，并与侧边栏菜单 1:1 映射。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<ul>
<li class=""><strong>卡片底部 sub-metrics</strong>：以 <code>18 running · 4 stopped</code> 形式显示核心数值</li>
<li class=""><strong>CIS Compliance Pass Rate</strong>：整体基准通过率仪表</li>
<li class=""><strong>Monthly Cost</strong>：本月费用 + 环比（MoM）变化率</li>
<li class=""><strong>Resource Distribution + K8s Pod Status</strong>：使用 Recharts 图表可视化</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sse-流式-ai-响应">SSE 流式 AI 响应<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#sse-%E6%B5%81%E5%BC%8F-ai-%E5%93%8D%E5%BA%94" class="hash-link" aria-label="SSE 流式 AI 响应的直接链接" title="SSE 流式 AI 响应的直接链接" translate="no">​</a></h2>
<p>通过实时流式传输 AI 响应改善了 UX。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<ul>
<li class=""><strong><code>status</code> 事件</strong>：显示分析中 → Gateway 连接 → 工具调用各阶段</li>
<li class=""><strong><code>chunk</code> 事件</strong>：实时发送响应文本</li>
<li class=""><strong><code>done</code> 事件</strong>：最终结果 + 使用的工具 + 响应时间 + token 数</li>
<li class="">新增响应时间显示、剪贴板复制、相关推荐问题功能</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="新页面3-个">新页面（3 个）<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#%E6%96%B0%E9%A1%B5%E9%9D%A23-%E4%B8%AA" class="hash-link" aria-label="新页面（3 个）的直接链接" title="新页面（3 个）的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>页面</th><th>路径</th><th>主要功能</th></tr></thead><tbody><tr><td>CloudFront</td><td><code>/cloudfront-cdn</code></td><td>Distribution 列表、Origin、Behavior、缓存策略</td></tr><tr><td>WAF</td><td><code>/waf</code></td><td>WebACL 规则、IP Set、拦截日志</td></tr><tr><td>ECR</td><td><code>/ecr</code></td><td>仓库、镜像标签、漏洞扫描结果</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpc--network-强化">VPC &amp; Network 强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#vpc--network-%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="VPC &amp; Network 强化的直接链接" title="VPC &amp; Network 强化的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>VPC Resource Map</strong>：AWS 控制台风格的 4 列布局<!-- -->
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">VPC → Subnets → Route Tables → Connections (IGW/NAT/TGW/VPN)</span><br></span></code></pre></div></div>
</li>
<li class=""><strong>Route Table 标签页</strong>：子网关联、路由规则表</li>
<li class=""><strong>TGW Route Tables</strong>：Transit Gateway 路由表详情</li>
<li class=""><strong>Resource Topology</strong>：基于 React Flow 的 Graph View / Map View 切换</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="eks--cost-强化">EKS &amp; Cost 强化<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/12/v1.3.0#eks--cost-%E5%BC%BA%E5%8C%96" class="hash-link" aria-label="EKS &amp; Cost 强化的直接链接" title="EKS &amp; Cost 强化的直接链接" translate="no">​</a></h2>
<p><strong>EKS 改进</strong>：</p>
<ul>
<li class="">K8s Overview 节点卡片：CPU/Memory 进度条</li>
<li class="">节点详情：ENI 卡片 + per-ENI 流量 + Pods 表格</li>
<li class="">EKS Explorer：Status/Node 过滤、分页</li>
</ul>
<p><strong>Cost Explorer 改进</strong>：</p>
<ul>
<li class="">期间/服务过滤、Projected 月末费用、MoM Change</li>
<li class="">Monthly Trend 折线图、Cost by Service 饼图</li>
</ul>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Steampipe Cost 查询注意</div><div class="admonitionContent_BuS1"><p>Cost Explorer 数据仅在 <strong>MSP（Managed Service Provider）Payer 账户</strong>中可用。
使用 <code>checkCostAvailability()</code> 预先确认，若不可用则使用 <code>cost-snapshot.ts</code> 回退数据。</p></div></div>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Network" term="Network"/>
        <category label="Monitoring" term="Monitoring"/>
        <category label="Streaming" term="Streaming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.2.0 — Gateway 拆分 + 部署稳定性 + 性能优化]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[将 Infra Gateway 拆分为 Network(17) + Container(24)。104 个问题测试 93% 准确率。Bedrock 区域优化使延迟降低 20%。]]></summary>
        <content type="html"><![CDATA[<p>本版本将 Gateway 从 7 个拆分为 <strong>8 个</strong>，并大幅改进了部署稳定性。Container 响应<strong>提速 54%</strong>（50s → 23s），全部测试 <strong>104/104 通过</strong>。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心成果</div><div class="admonitionContent_BuS1"><p><strong>8 Gateway</strong> · <strong>10 Routes</strong> · <strong>104/104 测试通过</strong> · <strong>93% 分类准确率</strong> · <strong>Container 提速 54%</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-拆分infra--network--container">Gateway 拆分：Infra → Network + Container<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0#gateway-%E6%8B%86%E5%88%86infra--network--container" class="hash-link" aria-label="Gateway 拆分：Infra → Network + Container的直接链接" title="Gateway 拆分：Infra → Network + Container的直接链接" translate="no">​</a></h2>
<p>v1.1.0 的 Infra Gateway（41 个工具）包含的工具过多，因此将其拆分为网络和容器两个领域。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>项目</th><th>Before（Infra 单一）</th><th>After（拆分后）</th></tr></thead><tbody><tr><td>Gateway</td><td>1（Infra，41 工具）</td><td>2（Network 17 + Container 24）</td></tr><tr><td>Container 响应时间</td><td>~50 秒</td><td>~23 秒（<strong>提升 54%</strong>）</td></tr><tr><td>工具选择准确率</td><td>LLM 从 41 个中选择</td><td>从 24 个中选择</td></tr><tr><td>路由体系</td><td>7 Gateway, 9 Routes</td><td><strong>8 Gateway, 10 Routes</strong></td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>为什么拆分有效？</div><div class="admonitionContent_BuS1"><p>与其让 LLM 阅读全部 41 个工具的说明再做选择，不如让它在 17 个（Network）或 24 个（Container）中选择，<strong>更快也更准确</strong>。尤其是 Container 问题中误选网络工具的错误已完全消失。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="部署稳定性改进">部署稳定性改进<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0#%E9%83%A8%E7%BD%B2%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%94%B9%E8%BF%9B" class="hash-link" aria-label="部署稳定性改进的直接链接" title="部署稳定性改进的直接链接" translate="no">​</a></h2>
<p>在部署脚本中加入了错误处理和自动检测逻辑。</p>
<table><thead><tr><th>脚本</th><th>改进内容</th></tr></thead><tbody><tr><td><code>06a-setup-agentcore-runtime.sh</code></td><td><code>run_or_fail</code> 辅助函数 + AWS 凭证预检</td></tr><tr><td><code>06b-setup-agentcore-gateway.sh</code></td><td>批量创建 8 个 Gateway（反映 Network/Container 拆分）</td></tr><tr><td><code>07-setup-cloudfront-auth.sh</code></td><td>CloudFront 自动检测 — 优先 CDK 堆栈，回退到 ALB origin</td></tr><tr><td>Steampipe 连接</td><td>密码硬编码 → 从 <code>steampipe service status</code> 动态获取</td></tr></tbody></table>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="测试结果104104-通过">测试结果：104/104 通过<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0#%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C104104-%E9%80%9A%E8%BF%87" class="hash-link" aria-label="测试结果：104/104 通过的直接链接" title="测试结果：104/104 通过的直接链接" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>完美的测试结果</div><div class="admonitionContent_BuS1"><p>104 个问题中 <strong>104 个全部通过</strong>，路由分类准确率 <strong>93%</strong>，内容验证准确率达到 <strong>99%</strong>。</p></div></div>
<table><thead><tr><th>项目</th><th>结果</th></tr></thead><tbody><tr><td>问题通过</td><td><strong>104/104</strong> (100%)</td></tr><tr><td>路由分类准确率</td><td><strong>93%</strong> (97/104)</td></tr><tr><td>内容验证准确率</td><td><strong>99%</strong> (103/104)</td></tr><tr><td>平均响应时间</td><td><strong>27 秒</strong></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="主要错误修复">主要错误修复<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/11/v1.2.0#%E4%B8%BB%E8%A6%81%E9%94%99%E8%AF%AF%E4%BF%AE%E5%A4%8D" class="hash-link" aria-label="主要错误修复的直接链接" title="主要错误修复的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>问题</th><th>原因</th><th>修复</th></tr></thead><tbody><tr><td>EKS access entry 失败</td><td>使用了 <code>arn:aws:sts::</code> 格式</td><td>转换为 <code>arn:aws:iam::</code> 格式</td></tr><tr><td>Cognito custom domain 错误</td><td>缺少 <code>SupportedIdentityProviders</code></td><td>添加参数</td></tr><tr><td>AgentCore 权限错误</td><td>权限不足</td><td>添加 <code>bedrock-agentcore:*</code> 权限</td></tr><tr><td>K8s PVC 查询失败</td><td>JSONB 序列化错误</td><td>在 <code>k8s.ts</code> 中应用 <code>::text</code> 转换</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Steampipe JSONB 注意</div><div class="admonitionContent_BuS1"><p>Kubernetes 表的 JSONB 列（<code>spec</code>、<code>status</code>）直接返回会发生序列化错误。
必须使用 <code>SELECT spec::text</code> 或 <code>spec-&gt;&gt;'key'</code> 进行转换。</p></div></div>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Network" term="Network"/>
        <category label="Container" term="Container"/>
        <category label="Deployment" term="Deployment"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.1.0 — 7 Gateway x 125 MCP 工具架构]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[从单一 Gateway 全面重构为 7 个基于角色的 Gateway。19 个 Lambda、125 个 MCP 工具、Sonnet 意图分类。]]></summary>
        <content type="html"><![CDATA[<p>这是一个里程碑版本，从单一 Gateway（29 个工具）全面重构为 <strong>7 个专业 Gateway x 125 个 MCP 工具</strong>。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心变化</div><div class="admonitionContent_BuS1"><p><strong>1 Gateway → 7 Gateway</strong> · <strong>29 工具 → 125 工具</strong> · <strong>19 个 Lambda 函数</strong> · <strong>引入 Sonnet 意图分类器</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--aftergateway-架构">Before / After：Gateway 架构<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0#before--aftergateway-%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="Before / After：Gateway 架构的直接链接" title="Before / After：Gateway 架构的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>Before (v1.0)</th><th>After (v1.1.0)</th></tr></thead><tbody><tr><td>Gateway 数量</td><td>1 (Ops)</td><td>7（基于角色）</td></tr><tr><td>MCP 工具数量</td><td>29</td><td>125</td></tr><tr><td>Lambda 函数</td><td>5</td><td>19</td></tr><tr><td>路由</td><td>单一路径</td><td>9 级优先级</td></tr><tr><td>意图分类</td><td>关键词匹配</td><td>Sonnet 自然语言分类</td></tr><tr><td>Container 响应时间</td><td>~50 秒</td><td>~23 秒</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-个基于角色的-gateway">7 个基于角色的 Gateway<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0#7-%E4%B8%AA%E5%9F%BA%E4%BA%8E%E8%A7%92%E8%89%B2%E7%9A%84-gateway" class="hash-link" aria-label="7 个基于角色的 Gateway的直接链接" title="7 个基于角色的 Gateway的直接链接" translate="no">​</a></h2>
<p>每个 Gateway 提供针对特定领域优化的工具集。URL 在 <code>agent.py</code> 的 <code>GATEWAYS</code> 字典中管理。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>Gateway</th><th>工具数</th><th>主要功能</th><th>Lambda 函数</th></tr></thead><tbody><tr><td><strong>Network</strong></td><td>17</td><td>VPC Flow Logs、SG 规则、Reachability</td><td><code>network_analyzer</code>、<code>reachability_analyzer</code>、<code>tgw_analyzer</code>、<code>vpn_analyzer</code>、<code>firewall_analyzer</code></td></tr><tr><td><strong>Container</strong></td><td>24</td><td>EKS、ECS、Istio 故障排查</td><td><code>eks_analyzer</code>、<code>ecs_analyzer</code>、<code>istio_analyzer</code></td></tr><tr><td><strong>IaC</strong></td><td>12</td><td>CloudFormation、CDK、Terraform</td><td><code>cfn_analyzer</code></td></tr><tr><td><strong>Data</strong></td><td>24</td><td>DynamoDB、RDS、ElastiCache、MSK</td><td><code>dynamodb_analyzer</code>、<code>rds_analyzer</code>、<code>elasticache_analyzer</code>、<code>msk_analyzer</code></td></tr><tr><td><strong>Security</strong></td><td>14</td><td>IAM 策略模拟、权限分析</td><td><code>iam_analyzer</code></td></tr><tr><td><strong>Monitoring</strong></td><td>16</td><td>CloudWatch 指标/告警、CloudTrail 事件</td><td><code>cloudwatch_analyzer</code>、<code>cloudtrail_analyzer</code></td></tr><tr><td><strong>Cost</strong></td><td>9</td><td>Cost Explorer、Budgets 预算</td><td><code>cost_analyzer</code>、<code>budget_analyzer</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="19-个-lambda-函数">19 个 Lambda 函数<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0#19-%E4%B8%AA-lambda-%E5%87%BD%E6%95%B0" class="hash-link" aria-label="19 个 Lambda 函数的直接链接" title="19 个 Lambda 函数的直接链接" translate="no">​</a></h2>
<p>在 <code>agent/lambda/</code> 目录中管理，使用 <code>create_targets.py</code> 批量创建 Gateway Target。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Gateway Target 创建</div><div class="admonitionContent_BuS1"><p>使用 <strong>Python/boto3</strong> 而非 CLI（<code>mcp.lambda</code> + <code>credentialProviderConfigurations</code>）。
由于 CLI 的 <code>inlinePayload</code> 问题，必须采用编程方式。</p></div></div>
<table><thead><tr><th>#</th><th>Lambda</th><th>领域</th><th>主要功能</th></tr></thead><tbody><tr><td>1</td><td><code>network_analyzer</code></td><td>Network</td><td>VPC Flow Logs 分析、SG 规则验证</td></tr><tr><td>2</td><td><code>reachability_analyzer</code></td><td>Network</td><td>VPC Reachability Analyzer 路径分析</td></tr><tr><td>3</td><td><code>tgw_analyzer</code></td><td>Network</td><td>Transit Gateway 路由</td></tr><tr><td>4</td><td><code>vpn_analyzer</code></td><td>Network</td><td>Site-to-Site VPN 状态/隧道</td></tr><tr><td>5</td><td><code>firewall_analyzer</code></td><td>Network</td><td>Network Firewall 规则</td></tr><tr><td>6</td><td><code>eks_analyzer</code></td><td>Container</td><td>EKS 集群、节点组、插件</td></tr><tr><td>7</td><td><code>ecs_analyzer</code></td><td>Container</td><td>ECS 服务、任务、洞察</td></tr><tr><td>8</td><td><code>istio_analyzer</code></td><td>Container</td><td>Istio 服务网格配置</td></tr><tr><td>9</td><td><code>dynamodb_analyzer</code></td><td>Data</td><td>表容量、GSI/LSI</td></tr><tr><td>10</td><td><code>rds_analyzer</code></td><td>Data</td><td>实例性能、参数组</td></tr><tr><td>11</td><td><code>elasticache_analyzer</code></td><td>Data</td><td>集群状态、Valkey 支持</td></tr><tr><td>12</td><td><code>msk_analyzer</code></td><td>Data</td><td>Broker 状态、主题分析</td></tr><tr><td>13</td><td><code>iam_analyzer</code></td><td>Security</td><td>策略模拟、权限分析</td></tr><tr><td>14</td><td><code>cloudwatch_analyzer</code></td><td>Monitoring</td><td>指标/告警分析</td></tr><tr><td>15</td><td><code>cloudtrail_analyzer</code></td><td>Monitoring</td><td>事件搜索</td></tr><tr><td>16</td><td><code>cost_analyzer</code></td><td>Cost</td><td>Cost Explorer 成本/预测</td></tr><tr><td>17</td><td><code>budget_analyzer</code></td><td>Cost</td><td>Budgets 预算监控</td></tr><tr><td>18</td><td><code>cfn_analyzer</code></td><td>IaC</td><td>CloudFormation 堆栈/漂移</td></tr><tr><td>19</td><td><code>steampipe_query</code></td><td>Ops</td><td>Steampipe SQL 查询执行</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="动态路由系统">动态路由系统<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0#%E5%8A%A8%E6%80%81%E8%B7%AF%E7%94%B1%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="动态路由系统的直接链接" title="动态路由系统的直接链接" translate="no">​</a></h2>
<p>在 <code>src/app/api/ai/route.ts</code> 中执行 9 级优先级的关键词路由。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<ul>
<li class=""><strong><code>agent.py</code></strong>：通过 <code>payload.gateway</code> 参数选择网关</li>
<li class=""><strong><code>route.ts</code></strong>：9 级优先级关键词路由</li>
<li class=""><strong>引入 Sonnet 意图分类器</strong>（<code>c56f557</code>）— 关键词未匹配时通过自然语言分析选择最佳 Gateway</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-测试结果">AI 测试结果<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/10/v1.1.0#ai-%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C" class="hash-link" aria-label="AI 测试结果的直接链接" title="AI 测试结果的直接链接" translate="no">​</a></h2>
<p>为验证 Gateway 拆分的效果，进行了 104 个问题的测试。</p>
<table><thead><tr><th>项目</th><th>结果</th></tr></thead><tbody><tr><td>测试问题数</td><td>104 个</td></tr><tr><td>路由准确率</td><td>93% (97/104)</td></tr><tr><td>Container 响应速度提升</td><td><strong>54%</strong> (50s → 23s)</td></tr><tr><td>Gateway 拆分效果</td><td>借助各领域的专业工具提升响应质量</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>性能提升要点</div><div class="admonitionContent_BuS1"><p>拆分 Gateway 后，代理需要参考的工具数量减少，<strong>工具选择准确率</strong>和<strong>响应速度</strong>均得到提升。
在单一 Gateway（125 个工具）下 LLM 需要花时间寻找合适的工具，而在 Container Gateway（24 个工具）下可以立即选中相关工具。</p></div></div>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="AI" term="AI"/>
        <category label="Network" term="Network"/>
        <category label="Container" term="Container"/>
        <category label="Database" term="Database"/>
        <category label="Security" term="Security"/>
        <category label="Monitoring" term="Monitoring"/>
        <category label="Cost" term="Cost"/>
        <category label="IaC" term="IaC"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v1.0 — AWSops 仪表板首次发布]]></title>
        <id>https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0</id>
        <link href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0"/>
        <updated>2026-03-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[基于 Next.js 14 + Steampipe + Bedrock AgentCore 的 AWS 运维仪表板首次发布。CDK 基础设施、Cognito 认证、7 个 Gateway 125 个 MCP 工具。]]></summary>
        <content type="html"><![CDATA[<p>这是 AWSops 仪表板的首个版本。基于 Next.js 14 + Steampipe + Amazon Bedrock AgentCore 构建的 <strong>AWS/Kubernetes 一体化运维仪表板</strong>正式诞生。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>核心数据</div><div class="admonitionContent_BuS1"><p><strong>21 个页面</strong> · <strong>5 个 API 路由</strong> · <strong>380+ AWS 表</strong> · <strong>60+ K8s 表</strong> · <strong>125 个 MCP 工具</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="架构概览">架构概览<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#%E6%9E%B6%E6%9E%84%E6%A6%82%E8%A7%88" class="hash-link" aria-label="架构概览的直接链接" title="架构概览的直接链接" translate="no">​</a></h2>
<p>用户请求由 CloudFront 接收，经过 ALB 后在 EC2 上运行 Next.js 应用，并通过 Steampipe 以 SQL 实时查询 AWS API。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cdk-基础设施迁移">CDK 基础设施迁移<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#cdk-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%BF%81%E7%A7%BB" class="hash-link" aria-label="CDK 基础设施迁移的直接链接" title="CDK 基础设施迁移的直接链接" translate="no">​</a></h2>
<p>从 CloudFormation YAML 模板迁移到 AWS CDK TypeScript，以代码方式管理基础设施。</p>
<table><thead><tr><th>项目</th><th>Before (CloudFormation)</th><th>After (CDK)</th></tr></thead><tbody><tr><td>语言</td><td>YAML 2000+ 行</td><td>TypeScript 类型安全</td></tr><tr><td>部署</td><td><code>aws cloudformation deploy</code></td><td><code>cdk deploy</code></td></tr><tr><td>VPC</td><td>手动计算子网 CIDR</td><td><code>ec2.Vpc()</code> 自动</td></tr><tr><td>ALB</td><td>手动配置监听器/目标</td><td><code>elbv2.ApplicationLoadBalancer()</code></td></tr><tr><td>复用</td><td>复制粘贴</td><td>Stack 继承 + Construct</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>核心文件</div><div class="admonitionContent_BuS1"><ul>
<li class=""><code>infra-cdk/lib/awsops-stack.ts</code> — VPC、EC2(t4g.2xlarge ARM64)、ALB、CloudFront 配置</li>
<li class=""><code>00-deploy-infra.sh</code> — CDK bootstrap（<code>ap-northeast-2</code> + <code>us-east-1</code>）及部署脚本</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cognito-认证">Cognito 认证<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#cognito-%E8%AE%A4%E8%AF%81" class="hash-link" aria-label="Cognito 认证的直接链接" title="Cognito 认证的直接链接" translate="no">​</a></h2>
<p>构建了基于 AWS Cognito 的用户认证系统。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<ul>
<li class=""><strong>Lambda@Edge</strong>（Python 3.12，us-east-1）— 在 CloudFront viewer-request 中验证 JWT</li>
<li class="">通过 <strong>OAuth2 Authorization Code</strong> flow 实现安全认证</li>
<li class="">使用 <code>07-setup-cloudfront-auth.sh</code> 脚本自动配置</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-runtime--gateway">AgentCore Runtime + Gateway<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#agentcore-runtime--gateway" class="hash-link" aria-label="AgentCore Runtime + Gateway的直接链接" title="AgentCore Runtime + Gateway的直接链接" translate="no">​</a></h2>
<p>基于 Amazon Bedrock AgentCore 的 AI 代理系统。</p>
<div style="border-radius:8px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.4);margin-bottom:1.5rem;position:relative"><canvas></canvas></div>
<table><thead><tr><th>组件</th><th>说明</th></tr></thead><tbody><tr><td>Strands Agent</td><td>arm64 Docker 镜像，通过 ECR 管理</td></tr><tr><td>MCP 协议</td><td>Gateway → Lambda 之间的标准通信</td></tr><tr><td>Code Interpreter</td><td><code>awsops_code_interpreter</code>（Python sandbox）</td></tr><tr><td>部署脚本</td><td><code>06a</code> Runtime、<code>06b</code> Gateway、<code>06c</code> Tools、<code>06d</code> Interpreter</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Docker 构建注意事项</div><div class="admonitionContent_BuS1"><p>在 EC2 上<strong>仅执行</strong> Docker 镜像的构建。运行则由 AgentCore 托管服务以容器方式执行。
arm64 必需：<code>docker buildx --platform linux/arm64 --load</code></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="初始仪表板">初始仪表板<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#%E5%88%9D%E5%A7%8B%E4%BB%AA%E8%A1%A8%E6%9D%BF" class="hash-link" aria-label="初始仪表板的直接链接" title="初始仪表板的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>项目</th><th>数值</th></tr></thead><tbody><tr><td>页面</td><td>21 个</td></tr><tr><td>API 路由</td><td>5 个</td></tr><tr><td>Steampipe AWS 表</td><td>380+</td></tr><tr><td>Steampipe K8s 表</td><td>60+</td></tr><tr><td>CIS 基准</td><td>v1.5 ~ v4.0</td></tr></tbody></table>
<ul>
<li class=""><strong>Recharts</strong> 指标可视化 — CPU、Memory、Network 趋势</li>
<li class=""><strong>React Flow</strong> 网络拓扑 — 展示 VPC、Subnet、Route Table 关系</li>
<li class=""><strong>CIS 合规</strong> — v1.5 ~ v4.0 基准自动检查（Steampipe <code>aws_compliance</code> 表）</li>
<li class=""><strong>AI 路由</strong> — Code Interpreter → AgentCore → Steampipe+Bedrock → Bedrock Direct</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-code-脚手架">Claude Code 脚手架<a href="https://www.atomai.click/awsops/zh/whatsnew/2026/03/08/v1.0#claude-code-%E8%84%9A%E6%89%8B%E6%9E%B6" class="hash-link" aria-label="Claude Code 脚手架的直接链接" title="Claude Code 脚手架的直接链接" translate="no">​</a></h2>
<p>为提升开发效率，搭建了 Claude Code 集成环境。</p>
<ul>
<li class=""><strong>Module CLAUDE.md</strong> — 各目录的上下文文档（<code>src/lib/CLAUDE.md</code>、<code>src/app/CLAUDE.md</code> 等）</li>
<li class=""><strong>Auto-Sync Rules</strong> — 代码变更时文档自动同步规则</li>
<li class=""><code>.claude/hooks/check-doc-sync.sh</code> — 文档同步验证钩子</li>
</ul>]]></content>
        <author>
            <name>AWSops Team</name>
            <uri>https://github.com/whchoi98/awsops</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Deployment" term="Deployment"/>
        <category label="AI" term="AI"/>
        <category label="IaC" term="IaC"/>
    </entry>
</feed>