<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.atomai.click/awsops/en/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/en/whatsnew"/>
    <subtitle>AWSops 사용자 가이드 Blog</subtitle>
    <icon>https://www.atomai.click/awsops/en/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[v2.0.0 — AWSops, rebuilt on a new architecture]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A full rebuild as a Terraform-based MSA — private edge (CloudFront VPC Origin → internal ALB → Fargate), Aurora durable state, in-app login, AgentCore section agents, and an async worker tier. Streaming AI assistant, AI diagnosis, topology, EKS, themes, and mobile all overhauled.]]></summary>
        <content type="html"><![CDATA[<p>We're releasing <strong>v2.0.0 — AWSops rebuilt from the ground up on a new architecture.</strong> The single-EC2 monolith is now a <strong>Terraform-based MSA</strong>, and on top of it nearly every screen — AI assistant, AI diagnosis, topology, EKS, cost — has been rebuilt. For you, the whole experience is new: a dedicated domain, in-app login, themes, and full mobile support.</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>Highlights</div><div class="admonitionContent_BuS1"><p><strong>Terraform MSA (ECS Fargate + Aurora)</strong> · <strong>Private edge + in-app login (RS256)</strong> · <strong>Streaming AI assistant (auto domain routing · persistent threads)</strong> · <strong>AI diagnosis reports (depth tiers · MD/DOCX/PDF)</strong> · <strong>Request-flow topology graph</strong> · <strong>EKS fleet + in-cluster browsing</strong> · <strong>3 themes + mobile responsive</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-new-architecture-full-rebuild">A new architecture (full rebuild)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#a-new-architecture-full-rebuild" class="hash-link" aria-label="Direct link to A new architecture (full rebuild)" title="Direct link to A new architecture (full rebuild)" translate="no">​</a></h2>
<p>We unwound v1's single EC2 host — where build, runtime, and local state were all tangled together — into components that deploy and scale independently.</p>
<table><thead><tr><th>Area</th><th>Change</th></tr></thead><tbody><tr><td><strong>IaC</strong></td><td>CDK → <strong>Terraform</strong> (S3 backend)</td></tr><tr><td><strong>Compute</strong></td><td>single EC2 → <strong>ECS Fargate</strong> (web/worker split, arm64)</td></tr><tr><td><strong>Data</strong></td><td>local state → <strong>Aurora Serverless v2 (PostgreSQL 17)</strong> durable storage</td></tr><tr><td><strong>Edge</strong></td><td>public ALB → <strong>CloudFront VPC Origin → internal ALB → Fargate</strong> (no public ALB, TLS end-to-end)</td></tr><tr><td><strong>Auth</strong></td><td>edge exp-only → <strong>Cognito + Lambda@Edge RS256 JWKS verification</strong></td></tr><tr><td><strong>Long jobs</strong></td><td>in-process → <strong>async worker tier</strong> (SQS + Step Functions + Lambda/Fargate)</td></tr><tr><td><strong>Path</strong></td><td><code>/awsops</code> prefix → <strong>root path (<code>/</code>)</strong>, dedicated domain</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-refreshed-experience">A refreshed experience<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#a-refreshed-experience" class="hash-link" aria-label="Direct link to A refreshed experience" title="Direct link to A refreshed experience" translate="no">​</a></h2>
<ul>
<li class=""><strong>In-app login</strong> — sign in with email and password on the self-hosted <code>/login</code> form. Unauthenticated requests are sent to the sign-in screen at the edge.</li>
<li class=""><strong>Three themes</strong> — a <strong>Cobalt (default) · Teal · Dark</strong> picker. Your choice persists, and charts and the brand mark adapt to the theme.</li>
<li class=""><strong>Mobile responsive</strong> — a top bar + 5-tab bottom bar + slide-in drawer bring the full feature set to small screens.</li>
<li class=""><strong>Command palette</strong> — <code>Cmd-K</code> (or <code>Ctrl-K</code>) jumps to any page/resource and switches theme.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai--faster-and-smarter">AI — faster and smarter<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#ai--faster-and-smarter" class="hash-link" aria-label="Direct link to AI — faster and smarter" title="Direct link to AI — faster and smarter" translate="no">​</a></h2>
<ul>
<li class=""><strong>AI Assistant</strong> — answers <strong>stream</strong> token-by-token and render as <strong>markdown (tables, code, lists)</strong>. Questions are <strong>auto-routed to a domain</strong> (network, cost, security, …), and conversations are <strong>persisted</strong> so the drawer and the full-screen page share one history.</li>
<li class=""><strong>AI Diagnosis</strong> — generate a comprehensive account-health report at <strong>Light / Mid / Deep</strong> depth and export it as <strong>MD · DOCX · PDF</strong>, with intended-vs-actual (invariant) checks and change insights vs the previous report.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="broader-visibility">Broader visibility<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#broader-visibility" class="hash-link" aria-label="Direct link to Broader visibility" title="Direct link to Broader visibility" translate="no">​</a></h2>
<ul>
<li class=""><strong>Topology</strong> — a <strong>request-flow graph</strong> from Route53 → CloudFront → LB → Target Group → target. Click a node for focus mode + a detail panel (ARN copy, ask-AI).</li>
<li class=""><strong>Resource Inventory</strong> — sort, search, and inspect <strong>20+</strong> resource types (EC2, Lambda, RDS, S3, VPC, IAM, …).</li>
<li class=""><strong>EKS / Kubernetes</strong> — a cluster <strong>fleet summary</strong> plus read-only <strong>in-cluster browsing</strong> of nodes/pods/deployments, with OpenCost install guidance.</li>
<li class=""><strong>Cost</strong> — per-service breakdown and drill-down, month-end forecast, and <strong>Bedrock model usage</strong> (tokens, latency, cost, cache savings).</li>
<li class=""><strong>Datasource Explore</strong> — query connected observability datasources read-only in their <strong>native language (PromQL/LogQL/TraceQL/SQL)</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="read-only-operations-posture">Read-only operations posture<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#read-only-operations-posture" class="hash-link" aria-label="Direct link to Read-only operations posture" title="Direct link to Read-only operations posture" translate="no">​</a></h2>
<p>AWSops focuses on <strong>observing, analyzing, and diagnosing</strong> operations and <strong>does not change your AWS resources.</strong> For actions that require installing or changing something, it provides scripts and guidance you run yourself.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="user-guides">User guides<a href="https://www.atomai.click/awsops/en/whatsnew/2026/06/17/v2.0.0#user-guides" class="hash-link" aria-label="Direct link to User guides" title="Direct link to User guides" translate="no">​</a></h2>
<p>See the guide docs for how to use each new screen:</p>
<ul>
<li class=""><a class="" href="https://www.atomai.click/awsops/en/intro">Introduction to AWSops</a></li>
<li class=""><a class="" href="https://www.atomai.click/awsops/en/getting-started/login">Sign In</a> · <a class="" href="https://www.atomai.click/awsops/en/getting-started/navigation">Layout &amp; Themes</a></li>
<li class=""><a class="" href="https://www.atomai.click/awsops/en/overview/dashboard">Dashboard</a> · <a class="" href="https://www.atomai.click/awsops/en/overview/assistant">AI Assistant</a> · <a class="" href="https://www.atomai.click/awsops/en/operations/ai-diagnosis">AI Diagnosis</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 — Event Pre-Scaling + Aurora Data Layer Foundation (ADR-030)]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0"/>
        <updated>2026-05-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ADR-010 Phase 1+2 event pre-scaling (Bedrock plan + review-then-run scripts), ADR-030 Aurora Serverless v2 foundation (CDK stack + schema + db.ts), ADR-029 mutating action gate, AI code review workflow.]]></summary>
        <content type="html"><![CDATA[<p>v1.9.0 adds <strong>event-driven pre-scaling</strong> so you can warm resources ahead of predictable spikes (sales, livestreams, quarter-close), and lays the <strong>ADR-030 Aurora data-layer foundation</strong> (CDK stack, schema, <code>db.ts</code>) that begins untangling build, runtime, and local JSON state from a single EC2 host. Aurora ships <strong>off by default / opt-in</strong> — existing single-host deployments are untouched.</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>Highlights</div><div class="admonitionContent_BuS1"><p><strong>Event Pre-Scaling (ADR-010 Phase 1+2)</strong> · <strong>Aurora Serverless v2 Foundation (ADR-030 Phase 1)</strong> · <strong>ADR-029 Mutating Action Gate</strong> · <strong>AI Code Review Workflow</strong> · <strong>Hardened Zombie Connection Cleanup</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="event-pre-scaling-adr-010-phase-12">Event Pre-Scaling (ADR-010 Phase 1+2)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#event-pre-scaling-adr-010-phase-12" class="hash-link" aria-label="Direct link to Event Pre-Scaling (ADR-010 Phase 1+2)" title="Direct link to Event Pre-Scaling (ADR-010 Phase 1+2)" translate="no">​</a></h2>
<p>A new admin-only page at <code>/event-scaling</code> lets you warm resources before a large traffic event begins. The flow is four steps from registration to script download:</p>
<ol>
<li class=""><strong>Register the event</strong> — name, start/end window, affected resource tags</li>
<li class=""><strong>Pull historical metrics</strong> — if the same event happened before, GetMetricData batches collect CloudWatch metrics for ASG, RDS, MSK, EBS, and ALB across the prior window</li>
<li class=""><strong>Generate an AI warmup plan</strong> — Bedrock Sonnet 4.6 produces a multi-phase per-resource scaling plan returned as structured JSON via the <code>PLAN_JSON</code> marker</li>
<li class=""><strong>Download bash scripts</strong> — safe, resource-typed generators emit KEDA/HPA, Aurora reader, MSK partition expansion, ASG warm pool, and EBS IOPS scripts</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="review-then-run-mutation-by-review">Review-Then-Run (mutation-by-review)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#review-then-run-mutation-by-review" class="hash-link" aria-label="Direct link to Review-Then-Run (mutation-by-review)" title="Direct link to Review-Then-Run (mutation-by-review)" translate="no">​</a></h3>
<p>The dashboard <strong>never executes mutating actions itself.</strong> Scripts are download-only — an operator reviews them and applies them through <code>kubectl</code> / <code>aws cli</code> from a controlled environment. This aligns with ADR-029 (Proposed): every AI-generated mutating action runs only after explicit human approval.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="files">Files<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#files" class="hash-link" aria-label="Direct link to Files" title="Direct link to Files" translate="no">​</a></h3>
<table><thead><tr><th>File</th><th>Role</th></tr></thead><tbody><tr><td><code>src/app/event-scaling/page.tsx</code></td><td>Event registration · metric charts · plan display · script download (admin-only)</td></tr><tr><td><code>src/app/api/event-scaling/route.ts</code></td><td>CRUD + metrics + Bedrock plan + scripts (GET/POST/PUT/DELETE)</td></tr><tr><td><code>src/lib/event-scaling.ts</code></td><td>Data model + JSON persistence (<code>data/event-scaling/</code>)</td></tr><tr><td><code>src/lib/event-scaling-prompts.ts</code></td><td>Bedrock Sonnet 4.6 prompts + <code>PLAN_JSON</code> parsing</td></tr><tr><td><code>src/lib/event-scaling-scripts.ts</code></td><td>Per-resource bash script generators</td></tr><tr><td><code>src/lib/queries/event-scaling.ts</code></td><td>CloudWatch GetMetricData + ASG/RDS/MSK/EBS/ALB state queries</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aurora-data-layer-foundation-adr-030-phase-1">Aurora Data Layer Foundation (ADR-030 Phase 1)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#aurora-data-layer-foundation-adr-030-phase-1" class="hash-link" aria-label="Direct link to Aurora Data Layer Foundation (ADR-030 Phase 1)" title="Direct link to Aurora Data Layer Foundation (ADR-030 Phase 1)" translate="no">​</a></h2>
<p>The single EC2 host today runs Next.js, embedded Steampipe, the AgentCore Docker build pipeline, <em>and</em> the <code>data/*.json</code> state writer. When Docker builds run, Next.js latency spikes and Steampipe FDW queries time out. ADR-030 splits all four onto <strong>ECS Fargate workloads + Aurora app state + dual-tier ECR (Dev=Private, Prod=Public, cosign-signed)</strong>. v1.9.0 lands only the <strong>Phase 1 foundation</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-ships">What ships<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#what-ships" class="hash-link" aria-label="Direct link to What ships" title="Direct link to What ships" translate="no">​</a></h3>
<table><thead><tr><th>Component</th><th>Description</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-encrypted, IAM auth, private subnets, <code>rds.logical_replication=1</code>)</td></tr><tr><td><code>infra-cdk/data/schema.sql</code></td><td>Idempotent 7-table 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> version tracking + <code>touch_updated_at</code> trigger</td></tr><tr><td><code>src/lib/db.ts</code></td><td>App-side pg Pool (distinct from Steampipe pool). Resolves credentials from <code>AURORA_DATABASE_URL</code> DSN or discrete <code>AURORA_HOST/USER/PASSWORD/DB</code> env vars; <code>isAuroraEnabled()</code> / <code>checkDbHealth()</code> helpers</td></tr><tr><td><code>scripts/13-deploy-aurora.sh</code></td><td>CDK deploy + Secrets Manager fetch + <code>psql</code> schema apply. Subcommands: <code>deploy / schema / status / dsn</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opt-in-deploy">Opt-in deploy<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#opt-in-deploy" class="hash-link" aria-label="Direct link to Opt-in deploy" title="Direct link to Opt-in deploy" translate="no">​</a></h3>
<p>Default off. Activate via context flag:</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)"># or</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>The gate exists because (1) Aurora Serverless v2's 0.5-ACU floor (~$43/mo) isn't right for every environment, and (2) Phase 1 dual-write hasn't shipped yet, so actual data still lands in <code>data/*.json</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="steampipe-stays">Steampipe stays<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#steampipe-stays" class="hash-link" aria-label="Direct link to Steampipe stays" title="Direct link to Steampipe stays" translate="no">​</a></h3>
<p>A subtle but important ADR-030 point: <strong>Steampipe is largely stateless.</strong> Its FDWs query AWS APIs live and hold results only in-memory — there's no on-disk "data" to lose when a container restarts. Aurora doesn't replace Steampipe; it replaces the JSON files (inventory, cost snapshots, conversation memory, alert records, event-scaling plans, report schedules) that the dashboard itself writes to local disk.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="coming-next-phase-1-dual-write">Coming next (Phase 1 dual-write)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#coming-next-phase-1-dual-write" class="hash-link" aria-label="Direct link to Coming next (Phase 1 dual-write)" title="Direct link to Coming next (Phase 1 dual-write)" translate="no">​</a></h3>
<p>Seven source files will gain an Aurora write path alongside their existing JSON write. Reads continue from JSON <strong>until the 7-day parity gate clears</strong>:</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-mutating-action-framework-proposed">ADR-029: Mutating Action Framework (Proposed)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#adr-029-mutating-action-framework-proposed" class="hash-link" aria-label="Direct link to ADR-029: Mutating Action Framework (Proposed)" title="Direct link to ADR-029: Mutating Action Framework (Proposed)" translate="no">​</a></h2>
<p>Event pre-scaling ships as review-then-run because the gate model for ADR-010 Phase 3 (automatic execution) hasn't been settled. ADR-029 records that gate in Proposed status — under what conditions and authorization model an AI-generated mutating action becomes executable — as a prerequisite for any future Phase 3 work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-code-review-workflow">AI Code Review Workflow<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#ai-code-review-workflow" class="hash-link" aria-label="Direct link to AI Code Review Workflow" title="Direct link to AI Code Review Workflow" translate="no">​</a></h2>
<p>A new GitHub Actions workflow (<code>.github/workflows/claude-review.yml</code>) invokes Claude to automatically review pull requests when they are opened or updated. The review prompt is tuned for AWSops conventions (Steampipe pg Pool, <code>basePath</code>, SCP-blocked columns, etc.).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardened-zombie-connection-cleanup">Hardened Zombie Connection Cleanup<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#hardened-zombie-connection-cleanup" class="hash-link" aria-label="Direct link to Hardened Zombie Connection Cleanup" title="Direct link to Hardened Zombie Connection Cleanup" translate="no">​</a></h2>
<p><code>src/lib/steampipe.ts</code>'s zombie cleanup no longer borrows a connection from the pool. It opens a dedicated short-lived <code>Client</code> instead, so cleanup keeps running even when Cost Explorer / IAM-summary FDW paths exhaust the pool. The age threshold has been lowered to 90 seconds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stats-comparison">Stats comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#stats-comparison" class="hash-link" aria-label="Direct link to Stats comparison" title="Direct link to Stats comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.8.1</th><th>v1.9.0</th><th>Δ</th></tr></thead><tbody><tr><td>Pages</td><td>41</td><td><strong>43</strong></td><td>+2 (<code>/event-scaling</code>, <code>/login</code> recount)</td></tr><tr><td>API routes</td><td>18</td><td><strong>19</strong></td><td>+1 (<code>/api/event-scaling</code>)</td></tr><tr><td>SQL query files</td><td>25</td><td><strong>26</strong></td><td>+1 (<code>event-scaling.ts</code>)</td></tr><tr><td>ADRs</td><td>28 (001-028)</td><td><strong>30 (001-030)</strong></td><td>+2 (029 Proposed, 030 Accepted)</td></tr><tr><td>CDK stacks</td><td>3 (Awsops·Cognito·AgentCore)</td><td><strong>4</strong></td><td>+1 (<code>AwsopsDataStack</code>, opt-in)</td></tr><tr><td>Deploy steps</td><td>12</td><td><strong>13</strong></td><td>+1 (<code>13-deploy-aurora.sh</code>)</td></tr><tr><td>Lib files</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="references">References<a href="https://www.atomai.click/awsops/en/whatsnew/2026/05/27/v1.9.0#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" 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: Event-Driven Pre-Scaling</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: Mutating Action Framework</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 + Dual-Tier ECR</a> (Accepted, Phase 1 partial)</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 — Alert-Triggered AI Diagnosis + Major Docs Expansion]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1"/>
        <updated>2026-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ADR-009 alert pipeline (CloudWatch/Alertmanager/Grafana webhooks → correlation → auto Bedrock diagnosis → Slack), 18 new ADRs, 5 new runbooks, 11 module CLAUDE.md files.]]></summary>
        <content type="html"><![CDATA[<p>A new pipeline receives events from external alerting systems and handles <strong>correlation → automatic AI root cause analysis → Slack notification</strong> end-to-end. Alongside it, 18 new ADRs, 5 runbooks, 11 module CLAUDE.md files, and 2 new Web guide pages (KO+EN) significantly expand the project documentation.</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>Alert-Triggered AI Diagnosis (ADR-009)</strong> · <strong>4 Webhook Sources (CloudWatch/Alertmanager/Grafana/Generic)</strong> · <strong>HMAC Authentication</strong> · <strong>Slack Block Kit</strong> · <strong>18 New ADRs</strong> · <strong>5 New Runbooks</strong> · <strong>Web Guide Expansion</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="alert-triggered-ai-diagnosis-adr-009">Alert-Triggered AI Diagnosis (ADR-009)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#alert-triggered-ai-diagnosis-adr-009" class="hash-link" aria-label="Direct link to Alert-Triggered AI Diagnosis (ADR-009)" title="Direct link to Alert-Triggered AI Diagnosis (ADR-009)" translate="no">​</a></h2>
<p>When a <code>critical</code> incident occurs, a scoped AI diagnosis runs automatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pipeline-flow">Pipeline Flow<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#pipeline-flow" class="hash-link" aria-label="Direct link to Pipeline Flow" title="Direct link to Pipeline Flow" 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 Dispatch]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-sources">Supported Sources<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#supported-sources" class="hash-link" aria-label="Direct link to Supported Sources" title="Direct link to Supported Sources" translate="no">​</a></h3>
<table><thead><tr><th>Source</th><th>Transport</th><th>Normalization</th></tr></thead><tbody><tr><td><strong>CloudWatch Alarms</strong></td><td>SNS → SQS → EC2 polling</td><td>CloudWatch event</td></tr><tr><td><strong>Prometheus Alertmanager</strong></td><td>Direct webhook (HMAC)</td><td>Alertmanager v4</td></tr><tr><td><strong>Grafana Alerting</strong></td><td>Direct webhook (HMAC)</td><td>Grafana unified</td></tr><tr><td><strong>Generic JSON</strong></td><td>Direct webhook (HMAC)</td><td>Custom schema</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="correlation-engine">Correlation Engine<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#correlation-engine" class="hash-link" aria-label="Direct link to Correlation Engine" title="Direct link to Correlation Engine" translate="no">​</a></h3>
<p><code>src/lib/alert-correlation.ts</code> groups individual alerts into <strong>incidents</strong>:</p>
<table><thead><tr><th>Criterion</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td>Time window</td><td>5 min</td><td>Merge alerts from same service within 5 min</td></tr><tr><td>Common service</td><td>≥1 match</td><td><code>labels.service</code> or <code>resource</code> match</td></tr><tr><td>Common namespace</td><td>≥1 match</td><td>K8s <code>labels.namespace</code> match</td></tr><tr><td>Deduplication</td><td>1 min</td><td>Same <code>fingerprint</code> suppressed for 1 min</td></tr><tr><td>Severity escalation</td><td>3 warnings/5 min</td><td>→ promote to critical</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scoped-auto-diagnosis">Scoped Auto-Diagnosis<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#scoped-auto-diagnosis" class="hash-link" aria-label="Direct link to Scoped Auto-Diagnosis" title="Direct link to Scoped Auto-Diagnosis" translate="no">​</a></h3>
<p>Unlike the full 15-section diagnosis, this runs <strong>only within the firing alert's scope</strong> and completes in 1–2 minutes:</p>
<ol>
<li class=""><strong>AlertContext build</strong> — extract affected services/resources/namespaces + <code>since</code> timestamp</li>
<li class=""><strong>Scoped collection</strong> — CloudWatch metrics filtered to ±10 min around <code>since</code> and matched resources only</li>
<li class=""><strong>Section selection</strong> — run 3–5 of the 15 sections (Compute / Network / Container)</li>
<li class=""><strong>Change detection</strong> — compare against recent Terraform state / CloudTrail</li>
<li class=""><strong>Bedrock Sonnet analysis</strong> — root cause hypothesis + 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 (core interface)</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)">// firing time − 10 min</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)">// firing time + 10 min</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-notifications-block-kit">Slack Notifications (Block Kit)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#slack-notifications-block-kit" class="hash-link" aria-label="Direct link to Slack Notifications (Block Kit)" title="Direct link to Slack Notifications (Block Kit)" translate="no">​</a></h3>
<p>Severity drives channel routing and thread updates:</p>
<table><thead><tr><th>Severity</th><th>Default Channel</th><th>Color</th></tr></thead><tbody><tr><td><code>critical</code></td><td><code>#incidents</code></td><td>🔴 red</td></tr><tr><td><code>warning</code></td><td><code>#alerts</code></td><td>🟠 orange</td></tr><tr><td><code>info</code></td><td><code>#alerts-low</code></td><td>🔵 blue</td></tr></tbody></table>
<ul>
<li class="">Initial alert is the <strong>main message</strong>; follow-ups (merged alerts, AI diagnosis results, resolution) post as <strong>replies in the same thread</strong></li>
<li class="">Threading works in both Webhook and Bot Token modes (<code>thread_ts</code> is cached)</li>
<li class="">CloudWatch <code>OK</code> / Alertmanager <code>resolved</code> → ✅ resolution reply</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hmac-authentication">HMAC Authentication<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#hmac-authentication" class="hash-link" aria-label="Direct link to HMAC Authentication" title="Direct link to HMAC Authentication" translate="no">​</a></h3>
<p>Shared secret is stored in <code>alertWebhookSecret</code> in <code>data/config.json</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="alert-knowledge-base">Alert Knowledge Base<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#alert-knowledge-base" class="hash-link" aria-label="Direct link to Alert Knowledge Base" title="Direct link to Alert Knowledge Base" translate="no">​</a></h3>
<p>Diagnosis records persist under <code>data/alert-diagnosis/</code>:</p>
<table><thead><tr><th>File</th><th>Content</th></tr></thead><tbody><tr><td><code>incidents/&lt;id&gt;.json</code></td><td>Individual incident + AI diagnosis result</td></tr><tr><td><code>summary-&lt;YYYY-MM&gt;.json</code></td><td>Monthly stats (top services, alert names, resolution time)</td></tr></tbody></table>
<p>The UI <strong>Knowledge Base</strong> tab searches past similar incidents, and new incidents get similarity-based recommendations automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="major-documentation-expansion">Major Documentation Expansion<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#major-documentation-expansion" class="hash-link" aria-label="Direct link to Major Documentation Expansion" title="Direct link to Major Documentation Expansion" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="18-new-adrs-011028">18 New ADRs (011–028)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#18-new-adrs-011028" class="hash-link" aria-label="Direct link to 18 New ADRs (011–028)" title="Direct link to 18 New ADRs (011–028)" translate="no">​</a></h3>
<p>Design decisions behind features added in v1.8.0 are now formalized:</p>
<table><thead><tr><th>ADR</th><th>Topic</th></tr></thead><tbody><tr><td>ADR-011</td><td>External datasource integration (SSRF defense + allowlist)</td></tr><tr><td>ADR-012</td><td>SNS notification strategy</td></tr><tr><td>ADR-013</td><td>Auto-collect investigation agents</td></tr><tr><td>ADR-014</td><td>Report generation and scheduling</td></tr><tr><td>ADR-015</td><td>AI routing priority</td></tr><tr><td>ADR-016</td><td>Bedrock model selection strategy</td></tr><tr><td>ADR-017</td><td>Cache warmer design</td></tr><tr><td>ADR-018</td><td>Cognito auth flow</td></tr><tr><td>ADR-019</td><td>SSE streaming</td></tr><tr><td>ADR-020</td><td>HMAC webhook authentication</td></tr><tr><td>ADR-021</td><td>Admin email permission model</td></tr><tr><td>ADR-022</td><td>CDK stack split</td></tr><tr><td>ADR-023</td><td>Multi-route parallel execution</td></tr><tr><td>ADR-024</td><td>i18n (ko/en) support</td></tr><tr><td>ADR-025</td><td>Code interpreter sandbox</td></tr><tr><td>ADR-026</td><td>CloudFront + Lambda@Edge</td></tr><tr><td>ADR-027</td><td>OpenCost + Prometheus (EKS cost)</td></tr><tr><td>ADR-028</td><td>Memory store (conversation history)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-new-runbooks">5 New Runbooks<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#5-new-runbooks" class="hash-link" aria-label="Direct link to 5 New Runbooks" title="Direct link to 5 New Runbooks" translate="no">​</a></h3>
<p>Practical troubleshooting/setup guides for operational scenarios:</p>
<ul>
<li class=""><code>alert-pipeline-troubleshoot.md</code> — webhooks not arriving, correlation not forming incidents, Slack silent</li>
<li class=""><code>cache-warmer-operations.md</code> — debug cache warmer, add/remove queries</li>
<li class=""><code>cognito-auth-troubleshoot.md</code> — Lambda@Edge, HttpOnly cookies, OAuth2 callback issues</li>
<li class=""><code>deploy-flow.md</code> — operational manual for the 11-step deployment scripts</li>
<li class=""><code>multi-account-setup.md</code> — Aggregator config, cross-account IAM role, verification</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-new-module-claudemd-files">11 New Module CLAUDE.md Files<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#11-new-module-claudemd-files" class="hash-link" aria-label="Direct link to 11 New Module CLAUDE.md Files" title="Direct link to 11 New Module CLAUDE.md Files" translate="no">​</a></h3>
<p>Each source module now documents its role/rules/key files as Claude context:</p>
<table><thead><tr><th>Path</th><th>Purpose</th></tr></thead><tbody><tr><td><code>docs/CLAUDE.md</code></td><td>Documentation structure</td></tr><tr><td><code>runbooks/CLAUDE.md</code></td><td>Runbook index</td></tr><tr><td><code>decisions/CLAUDE.md</code></td><td>ADR index</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-step deployment scripts</td></tr><tr><td><code>tests/CLAUDE.md</code></td><td>Vitest structure</td></tr><tr><td><code>infra-cdk/CLAUDE.md</code></td><td>CDK stack composition</td></tr><tr><td><code>src/app/ai-diagnosis/CLAUDE.md</code></td><td>AI diagnosis page</td></tr><tr><td><code>src/app/alert-settings/CLAUDE.md</code></td><td>Alert settings page</td></tr><tr><td><code>src/app/k8s/CLAUDE.md</code></td><td>K8s page</td></tr><tr><td><code>src/lib/collectors/CLAUDE.md</code></td><td>7 auto-collect agents</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-guide-expansion">Web Guide Expansion<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#web-guide-expansion" class="hash-link" aria-label="Direct link to Web Guide Expansion" title="Direct link to Web Guide Expansion" translate="no">​</a></h3>
<p>The Docusaurus guide now reflects v1.8 features:</p>
<ul>
<li class=""><code>monitoring/ai-diagnosis.md</code> — 15-section diagnosis, export formats (DOCX/MD/PDF/PPTX), scheduling, cost control tips</li>
<li class=""><code>monitoring/alerts.md</code> — full alert pipeline flow, HMAC, correlation, Slack threading, knowledge base</li>
<li class=""><code>intro.md</code> — updated to 40 pages / 18 APIs / 11 AI routes, added "AI Diagnosis &amp; Alert Pipeline" feature block</li>
<li class=""><code>faq/troubleshooting.md</code> — Slack alert failure / AI diagnosis partial failure cases</li>
<li class="">Both Korean (<code>docs/</code>) and English (<code>i18n/en/docusaurus-plugin-content-docs/current/</code>) versions updated</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fix-highlights">Bug Fix Highlights<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#bug-fix-highlights" class="hash-link" aria-label="Direct link to Bug Fix Highlights" title="Direct link to Bug Fix Highlights" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>Description</th></tr></thead><tbody><tr><td><strong>Webpack dynamic import</strong></td><td>Added <code>/* webpackInclude: /\.(ts|tsx|js)$/ */</code> magic comment to collector dynamic imports — fixes build failure when CLAUDE.md was pulled into the webpack context</td></tr><tr><td><strong>Bedrock model ID</strong></td><td>Alert diagnosis uses <code>global.anthropic.claude-sonnet-4-6</code></td></tr><tr><td><strong>Slack thread reuse</strong></td><td>Webhook mode now persists <code>thread_ts</code> for follow-up replies</td></tr><tr><td><strong>Report download</strong></td><td>Uses proxy URL instead of S3 presigned URL — resolves 404 after STS session expiry</td></tr><tr><td><strong>SNS email</strong></td><td>Markdown stripped to plaintext before dispatch</td></tr><tr><td><strong>Cache warmer</strong></td><td>Monitoring queries excluded (CloudWatch FDW calls exhaust pg pool)</td></tr><tr><td><strong>Silent cookie deletion</strong></td><td>HttpOnly cookies require server-side deletion via <code>POST /api/auth</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-file-changes">Key File Changes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#key-file-changes" class="hash-link" aria-label="Direct link to Key File Changes" title="Direct link to Key File Changes" translate="no">​</a></h2>
<table><thead><tr><th>File</th><th>Change</th></tr></thead><tbody><tr><td><code>src/app/api/alert-webhook/route.ts</code></td><td>4-source webhook receiver + HMAC verification + correlation trigger + active incidents GET</td></tr><tr><td><code>src/app/api/notification/route.ts</code></td><td>Slack Block Kit / SNS dispatch (severity channel routing, markdown→plaintext)</td></tr><tr><td><code>src/lib/alert-types.ts</code></td><td>Per-source normalizers (CloudWatch/Alertmanager/Grafana/Generic)</td></tr><tr><td><code>src/lib/alert-correlation.ts</code></td><td>Correlation engine (30s buffer, time/service/resource matching)</td></tr><tr><td><code>src/lib/alert-diagnosis.ts</code></td><td>Diagnosis orchestrator (strategy selection, parallel collectors, AlertContext scope)</td></tr><tr><td><code>src/lib/alert-knowledge.ts</code></td><td>Knowledge base (JSONL storage, monthly summary, similarity search)</td></tr><tr><td><code>src/lib/slack-notification.ts</code></td><td>Slack client (Bot Token/Webhook, thread updates)</td></tr><tr><td><code>src/lib/alert-sqs-poller.ts</code></td><td>SQS background poller (SNS→SQS→EC2, DLQ, rate limit)</td></tr><tr><td><code>src/app/alert-settings/page.tsx</code></td><td>Alert settings admin page</td></tr><tr><td><code>docs/decisions/ADR-011~028.md</code></td><td>18 new ADRs</td></tr><tr><td><code>docs/runbooks/*.md</code></td><td>5 new runbooks</td></tr><tr><td><code>web/docs/monitoring/ai-diagnosis.md</code></td><td>AI comprehensive diagnosis guide</td></tr><tr><td><code>web/docs/monitoring/alerts.md</code></td><td>Alert pipeline guide</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-comparison">Version Comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#version-comparison" class="hash-link" aria-label="Direct link to Version Comparison" title="Direct link to Version Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.8.0</th><th>v1.8.1</th><th>Change</th></tr></thead><tbody><tr><td>Alert pipeline</td><td>—</td><td><strong>Webhook + correlation + AI diagnosis</strong></td><td>NEW</td></tr><tr><td>Supported alert sources</td><td>—</td><td><strong>4 (CloudWatch/Alertmanager/Grafana/Generic)</strong></td><td>NEW</td></tr><tr><td>Slack notifications</td><td>—</td><td><strong>Block Kit + thread updates</strong></td><td>NEW</td></tr><tr><td>ADRs</td><td>10 (001–010)</td><td><strong>28 (001–028)</strong></td><td>+18</td></tr><tr><td>Runbooks</td><td>—</td><td><strong>5</strong></td><td>NEW</td></tr><tr><td>Module CLAUDE.md</td><td>7</td><td><strong>18</strong></td><td>+11</td></tr><tr><td>Web guide pages</td><td>39</td><td><strong>41</strong></td><td>+2 (ai-diagnosis, alerts)</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/23/v1.8.1#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class="">ADR-009: Alert-triggered AI diagnosis</li>
<li class="">ADR-012: SNS notification strategy</li>
<li class="">ADR-013: Auto-collect investigation agents</li>
<li class="">ADR-020: HMAC webhook authentication</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 — External observability + AI comprehensive diagnosis]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0"/>
        <updated>2026-04-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[7 external observability platforms + natural-language→query, AI routing 10→11 (datasource), 15-section AI diagnosis (DOCX/PDF/schedule), SSRF protection.]]></summary>
        <content type="html"><![CDATA[<p>A major release that integrates external observability stacks as datasources, adds <strong>natural-language-to-query</strong> generation, and ships the <strong>15-section AI comprehensive diagnosis</strong> report.</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>Highlights</div><div class="admonitionContent_BuS1"><p><strong>7 observability platforms</strong> · <strong>natural language → PromQL/LogQL/TraceQL/SQL</strong> · <strong>AI routing 10→11 (<code>datasource</code>)</strong> · <strong>15-section diagnosis + DOCX/PDF/schedule</strong> · <strong>SSRF protection</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-observability-integration-7-platforms">External observability integration (7 platforms)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0#external-observability-integration-7-platforms" class="hash-link" aria-label="Direct link to External observability integration (7 platforms)" title="Direct link to External observability integration (7 platforms)" translate="no">​</a></h2>
<p>On top of AWS data, AWSops connects existing observability platforms as datasources.</p>
<table><thead><tr><th>Type</th><th>Platform</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> — datasource CRUD · connection test · auth configuration</li>
<li class=""><code>/datasources/explore</code> — direct query execution + <strong>AI query generation (natural language → PromQL/LogQL/TraceQL/SQL)</strong></li>
<li class="">The AI assistant's <code>datasource</code> route auto-classifies external-metric questions (AI routing expanded <strong>10 → 11</strong>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-comprehensive-diagnosis-15-sections">AI comprehensive diagnosis (15 sections)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0#ai-comprehensive-diagnosis-15-sections" class="hash-link" aria-label="Direct link to AI comprehensive diagnosis (15 sections)" title="Direct link to AI comprehensive diagnosis (15 sections)" translate="no">​</a></h2>
<ul>
<li class="">Bedrock Opus analyzes the whole infrastructure across <strong>15 sections</strong> — focused on cost/security/reliability</li>
<li class="">Export to <strong>DOCX · Markdown · browser Print-to-PDF</strong></li>
<li class=""><strong>Weekly/biweekly/monthly</strong> auto-schedule (report scheduler)</li>
<li class="">Print-friendly report page <code>/ai-diagnosis/report</code> (A4 page breaks)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-ssrf-protection">Security (SSRF protection)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0#security-ssrf-protection" class="hash-link" aria-label="Direct link to Security (SSRF protection)" title="Direct link to Security (SSRF protection)" translate="no">​</a></h2>
<ul>
<li class="">URL validation in <code>datasource-client.ts</code> protects all outbound fetch paths, including the AI route</li>
<li class="">Allowlist-based private-network access control + IPv6 private/link-local detection (<code>fc00::/7</code>, <code>fe80::/10</code>)</li>
<li class="">Datasource query and AI query generation are admin-only</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="also">Also<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/07/v1.8.0#also" class="hash-link" aria-label="Direct link to Also" title="Direct link to Also" translate="no">​</a></h2>
<ul>
<li class=""><strong>Converse Stream API</strong> for multi-route synthesis + typing effect for AgentCore responses</li>
<li class="">Automatic zombie PostgreSQL connection cleanup; time-range filters on monitoring queries to prevent pg pool exhaustion</li>
<li class="">EKS Access Entry status + kubeconfig registration, EKS service resources tab</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 Diagnosis Overhaul + Auto-Collect Agents]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3"/>
        <updated>2026-04-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AI Diagnosis renewal (DOCX/MD/PDF export, scheduled reports), 6 auto-collect agents, FinOps MCP, major EKS UX improvements.]]></summary>
        <content type="html"><![CDATA[<p>The <strong>AI Diagnosis</strong> feature has been completely revamped with <strong>3 export formats</strong> (DOCX/Markdown/PDF), <strong>scheduled reports</strong> (weekly/biweekly/monthly), and <strong>6 Auto-Collect agents</strong> that automatically gather data from multiple sources. The EKS pages also received major UX improvements including cluster access management, Describe panel, and Service Resources tab.</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>AI Diagnosis Renewal</strong> · <strong>DOCX/MD/PDF Export</strong> · <strong>Scheduled Reports</strong> · <strong>6 Auto-Collect Agents</strong> · <strong>FinOps MCP 5 Tools</strong> · <strong>EKS Cluster Access Management</strong> · <strong>Powerpipe Exit Code 2 Handling</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-diagnosis-renewal">AI Diagnosis Renewal<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#ai-diagnosis-renewal" class="hash-link" aria-label="Direct link to AI Diagnosis Renewal" title="Direct link to AI Diagnosis Renewal" translate="no">​</a></h2>
<p>The route has been renamed from <code>/diagnosis</code> to <code>/ai-diagnosis</code>, and the entire UI has been revamped.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after">Before / After<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#before--after" class="hash-link" aria-label="Direct link to Before / After" title="Direct link to Before / After" translate="no">​</a></h3>
<table><thead><tr><th>Item</th><th>Before (v1.7.2)</th><th>After (v1.7.3)</th></tr></thead><tbody><tr><td>Route</td><td><code>/diagnosis</code></td><td><strong><code>/ai-diagnosis</code></strong></td></tr><tr><td>Name</td><td>Comprehensive Diagnosis</td><td><strong>AI Diagnosis</strong></td></tr><tr><td>Export</td><td>PPTX</td><td><strong>DOCX + Markdown + PDF</strong></td></tr><tr><td>Scheduled Reports</td><td>—</td><td><strong>Weekly/Biweekly/Monthly</strong></td></tr><tr><td>S3 Upload</td><td>—</td><td><strong>Auto-upload DOCX + MD</strong></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-export-formats">3 Export Formats<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#3-export-formats" class="hash-link" aria-label="Direct link to 3 Export Formats" title="Direct link to 3 Export Formats" translate="no">​</a></h3>
<p><strong>DOCX</strong> — Professional A4 report via <code>docx</code> package:</p>
<ul>
<li class="">Cover page (title, health score, account alias, date)</li>
<li class="">Table of contents (hyperlinks, Heading 1-3)</li>
<li class="">Section-specific accent colors (cost=green, security=red, network/EKS=purple, idle/MSK=orange)</li>
<li class="">Markdown parsing (headings, tables, lists, blockquotes, inline code/bold/italic)</li>
</ul>
<p><strong>Markdown</strong> — All sections concatenated into a single <code>.md</code> file.</p>
<p><strong>PDF</strong> — Dedicated print page at <code>/ai-diagnosis/report</code>:</p>
<ul>
<li class="">White background A4 layout with CSS <code>@media print</code> page breaks</li>
<li class="">"Print / Save as PDF" button triggers browser 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 (key structure)</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="scheduled-reports">Scheduled Reports<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#scheduled-reports" class="hash-link" aria-label="Direct link to Scheduled Reports" title="Direct link to Scheduled Reports" translate="no">​</a></h3>
<table><thead><tr><th>Item</th><th>Description</th></tr></thead><tbody><tr><td>Frequency</td><td>Weekly / Biweekly / Monthly</td></tr><tr><td>Timezone</td><td>KST (UTC+9)</td></tr><tr><td>Configuration</td><td>Day of week (0-6), day of month (1-28), hour (0-23)</td></tr><tr><td>Storage</td><td><code>data/report-schedule.json</code></td></tr><tr><td>Check interval</td><td>Every 5 minutes</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=Sun ~ 6=Sat</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>Toggle ON/OFF in the UI, set frequency/day/hour/language, and reports are automatically generated and uploaded to 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 Upload</div><div class="admonitionContent_BuS1"><p>DOCX and Markdown files are automatically uploaded to <code>awsops-deploy-{accountId}/reports/</code>. Download via Presigned URLs valid for 7 days. S3 PutObject/GetObject permissions are automatically added to the CDK stack.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-auto-collect-agents">6 Auto-Collect Agents<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#6-auto-collect-agents" class="hash-link" aria-label="Direct link to 6 Auto-Collect Agents" title="Direct link to 6 Auto-Collect Agents" translate="no">​</a></h2>
<p>Dedicated agents that automate data collection for the AI Diagnosis report. Each agent collects data from multiple sources in parallel and streams live status updates.</p>
<table><thead><tr><th>Agent</th><th>Sources</th><th>Collected Data</th></tr></thead><tbody><tr><td><strong>EKS Optimize</strong></td><td>Prometheus + K8s + Steampipe</td><td>CPU/memory usage, throttling, pod restarts, HTTP 5xx, node utilization</td></tr><tr><td><strong>DB Optimize</strong></td><td>Steampipe + CloudWatch</td><td>RDS/ElastiCache/OpenSearch discovery + metric-based rightsizing</td></tr><tr><td><strong>MSK Optimize</strong></td><td>Steampipe + CloudWatch + Prometheus</td><td>Broker metrics, message throughput, consumer lag, partition count</td></tr><tr><td><strong>Idle Scan</strong></td><td>Steampipe</td><td>Unattached EBS, gp2 volumes, unused EIPs, stopped EC2, 90+ day snapshots, unused SGs + cost estimation</td></tr><tr><td><strong>Trace Analyze</strong></td><td>Tempo/Jaeger + Prometheus</td><td>Per-service error traces, slow traces (&gt;500ms)</td></tr><tr><td><strong>Incident</strong></td><td>CloudWatch + K8s + Prometheus</td><td>ALARM state alarms, Warning events, HTTP 5xx spikes, CPU spikes, memory pressure</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 Pattern</div><div class="admonitionContent_BuS1"><p>All agents implement the same <code>Collector</code> interface. <code>collect()</code> uses <code>Promise.allSettled</code> for parallel multi-source collection and delivers progress via <code>SendFn</code> callback. To add a new agent, just implement this interface.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finops-mcp-lambda">FinOps MCP Lambda<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#finops-mcp-lambda" class="hash-link" aria-label="Direct link to FinOps MCP Lambda" title="Direct link to FinOps MCP Lambda" translate="no">​</a></h2>
<p><strong>5 FinOps tools</strong> added to the Cost Gateway.</p>
<table><thead><tr><th>Tool</th><th>Source</th><th>Description</th></tr></thead><tbody><tr><td><code>get_rightsizing_recommendations</code></td><td>Compute Optimizer</td><td>EC2/RDS/ECS/Lambda rightsizing + monthly savings</td></tr><tr><td><code>get_savings_plans_recommendations</code></td><td>Cost Explorer</td><td>Savings Plans purchase recommendations (1yr/3yr, No Upfront)</td></tr><tr><td><code>get_reserved_instance_recommendations</code></td><td>Cost Explorer</td><td>RI purchase recommendations (EC2/RDS/ElastiCache/Redshift)</td></tr><tr><td><code>get_cost_optimization_hub_recommendations</code></td><td>Cost Optimization Hub</td><td>Unified optimization recommendations (Rightsize/Stop/Upgrade/SP)</td></tr><tr><td><code>get_trusted_advisor_cost_checks</code></td><td>Trusted Advisor</td><td>Cost optimization category checks + flagged resources</td></tr></tbody></table>
<p>All tools support cross-account queries via the <code>target_account_id</code> parameter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="eksk8s-major-ux-improvements">EKS/K8s Major UX Improvements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#eksk8s-major-ux-improvements" class="hash-link" aria-label="Direct link to EKS/K8s Major UX Improvements" title="Direct link to EKS/K8s Major UX Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-access-management">Cluster Access Management<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#cluster-access-management" class="hash-link" aria-label="Direct link to Cluster Access Management" title="Direct link to Cluster Access Management" translate="no">​</a></h3>
<table><thead><tr><th>Feature</th><th>Description</th></tr></thead><tbody><tr><td><strong>Access Status Badge</strong></td><td>Per-cluster "Access Entry" registration status</td></tr><tr><td><strong>One-Click Registration</strong></td><td>"Register ViewPolicy" button auto-creates Access Entry + Policy</td></tr><tr><td><strong>Connection Detection</strong></td><td>Detects actual connectivity by checking <code>context_name</code> in K8s query results</td></tr><tr><td><strong>CLI Guide</strong></td><td>Shows EC2 Role ARN-based registration commands for unconnected clusters</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-features">New Features<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h3>
<table><thead><tr><th>Feature</th><th>File</th><th>Description</th></tr></thead><tbody><tr><td><strong>Describe Panel</strong></td><td><code>K9sDetailPanel</code></td><td>JSONB detail view (labels, annotations, containers, volumes, conditions)</td></tr><tr><td><strong>Service Resources Tab</strong></td><td><code>k8s.ts</code></td><td>Per-service CPU/Memory bar charts (Pod selector join)</td></tr><tr><td><strong>Cluster Filter</strong></td><td><code>k8s/page.tsx</code></td><td>Click cluster cards to filter nodes/pods/events/services</td></tr><tr><td><strong>StatsCard Navigation</strong></td><td><code>StatsCard.tsx</code></td><td>Nodes→<code>/k8s/nodes</code>, Pods→<code>/k8s/pods</code>, etc. click navigation</td></tr><tr><td><strong>SQL Consolidation</strong></td><td><code>queries/k8s.ts</code></td><td>Inline SQL moved to centralized query file + cache warmer</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h3>
<ul>
<li class=""><code>external_ip</code> → <code>external_ips</code> column name fix (services 0/0 bug)</li>
<li class="">EC2 IAM Role ARN truncation fix (SQL <code>||</code> operator filter conflict)</li>
<li class="">Prevent cluster filter toggle on Register click (<code>stopPropagation</code>)</li>
<li class="">Post-registration polling for connection verification (5 attempts × 3s)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmark-powerpipe-exit-code-2-handling">Benchmark: Powerpipe Exit Code 2 Handling<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#benchmark-powerpipe-exit-code-2-handling" class="hash-link" aria-label="Direct link to Benchmark: Powerpipe Exit Code 2 Handling" title="Direct link to Benchmark: Powerpipe Exit Code 2 Handling" translate="no">​</a></h2>
<p>Powerpipe exits with <strong>exit code 2</strong> when benchmark controls have alarms. This is expected behavior, but the previous code treated it as an error.</p>
<table><thead><tr><th>Item</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>Criteria</td><td>exit code === 0</td><td><strong>Output file exists + size &gt; 0</strong></td></tr><tr><td>Exit code 2</td><td>Error</td><td><strong>Normal</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)"># Ignore exit code, validate by output file</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="infrastructure-s3-report-upload--update-infra-script">Infrastructure: S3 Report Upload + update-infra Script<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#infrastructure-s3-report-upload--update-infra-script" class="hash-link" aria-label="Direct link to Infrastructure: S3 Report Upload + update-infra Script" title="Direct link to Infrastructure: S3 Report Upload + update-infra Script" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3-policy">S3 Policy<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#s3-policy" class="hash-link" aria-label="Direct link to S3 Policy" title="Direct link to S3 Policy" translate="no">​</a></h3>
<p>S3 permissions added to the EC2 role in the CDK stack:</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-script">update-infra Script<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#update-infra-script" class="hash-link" aria-label="Direct link to update-infra Script" title="Direct link to update-infra Script" translate="no">​</a></h3>
<p><code>00-update-infra.sh</code> script for safe CDK stack updates without EC2 replacement:</p>
<ol>
<li class=""><strong>Read existing stack parameters</strong> — Preserve current CloudFormation values</li>
<li class=""><strong>Reconstruct CDK context</strong> — Re-derive from live infrastructure (VPC, TGW, domain)</li>
<li class=""><strong>cdk diff preview</strong> — Warn if EC2 would be replaced</li>
<li class=""><strong>Deploy</strong> — Safe deployment with <code>--no-rollback</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-comparison">Version Comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#version-comparison" class="hash-link" aria-label="Direct link to Version Comparison" title="Direct link to Version Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.7.2</th><th>v1.7.3</th><th>Change</th></tr></thead><tbody><tr><td>Diagnosis route</td><td><code>/diagnosis</code></td><td><strong><code>/ai-diagnosis</code></strong></td><td>Renamed</td></tr><tr><td>Export formats</td><td>PPTX</td><td><strong>DOCX + MD + PDF</strong></td><td>3 formats</td></tr><tr><td>Scheduled reports</td><td>—</td><td><strong>Weekly/Biweekly/Monthly</strong></td><td>New</td></tr><tr><td>Auto-Collect</td><td>—</td><td><strong>6 agents</strong></td><td>New</td></tr><tr><td>FinOps tools</td><td>—</td><td><strong>5 MCP tools</strong></td><td>New</td></tr><tr><td>EKS access</td><td>Manual</td><td><strong>One-click registration</strong></td><td>Improved</td></tr><tr><td>Benchmark</td><td>Exit code dependent</td><td><strong>Output file validation</strong></td><td>Fixed</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-file-changes">Key File Changes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/06/v1.7.3#key-file-changes" class="hash-link" aria-label="Direct link to Key File Changes" title="Direct link to Key File Changes" translate="no">​</a></h2>
<table><thead><tr><th>File</th><th>Change</th></tr></thead><tbody><tr><td><code>src/app/ai-diagnosis/page.tsx</code></td><td>Diagnosis page renewal (route change, schedule UI)</td></tr><tr><td><code>src/app/ai-diagnosis/report/page.tsx</code></td><td>PDF print-friendly page</td></tr><tr><td><code>src/app/api/report/route.ts</code></td><td>Report generation API (15 sections, S3 upload)</td></tr><tr><td><code>src/lib/report-docx.ts</code></td><td>DOCX generator (cover, TOC, section styles)</td></tr><tr><td><code>src/lib/report-scheduler.ts</code></td><td>Scheduled report scheduler (5-min check)</td></tr><tr><td><code>src/lib/report-prompts.ts</code></td><td>15 section-specific Bedrock analysis prompts</td></tr><tr><td><code>src/lib/report-generator.ts</code></td><td>Data collection orchestrator</td></tr><tr><td><code>src/lib/collectors/*.ts</code></td><td>6 Auto-Collect agents</td></tr><tr><td><code>agent/lambda/aws_finops_mcp.py</code></td><td>FinOps MCP Lambda (5 tools)</td></tr><tr><td><code>src/app/api/benchmark/route.ts</code></td><td>Powerpipe exit code 2 handling</td></tr><tr><td><code>src/lib/queries/k8s.ts</code></td><td>K8s SQL query consolidation + Service Resources</td></tr><tr><td><code>src/components/dashboard/StatsCard.tsx</code></td><td>Click navigation (<code>href</code> prop)</td></tr><tr><td><code>infra-cdk/lib/awsops-stack.ts</code></td><td>S3 reports/* policy</td></tr><tr><td><code>scripts/00-update-infra.sh</code></td><td>Safe infrastructure update script</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/en/whatsnew/2026/04/01/v1.7.2</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2"/>
        <updated>2026-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Grafana-style external datasource management (7 types), SSRF/SQL Injection defense, dynamic VPC CIDR, datasource diagnostics agent.]]></summary>
        <content type="html"><![CDATA[<p>Added <strong>7 external datasource types</strong> manageable in a Grafana-style interface. Includes SSRF defense and SQL Injection prevention security layers, <strong>dynamic VPC CIDR</strong> configuration, and a dedicated <strong>datasource diagnostics agent</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>7 External Datasources</strong> · <strong>SSRF Defense</strong> · <strong>SQL Injection Prevention</strong> · <strong>Dynamic VPC CIDR</strong> · <strong>Datasource Diagnostics Agent</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-datasource-management">External Datasource Management<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#external-datasource-management" class="hash-link" aria-label="Direct link to External Datasource Management" title="Direct link to External Datasource Management" translate="no">​</a></h2>
<p>Connect and query external observability tools directly from AWSops, similar to Grafana's datasource management.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-supported-datasource-types">7 Supported Datasource Types<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#7-supported-datasource-types" class="hash-link" aria-label="Direct link to 7 Supported Datasource Types" title="Direct link to 7 Supported Datasource Types" translate="no">​</a></h3>
<table><thead><tr><th>Type</th><th>Query Language</th><th>Primary Use</th></tr></thead><tbody><tr><td><strong>Prometheus</strong></td><td>PromQL</td><td>Metric collection/query</td></tr><tr><td><strong>Loki</strong></td><td>LogQL</td><td>Log aggregation/search</td></tr><tr><td><strong>Tempo</strong></td><td>TraceQL</td><td>Distributed tracing</td></tr><tr><td><strong>ClickHouse</strong></td><td>SQL</td><td>Analytics data warehouse</td></tr><tr><td><strong>Jaeger</strong></td><td>Trace API</td><td>Distributed tracing</td></tr><tr><td><strong>Dynatrace</strong></td><td>API</td><td>APM / full-stack observability</td></tr><tr><td><strong>Datadog</strong></td><td>API</td><td>Monitoring / 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="feature-details">Feature Details<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#feature-details" class="hash-link" aria-label="Direct link to Feature Details" title="Direct link to Feature Details" translate="no">​</a></h3>
<table><thead><tr><th>Feature</th><th>Description</th></tr></thead><tbody><tr><td><strong>CRUD</strong></td><td>Create/edit/delete datasources (Admin only)</td></tr><tr><td><strong>Connection Test</strong></td><td>One-click connection test + response time (ms) measurement</td></tr><tr><td><strong>Query Execution</strong></td><td>Execute queries using type-specific query languages</td></tr><tr><td><strong>4 Auth Methods</strong></td><td>None, Basic Auth, Bearer Token, Custom Header</td></tr><tr><td><strong>Credential Masking</strong></td><td>Passwords/tokens masked as <code>***</code> in API responses</td></tr><tr><td><strong>i18n</strong></td><td>Korean + English support</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configjson-datasource-configuration">config.json Datasource Configuration<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#configjson-datasource-configuration" class="hash-link" aria-label="Direct link to config.json Datasource Configuration" title="Direct link to config.json Datasource Configuration" translate="no">​</a></h3>
<p>Datasources are managed via a <code>datasources</code> array in <code>data/config.json</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 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>Datasource Management Principle</div><div class="admonitionContent_BuS1"><p>Same pattern as the existing <code>accounts[]</code> array — modify only <code>data/config.json</code> to add/remove datasources without code changes. Only Admin-privileged users can perform CRUD operations.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-ssrf-defense">Security: SSRF Defense<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#security-ssrf-defense" class="hash-link" aria-label="Direct link to Security: SSRF Defense" title="Direct link to Security: SSRF Defense" translate="no">​</a></h2>
<p>A validation layer prevents <strong>SSRF (Server-Side Request Forgery)</strong> attacks before sending requests to external URLs.</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 (simplified)</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)">// Block private IP ranges</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 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">172</span><span class="token regex regex-source language-regex special-escape escape">\.</span><span class="token regex regex-source language-regex group punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token regex regex-source language-regex">1</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token regex regex-source language-regex char-class range">6</span><span class="token regex regex-source language-regex char-class range range-punctuation operator">-</span><span class="token regex regex-source language-regex char-class range">9</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token regex regex-source language-regex alternation keyword" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token regex regex-source language-regex">2</span><span class="token regex regex-source language-regex char-set class-name">\d</span><span class="token regex regex-source language-regex alternation keyword" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token regex regex-source language-regex">3</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token regex regex-source language-regex char-class">01</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token regex regex-source language-regex group punctuation" style="color:rgb(248, 248, 242)">)</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><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">192</span><span class="token regex regex-source language-regex special-escape escape">\.</span><span class="token regex regex-source language-regex">168</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 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">127</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 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">169</span><span class="token regex regex-source language-regex special-escape escape">\.</span><span class="token regex regex-source language-regex">254</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 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">0</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><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)">// Block 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"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-clickhouse-sql-injection-prevention">Security: ClickHouse SQL Injection Prevention<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#security-clickhouse-sql-injection-prevention" class="hash-link" aria-label="Direct link to Security: ClickHouse SQL Injection Prevention" title="Direct link to Security: ClickHouse SQL Injection Prevention" translate="no">​</a></h2>
<p>ClickHouse queries use <strong>parameterized queries</strong> instead of string interpolation:</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)">// Safe: parameterized query</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"></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/en/whatsnew/2026/04/01/v1.7.2#dynamic-vpc-cidr" class="hash-link" aria-label="Direct link to Dynamic VPC CIDR" title="Direct link to Dynamic VPC CIDR" translate="no">​</a></h2>
<p>VPC CIDR can now be set via <strong>CDK context parameters</strong>.</p>
<table><thead><tr><th>Item</th><th>Before (v1.7.1)</th><th>After (v1.7.2)</th></tr></thead><tbody><tr><td>VPC CIDR</td><td>Hardcoded</td><td><strong><code>newVpcCidr</code> context parameter</strong></td></tr><tr><td>Default</td><td>—</td><td><code>10.10.0.0/16</code></td></tr><tr><td>TGW Route CIDR</td><td><code>tgwRouteCidr</code> (single)</td><td><strong><code>tgwRouteCidrs</code> (multiple, comma-separated)</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 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.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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="datasource-diagnostics-agent">Datasource Diagnostics Agent<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#datasource-diagnostics-agent" class="hash-link" aria-label="Direct link to Datasource Diagnostics Agent" title="Direct link to Datasource Diagnostics Agent" translate="no">​</a></h2>
<p>A dedicated agent for <strong>systematically diagnosing</strong> external datasource connection issues. A new <code>datasource</code> route (priority 11) is added to AI routing.</p>
<p>Diagnostic areas: <strong>Network</strong> (host reachability, firewall/SG), <strong>Authentication</strong> (credential validity, token expiry), <strong>SSL/TLS</strong> (certificate chain), <strong>DNS</strong> (resolution, propagation).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-comparison">Version Comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/04/01/v1.7.2#version-comparison" class="hash-link" aria-label="Direct link to Version Comparison" title="Direct link to Version Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.7.1</th><th>v1.7.2</th><th>Change</th></tr></thead><tbody><tr><td>Pages</td><td>36</td><td><strong>37</strong></td><td>+datasources</td></tr><tr><td>API Routes</td><td>13</td><td><strong>14</strong></td><td>+datasources API</td></tr><tr><td>AI Routes</td><td>10</td><td><strong>11</strong></td><td>+datasource diagnostics</td></tr><tr><td>Datasource Types</td><td>0</td><td><strong>7</strong></td><td>New feature</td></tr><tr><td>Auth Methods</td><td>—</td><td><strong>4</strong></td><td>None/Basic/Bearer/Custom</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="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 + Streaming UX Improvements]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Bedrock Converse Stream API for multi-route synthesis, Gateway response typing effect, monitoring query time range filters.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces the <strong>Bedrock Converse Stream API</strong> for multi-route synthesis, applies a <strong>typing effect</strong> to AgentCore Gateway responses, and adds <strong>time range filters</strong> to monitoring queries to resolve pg pool exhaustion issues.</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>Converse Stream API</strong> · <strong>Typing Effect (50char/15ms)</strong> · <strong>Chat Bubble Width Stabilization</strong> · <strong>3 Monitoring Query Time Filters</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-time-synthesis-with-converse-stream-api">Real-time Synthesis with Converse Stream API<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#real-time-synthesis-with-converse-stream-api" class="hash-link" aria-label="Direct link to Real-time Synthesis with Converse Stream API" title="Direct link to Real-time Synthesis with Converse Stream API" translate="no">​</a></h2>
<p>Multi-route response synthesis has transitioned from fake chunking to <strong>real token streaming</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after">Before / After<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#before--after" class="hash-link" aria-label="Direct link to Before / After" title="Direct link to Before / After" translate="no">​</a></h3>
<table><thead><tr><th>Item</th><th>Before (v1.7.0)</th><th>After (v1.7.1)</th></tr></thead><tbody><tr><td>Synthesis API</td><td><code>InvokeModelCommand</code></td><td><strong><code>ConverseStreamCommand</code></strong></td></tr><tr><td>Synthesis Function</td><td><code>synthesizeResponses()</code></td><td><strong><code>synthesizeResponsesStreaming()</code></strong></td></tr><tr><td>Streaming Method</td><td>Full response generated → <code>simulateStreaming()</code></td><td>Token sent immediately via <code>chunk</code> event on generation</td></tr><tr><td>First Token Latency</td><td>Wait for full response (5-15s)</td><td><strong>~200ms</strong> (first token immediate)</td></tr><tr><td>User Experience</td><td>Long wait then fast output</td><td>Starts immediately, natural flow</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="code-changes">Code Changes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#code-changes" class="hash-link" aria-label="Direct link to Code Changes" title="Direct link to Code Changes" 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)">// Split completed text into 50-char chunks for fake streaming</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() callback transmits chunk immediately on each contentBlockDelta</span><br></span></code></pre></div></div>
<p><strong><code>synthesizeResponsesStreaming()</code> core logic</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)">// Immediate token delivery</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="typing-effect-simulatestreaming">Typing Effect (<code>simulateStreaming</code>)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#typing-effect-simulatestreaming" class="hash-link" aria-label="Direct link to typing-effect-simulatestreaming" title="Direct link to typing-effect-simulatestreaming" translate="no">​</a></h2>
<p>Since AgentCore Gateway returns completed text all at once, a typing effect is simulated.</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 chars per chunk</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 delay between chunks</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>Applied to</strong> (3 locations):</p>
<ol>
<li class=""><strong>Single AgentCore Gateway response</strong> — Typing effect on completed text</li>
<li class=""><strong>Multi-route synthesis (v1.7.0)</strong> — Applied to <code>synthesizeResponses()</code> result (replaced by Converse Stream in v1.7.1)</li>
<li class=""><strong>Multi-route single success</strong> — When only 1 Gateway succeeds</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>Why is simulation needed?</div><div class="admonitionContent_BuS1"><p>Direct Bedrock calls can use <code>InvokeModelWithResponseStreamCommand</code> for real streaming, but AgentCore Gateway calls tools multiple times internally and <strong>returns only the final text</strong>. The 50-char/15ms typing effect is applied to provide a consistent streaming experience to users.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="chat-bubble-width-stabilization-pr-8">Chat Bubble Width Stabilization (PR #8)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#chat-bubble-width-stabilization-pr-8" class="hash-link" aria-label="Direct link to Chat Bubble Width Stabilization (PR #8)" title="Direct link to Chat Bubble Width Stabilization (PR #8)" translate="no">​</a></h2>
<p>Fixed an issue where chat bubble width would suddenly change during SSE streaming.</p>
<table><thead><tr><th>Item</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>Behavior</td><td>Width jumps as content grows</td><td>Full width fixed from first chunk</td></tr><tr><td>File</td><td><code>src/app/ai/page.tsx</code></td><td>Same</td></tr></tbody></table>
<p><strong>Before</strong> — Width jump:</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;!-- Narrow when content is short, suddenly widens when longer --&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> — Stable width:</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 ensures max width from start, max-w-5xl caps the upper limit --&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 Pattern</div><div class="admonitionContent_BuS1"><p>For containers where content is progressively added (like SSE streaming), use the <strong><code>w-full max-w-{size}</code></strong> combination.
Using only <code>max-w-{size}</code> causes width to vary with content amount.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-query-time-range-filters">Monitoring Query Time Range Filters<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#monitoring-query-time-range-filters" class="hash-link" aria-label="Direct link to Monitoring Query Time Range Filters" title="Direct link to Monitoring Query Time Range Filters" translate="no">​</a></h2>
<p>Fixed an issue where monitoring queries without time range limits were fetching <strong>full historical data</strong> via the Steampipe API, occupying all 5 pg pool connections.</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>Query</th><th>File</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td><code>ec2CpuHourly</code></td><td><code>queries/metrics.ts</code></td><td>No time limit</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>No time limit</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 Exhaustion Symptoms</div><div class="admonitionContent_BuS1"><p>In environments with 46+ EC2 instances + many EBS volumes, queries without time limits <strong>occupy connections for several minutes</strong>.
When all <code>max: 5</code> pg pool connections are in use, the dashboard and all pages wait until <code>statement_timeout: 120s</code> and then fail.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-of-3-streaming-modes">Summary of 3 Streaming Modes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/29/v1.7.1#summary-of-3-streaming-modes" class="hash-link" aria-label="Direct link to Summary of 3 Streaming Modes" title="Direct link to Summary of 3 Streaming Modes" translate="no">​</a></h2>
<p>In v1.7.1, AWSops AI responses use 3 streaming modes depending on the situation.</p>
<table><thead><tr><th>Mode</th><th>When Used</th><th>Implementation</th><th>First Token Latency</th></tr></thead><tbody><tr><td><strong>Real Streaming</strong></td><td>Direct Bedrock calls</td><td><code>InvokeModelWithResponseStreamCommand</code></td><td>~200ms</td></tr><tr><td><strong>Converse Stream</strong></td><td>Multi-route synthesis</td><td><code>ConverseStreamCommand</code> + <code>contentBlockDelta</code></td><td>~200ms</td></tr><tr><td><strong>Simulated Streaming</strong></td><td>AgentCore Gateway responses</td><td><code>simulateStreaming()</code> (50char/15ms)</td><td>Immediate after response completes</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>Unified Client Experience</div><div class="admonitionContent_BuS1"><p>All 3 modes use the same SSE <code>chunk</code> event, so the client (<code>src/app/ai/page.tsx</code>) does not distinguish between modes — it simply accumulates deltas in the <code>streamingContent</code> state and renders in real time with 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 — Multi-Account + Real-time Streaming]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0"/>
        <updated>2026-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Multi-account support (PR #6), real-time Bedrock streaming, cache pre-warming, 25 security fixes, and customer logo customization.]]></summary>
        <content type="html"><![CDATA[<p>A major release featuring <strong>multi-account support</strong> (PR #6) and <strong>real-time Bedrock streaming</strong> as core features. Includes <strong>25 security fixes</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>Multi-Account (PR #6)</strong> · <strong>Real-time Streaming</strong> · <strong>Cache Pre-warming</strong> · <strong>25 Security Fixes</strong> · <strong>Customer Logo Customization</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-account-architecture-pr-6">Multi-Account Architecture (PR #6)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#multi-account-architecture-pr-6" class="hash-link" aria-label="Direct link to Multi-Account Architecture (PR #6)" title="Direct link to Multi-Account Architecture (PR #6)" translate="no">​</a></h2>
<p>Manage multiple AWS accounts from a single dashboard using the Steampipe Aggregator pattern. Add accounts by simply changing the <code>accounts[]</code> array in <code>data/config.json</code> with no code changes required.</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>Component</th><th>File</th><th>Role</th></tr></thead><tbody><tr><td><code>AccountContext</code></td><td><code>src/components/</code></td><td>Account state management + <code>useAccount()</code> hook</td></tr><tr><td><code>AccountSelector</code></td><td><code>src/components/</code></td><td>Account switching dropdown (ARIA, keyboard support)</td></tr><tr><td><code>AccountBadge</code></td><td><code>src/components/</code></td><td>Per-account color dot + alias display</td></tr><tr><td><code>buildSearchPath()</code></td><td><code>src/lib/steampipe.ts</code></td><td>Returns <code>public, aws_{id}, kubernetes, trivy</code></td></tr><tr><td><code>runCostQueriesPerAccount()</code></td><td><code>src/lib/steampipe.ts</code></td><td>Runs Cost queries per account then merges with <code>account_id</code> tags</td></tr><tr><td><code>/accounts</code> page</td><td><code>src/app/accounts/</code></td><td>Account add/remove/test UI</td></tr><tr><td><code>cross_account.py</code></td><td><code>agent/</code></td><td>STS AssumeRole (credential caching, ExternalId, audit logging)</td></tr><tr><td>Setup Script</td><td><code>scripts/11-setup-multi-account.sh</code></td><td>Aggregator + cross-account IAM role automation</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>Scope of Changes</div><div class="admonitionContent_BuS1"><p>Added <code>account_id</code> column to all <strong>25 SQL queries</strong> and applied <code>useAccountContext()</code> to all <strong>35 pages</strong>. DataTable auto-adds an Account column when <code>isMultiAccount &amp;&amp; data[0].account_id</code> is detected.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configjson-structure">config.json Structure<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#configjson-structure" class="hash-link" aria-label="Direct link to config.json Structure" title="Direct link to config.json Structure" 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="security-fixes-25-items">Security Fixes (25 Items)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#security-fixes-25-items" class="hash-link" aria-label="Direct link to Security Fixes (25 Items)" title="Direct link to Security Fixes (25 Items)" translate="no">​</a></h2>
<p>25 security issues were fixed, classified into 3 severity levels.</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 Fixes</div><div class="admonitionContent_BuS1"><p>Cross-account AssumeRole now requires <strong>audit logging</strong> and <strong>ExternalId</strong> to prevent privilege escalation and Confused Deputy attacks.</p></div></div>
<table><thead><tr><th>Severity</th><th>Count</th><th>Key Items</th></tr></thead><tbody><tr><td><strong>CRITICAL</strong></td><td>2</td><td>AssumeRole audit logging, ExternalId enforcement</td></tr><tr><td><strong>HIGH</strong></td><td>5</td><td>Rate Limiting (5 req/min), input validation hardening, <code>execFileSync</code> security</td></tr><tr><td><strong>MEDIUM</strong></td><td>18</td><td>Pool exhaustion prevention, connection destruction, error message filtering</td></tr></tbody></table>
<p><strong>CRITICAL Details</strong>:</p>
<table><thead><tr><th>Issue</th><th>Risk</th><th>Fix</th></tr></thead><tbody><tr><td>No AssumeRole audit</td><td>Cross-account access untraceable</td><td>All AssumeRole calls logged in <code>cross_account.py</code></td></tr><tr><td>No ExternalId</td><td>Confused Deputy attack possible</td><td>ExternalId added as required parameter for AssumeRole</td></tr></tbody></table>
<p><strong>HIGH Details</strong>:</p>
<table><thead><tr><th>Issue</th><th>Risk</th><th>Fix</th></tr></thead><tbody><tr><td>No Rate Limiting</td><td>API abuse, cost explosion</td><td>5 req/min limit applied to AI route</td></tr><tr><td>Insufficient input validation</td><td>SQL Injection possible</td><td>Query parameter whitelist validation</td></tr><tr><td><code>execFileSync</code> usage</td><td>Command Injection</td><td>Converted to argument array approach</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-time-bedrock-streaming">Real-time Bedrock Streaming<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#real-time-bedrock-streaming" class="hash-link" aria-label="Direct link to Real-time Bedrock Streaming" title="Direct link to Real-time Bedrock Streaming" translate="no">​</a></h2>
<p>Bedrock responses are transmitted in real time, chunk by chunk.</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>Item</th><th>Before (v1.6.0)</th><th>After (v1.7.0)</th></tr></thead><tbody><tr><td>Bedrock Response</td><td>Full text at once</td><td><strong>Chunk-based real-time</strong></td></tr><tr><td>API</td><td><code>InvokeModelCommand</code></td><td><code>InvokeModelWithResponseStreamCommand</code></td></tr><tr><td>Delivery Method</td><td><code>done</code> event after completion</td><td>Continuous <code>chunk</code> event delivery</td></tr><tr><td>Client</td><td>Full text rendering</td><td>Real-time rendering with <code>streamingContent</code> state</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>Streaming Helper</div><div class="admonitionContent_BuS1"><p>The <code>streamBedrockToSSE()</code> function (<code>src/app/api/ai/route.ts</code>) reads chunks from the Bedrock stream and converts them to SSE <code>chunk</code> events.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cache-pre-warming">Cache Pre-warming<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#cache-pre-warming" class="hash-link" aria-label="Direct link to Cache Pre-warming" title="Direct link to Cache Pre-warming" translate="no">​</a></h2>
<p>Background cache pre-warming introduced to improve dashboard loading speed.</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>Item</th><th>Description</th></tr></thead><tbody><tr><td>Queries</td><td>Dashboard 23 + Monitoring 10 = <strong>33</strong></td></tr><tr><td>Refresh Cycle</td><td><strong>4 minutes</strong> (before 5-min cache TTL expiration)</td></tr><tr><td>Initialization</td><td><code>ensureCacheWarmerStarted()</code> — lazy-init pattern</td></tr><tr><td>Effect</td><td>Cache hit on first page load for <strong>instant response</strong></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="customer-logo-customization">Customer Logo Customization<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#customer-logo-customization" class="hash-link" aria-label="Direct link to Customer Logo Customization" title="Direct link to Customer Logo Customization" translate="no">​</a></h2>
<p>Set a customer logo in <code>data/config.json</code> and it reflects within 1 minute without server restart.</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="">Place logo files in the <code>public/logos/</code> directory</li>
<li class="">Brand switching via config change only — no code changes required</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-comparison">Version Comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/24/v1.7.0#version-comparison" class="hash-link" aria-label="Direct link to Version Comparison" title="Direct link to Version Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.6.0</th><th>v1.7.0</th><th>Change</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>+multi-account</td></tr><tr><td>Deploy Scripts</td><td>10</td><td><strong>11</strong></td><td>+Step 11</td></tr><tr><td>SQL Queries</td><td>25</td><td>25</td><td>+account_id column added</td></tr><tr><td>Security Fixes</td><td>-</td><td><strong>25 items</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 — Internationalization (i18n) + Bedrock Monitoring]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0"/>
        <updated>2026-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Korean/English multilingual support, Bedrock model usage dashboard, AI token cost display, and Docusaurus user guide site.]]></summary>
        <content type="html"><![CDATA[<p>This release adds <strong>multilingual (Korean/English) support</strong> and a <strong>Bedrock monitoring dashboard</strong>, along with a Docusaurus-based user guide site.</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>Key Additions</div><div class="admonitionContent_BuS1"><p><strong>Korean/English Multilingual</strong> · <strong>500+ Translation Keys</strong> · <strong>Bedrock Monitoring Dashboard</strong> · <strong>AI Token Cost Display</strong> · <strong>Docusaurus Guide Site</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="internationalization-i18n">Internationalization (i18n)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0#internationalization-i18n" class="hash-link" aria-label="Direct link to Internationalization (i18n)" title="Direct link to Internationalization (i18n)" translate="no">​</a></h2>
<p>Language switching is based on React Context + localStorage without URL routing. This design avoids conflicts with 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>Item</th><th>Before (v1.5)</th><th>After (v1.6.0)</th></tr></thead><tbody><tr><td>Language</td><td>Korean only</td><td>Korean + English</td></tr><tr><td>Translation Keys</td><td>0</td><td><strong>500+</strong> (per language)</td></tr><tr><td>Language Toggle</td><td>None</td><td>Sidebar EN/KO toggle button</td></tr><tr><td>AI Response Language</td><td>Korean only</td><td>Auto-switches based on setting</td></tr><tr><td>URL Change</td><td>-</td><td>None (avoids basePath conflicts)</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>Why not URL-based i18n?</div><div class="admonitionContent_BuS1"><p>Next.js has <code>basePath: '/awsops'</code> configured, which conflicts with Next.js built-in i18n locale prefixes (<code>/ko/awsops</code>, <code>/en/awsops</code>). The React Context + localStorage approach doesn't change URLs, bypassing this issue.</p></div></div>
<p><strong>Translation Coverage</strong>:</p>
<ul>
<li class="">All 35 page texts</li>
<li class="">Header, Sidebar menu labels</li>
<li class="">AI status messages (Analyzing, Connecting to Gateway, Complete, etc.)</li>
<li class="">DataTable column headers</li>
<li class="">StatsCard labels</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bedrock-monitoring-bedrock">Bedrock Monitoring (<code>/bedrock</code>)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0#bedrock-monitoring-bedrock" class="hash-link" aria-label="Direct link to bedrock-monitoring-bedrock" title="Direct link to bedrock-monitoring-bedrock" translate="no">​</a></h2>
<p>Monitors per-model Bedrock usage through CloudWatch metrics and AWSops app token tracking.</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>Feature</th><th>Description</th></tr></thead><tbody><tr><td><strong>Per-model Usage</strong></td><td>Calls/tokens per model (Claude Sonnet, Opus, etc.)</td></tr><tr><td><strong>Account vs AWSops</strong></td><td>AWSops app ratio vs total Bedrock usage across the AWS account</td></tr><tr><td><strong>AI Token Cost</strong></td><td>Input/output token count + USD cost displayed in chat responses</td></tr><tr><td><strong>Prompt Caching</strong></td><td>Cache hit rate display, cost savings verification</td></tr><tr><td><strong>Default Range</strong></td><td>7 days (configurable)</td></tr><tr><td><strong>API Route</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 Cost Display</div><div class="admonitionContent_BuS1"><p>Cost is displayed below chat responses in the format <code>Input: 2,450 tokens · Output: 1,200 tokens · $0.0234</code>.
This lets users see the cost of each question in real time, raising cost awareness.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docusaurus-user-guide">Docusaurus User Guide<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0#docusaurus-user-guide" class="hash-link" aria-label="Direct link to Docusaurus User Guide" title="Direct link to Docusaurus User Guide" translate="no">​</a></h2>
<p>Built a Docusaurus-based user guide site in the <code>web/</code> directory.</p>
<table><thead><tr><th>Item</th><th>Description</th></tr></thead><tbody><tr><td>Directory</td><td><code>web/</code></td></tr><tr><td>Languages</td><td>Korean (default) + English</td></tr><tr><td>Screenshots</td><td>Playwright auto-generated (Multi-DPR)</td></tr><tr><td>Deployment</td><td>GitHub Pages (<code>gh-pages</code> branch)</td></tr><tr><td>PRs</td><td>#4 (Multi-DPR screenshots), #5 (Docusaurus guide site)</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="version-comparison">Version Comparison<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/21/v1.6.0#version-comparison" class="hash-link" aria-label="Direct link to Version Comparison" title="Direct link to Version Comparison" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>v1.5</th><th>v1.6.0</th></tr></thead><tbody><tr><td>Pages</td><td>32</td><td><strong>35</strong></td></tr><tr><td>Routes</td><td>47</td><td><strong>50</strong></td></tr><tr><td>Translation Keys</td><td>0</td><td><strong>500+</strong></td></tr><tr><td>Language Support</td><td>Korean</td><td><strong>Korean/English</strong></td></tr><tr><td>Bedrock Monitoring</td><td>None</td><td><strong>Per-model Dashboard</strong></td></tr><tr><td>Documentation Site</td><td>None</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 + New Pages + Container Cost]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AgentCore Memory (365-day conversation history), EBS/MSK/OpenSearch pages, ECS/EKS container cost analysis, OpenCost integration.]]></summary>
        <content type="html"><![CDATA[<p><strong>AgentCore Memory Store</strong> introduced for 365-day per-user conversation history retention. New EBS, MSK, OpenSearch pages and ECS/EKS container cost analysis added.</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>Key Additions</div><div class="admonitionContent_BuS1"><p><strong>Memory Store (365 days)</strong> · <strong>4 New Pages</strong> · <strong>ECS/EKS Container Cost</strong> · <strong>OpenCost Integration</strong> · <strong>3 Hardcoded Values Removed</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-memory-store">AgentCore Memory Store<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5#agentcore-memory-store" class="hash-link" aria-label="Direct link to AgentCore Memory Store" title="Direct link to AgentCore Memory Store" translate="no">​</a></h2>
<p>Introduced a Memory Store that retains per-user conversation history for 365 days. Storage/search logic is managed in <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>Item</th><th>Description</th></tr></thead><tbody><tr><td>Retention Period</td><td>365 days (<code>eventExpiryDuration</code>)</td></tr><tr><td>User Isolation</td><td>Email extracted from Cognito JWT (<code>src/lib/auth-utils.ts</code>)</td></tr><tr><td>Stored Data</td><td>Question, summary, route, tools used, response time</td></tr><tr><td>Setup Script</td><td><code>06e-setup-agentcore-memory.sh</code></td></tr><tr><td>Config File</td><td><code>memoryId</code>, <code>memoryName</code> in <code>data/config.json</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 Naming Rules</div><div class="admonitionContent_BuS1"><p>Memory names <strong>cannot use hyphens (-)</strong>. Only underscores (_) are allowed.
Correct: <code>awsops_memory</code> / Incorrect: <code>awsops-memory</code></p></div></div>
<p><strong>AgentCore Page Integration</strong>:</p>
<ul>
<li class="">6 StatsCards: total calls, average response time, per-gateway call ratio, per-model token usage</li>
<li class="">Conversation history search: keyword, date range, per-route filters</li>
</ul>
<p><strong>AI Page Integration</strong>:</p>
<ul>
<li class="">Bottom toggle panel for viewing conversation history</li>
<li class="">Ability to reference previous question/response context</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-pages-4">New Pages (4)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5#new-pages-4" class="hash-link" aria-label="Direct link to New Pages (4)" title="Direct link to New Pages (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>Page</th><th>Path</th><th>Query File</th><th>Key Features</th></tr></thead><tbody><tr><td><strong>EBS</strong></td><td><code>/ebs</code></td><td><code>queries/ebs.ts</code></td><td>Volumes/snapshots, encryption, EC2 attachments, idle volume detection</td></tr><tr><td><strong>MSK</strong></td><td><code>/msk</code></td><td><code>queries/msk.ts</code></td><td>Kafka clusters, broker node metrics (CPU/Memory/Network), KRaft mode</td></tr><tr><td><strong>OpenSearch</strong></td><td><code>/opensearch</code></td><td><code>queries/opensearch.ts</code></td><td>Domains, N2N/At-Rest encryption, VPC configuration, cluster status</td></tr><tr><td><strong>Resource Inventory</strong></td><td><code>/inventory</code></td><td><code>resource-inventory.ts</code></td><td>Quantity trends for 18 resource types (snapshot-based, zero additional queries)</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 Notes</div><div class="admonitionContent_BuS1"><ul>
<li class=""><strong>MSK</strong>: <code>provisioned</code> column is JSONB containing broker count, storage size, etc.</li>
<li class=""><strong>OpenSearch</strong>: Check the <code>enabled</code> field within the <code>encryption_at_rest_options</code> JSONB</li>
<li class="">Always verify column names via <code>information_schema.columns</code> before writing queries</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-cost-analysis">Container Cost Analysis<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5#container-cost-analysis" class="hash-link" aria-label="Direct link to Container Cost Analysis" title="Direct link to Container Cost Analysis" translate="no">​</a></h2>
<p>Added 2 pages and APIs for analyzing ECS and EKS container costs.</p>
<table><thead><tr><th>Item</th><th>ECS (<code>/container-cost</code>)</th><th>EKS (<code>/eks-container-cost</code>)</th></tr></thead><tbody><tr><td><strong>Data Source</strong></td><td>CloudWatch Container Insights</td><td>OpenCost API</td></tr><tr><td><strong>Fallback</strong></td><td>None</td><td>Request-based calculation</td></tr><tr><td><strong>Cost Calculation</strong></td><td>Fargate vCPU/GB pricing applied</td><td>Pod CPU/Memory allocation cost</td></tr><tr><td><strong>API Route</strong></td><td><code>/api/container-cost</code></td><td><code>/api/eks-container-cost</code></td></tr><tr><td><strong>Setup</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-routing-improvements">AI Routing Improvements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5#ai-routing-improvements" class="hash-link" aria-label="Direct link to AI Routing Improvements" title="Direct link to AI Routing Improvements" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>AgentCore Config</td><td>Hardcoded in code</td><td>ARN read from <code>data/config.json</code></td></tr><tr><td>Tool Usage Display</td><td>None</td><td>Keyword matching infers MCP tools → UI badges</td></tr><tr><td>Multi-Route Failure</td><td>Total failure</td><td>Bedrock Direct fallback</td></tr><tr><td>Timeout</td><td>60s</td><td><strong>90s</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>Tool Usage Inference</div><div class="admonitionContent_BuS1"><p>AgentCore returns only final text (no <code>tool_call</code> tags). The <code>extractUsedTools()</code> function matches keywords in the response content to infer which MCP tools were used and displays them as badges in the UI.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-enhancements">Security Enhancements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/16/v1.5#security-enhancements" class="hash-link" aria-label="Direct link to Security Enhancements" title="Direct link to Security Enhancements" translate="no">​</a></h2>
<table><thead><tr><th>Issue</th><th>Fix</th></tr></thead><tbody><tr><td>Sign Out</td><td>HttpOnly cookie server-side API deletion (<code>POST /api/auth</code>)</td></tr><tr><td>Hardcoded #1</td><td>Steampipe password → dynamic lookup</td></tr><tr><td>Hardcoded #2</td><td>Code Interpreter ID → <code>data/config.json</code></td></tr><tr><td>Hardcoded #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 Dashboard + CloudWatch Metrics Integration]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0"/>
        <updated>2026-03-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[New AgentCore dashboard, Sign Out, RDS/ElastiCache/OpenSearch CloudWatch metrics tables, Resource Inventory (PR#1), S3 Bucket Map.]]></summary>
        <content type="html"><![CDATA[<p>This release adds a new <strong>AgentCore Dashboard</strong> page, <strong>CloudWatch metrics tables for 4 services</strong>, and <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>Key Additions</div><div class="admonitionContent_BuS1"><p><strong>AgentCore Dashboard</strong> · <strong>Sign Out</strong> · <strong>4 CloudWatch Metrics APIs</strong> · <strong>Resource Inventory</strong> · <strong>S3 Bucket Map</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-dashboard-agentcore">AgentCore Dashboard (<code>/agentcore</code>)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0#agentcore-dashboard-agentcore" class="hash-link" aria-label="Direct link to agentcore-dashboard-agentcore" title="Direct link to agentcore-dashboard-agentcore" translate="no">​</a></h2>
<p>A dedicated dashboard for monitoring the status of Bedrock AgentCore Runtime and all 8 Gateways at a glance.</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 Status</strong>: Queries status using <code>agentRuntimeArn</code> from <code>data/config.json</code></li>
<li class=""><strong>8 Gateway Cards</strong>: Shows each Gateway's status, tool count, and key features</li>
<li class=""><strong>Full 125 Tool List</strong>: Supports search and per-Gateway filtering</li>
<li class=""><strong>Architecture Diagram</strong>: Visualizes Runtime → Gateway → Lambda relationships</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 Endpoint</div><div class="admonitionContent_BuS1"><p><code>/api/agentcore</code> (<code>src/app/api/agentcore/route.ts</code>) reads ARNs from <code>data/config.json</code> and queries status via AWS API. With no hardcoded account info, it works in any environment by just changing the config.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sign-out">Sign Out<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0#sign-out" class="hash-link" aria-label="Direct link to Sign Out" title="Direct link to Sign Out" translate="no">​</a></h2>
<p>Added a logout button to the Header for safely terminating Cognito sessions.</p>
<table><thead><tr><th>Item</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>Logout</td><td>Not possible (only closing browser)</td><td>Header logout button</td></tr><tr><td>Cookie Deletion</td><td><code>document.cookie</code> (can't access HttpOnly)</td><td><code>POST /api/auth</code> server-side deletion</td></tr><tr><td>Auth State</td><td>Depends on browser cache</td><td>Forces Cognito re-authentication</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 Deletion</div><div class="admonitionContent_BuS1"><p><code>document.cookie</code> cannot delete HttpOnly cookies.
You must use a <strong>server-side API</strong> (<code>src/app/api/auth/route.ts</code>) to return <code>Set-Cookie: token=; Max-Age=0</code>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudwatch-metrics-tables-4-services">CloudWatch Metrics Tables (4 Services)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0#cloudwatch-metrics-tables-4-services" class="hash-link" aria-label="Direct link to CloudWatch Metrics Tables (4 Services)" title="Direct link to CloudWatch Metrics Tables (4 Services)" translate="no">​</a></h2>
<p>Added dedicated API routes and CloudWatch metrics tables for 4 services. All follow the same pattern (<code>cloudwatch get-metric-data</code> → progress bar + numeric values).</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>Service</th><th>API Route</th><th>Metrics</th></tr></thead><tbody><tr><td><strong>MSK</strong></td><td><code>/api/msk</code></td><td>Per-broker CPU, Memory, BytesIn, BytesOut</td></tr><tr><td><strong>RDS</strong></td><td><code>/api/rds</code></td><td>Per-instance CPU, Memory, Connections, IOPS</td></tr><tr><td><strong>ElastiCache</strong></td><td><code>/api/elasticache</code></td><td>Per-node CPU, Memory, Network, Connections + Valkey engine card</td></tr><tr><td><strong>OpenSearch</strong></td><td><code>/api/opensearch</code></td><td>Per-domain 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/en/whatsnew/2026/03/14/v1.4.0#resource-inventory-pr-1" class="hash-link" aria-label="Direct link to Resource Inventory (PR #1)" title="Direct link to Resource Inventory (PR #1)" translate="no">​</a></h2>
<p>Monitor quantity trends for 18 resource types on the <code>/inventory</code> page.</p>
<ul>
<li class=""><strong>Multi-line Chart</strong>: Time series of resource quantity changes</li>
<li class=""><strong>Cost Impact Estimation</strong>: Estimated cost based on resource changes</li>
<li class=""><strong><code>src/lib/resource-inventory.ts</code></strong>: Snapshot-based (<code>data/inventory/</code>), zero additional queries</li>
<li class=""><strong>Cost Explorer Availability</strong>: Automatic MSP Payer detection via <code>checkCostAvailability()</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3--rds--elasticache-enhancements">S3 / RDS / ElastiCache Enhancements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0#s3--rds--elasticache-enhancements" class="hash-link" aria-label="Direct link to S3 / RDS / ElastiCache Enhancements" title="Direct link to S3 / RDS / ElastiCache Enhancements" translate="no">​</a></h2>
<table><thead><tr><th>Service</th><th>Added Features</th></tr></thead><tbody><tr><td><strong>S3</strong></td><td>Bucket Map (TreeMap visualization), search/filter, IAM Roles display</td></tr><tr><td><strong>RDS</strong></td><td>Security Groups tab, CloudWatch mini charts, Features details</td></tr><tr><td><strong>ElastiCache</strong></td><td>Security Groups tab, CloudWatch metrics, Valkey engine support</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-enhancements">Monitoring Enhancements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/14/v1.4.0#monitoring-enhancements" class="hash-link" aria-label="Direct link to Monitoring Enhancements" title="Direct link to Monitoring Enhancements" translate="no">​</a></h2>
<ul>
<li class=""><strong>Instance Detailed Metrics View</strong>: Date Range selection (1h ~ 30d)</li>
<li class=""><strong>Resource Topology</strong>: Graph/Map View toggle (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 — Multi-Route Parallel Calls + Dashboard Redesign]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Major upgrade with 85 commits. Parallel calls to 1-3 Gateways for complex queries. 18-card dashboard, SSE streaming, VPC Resource Map.]]></summary>
        <content type="html"><![CDATA[<p>A complete UX/feature upgrade spanning 85 commits. The core feature is <strong>1-3 Gateway parallel calls</strong> + Bedrock response synthesis for complex queries.</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>Key Numbers</div><div class="admonitionContent_BuS1"><p><strong>85 Commits</strong> · <strong>18 Dashboard Cards</strong> · <strong>Multi-Route (1-3 Gateway Parallel)</strong> · <strong>SSE Real-time Streaming</strong> · <strong>3 New Pages</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-route-ai-architecture">Multi-Route AI Architecture<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#multi-route-ai-architecture" class="hash-link" aria-label="Direct link to Multi-Route AI Architecture" title="Direct link to Multi-Route AI Architecture" translate="no">​</a></h2>
<p>Complex queries are analyzed and up to 3 Gateways are called <strong>simultaneously</strong>, with Bedrock synthesizing the responses.</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>Item</th><th>Before (v1.2.0)</th><th>After (v1.3.0)</th></tr></thead><tbody><tr><td>Query Processing</td><td>Single Gateway call only</td><td>1-3 Gateway parallel calls</td></tr><tr><td>Complex Queries</td><td>First matching route only</td><td>All relevant routes processed in parallel</td></tr><tr><td>Response Synthesis</td><td>None</td><td>Bedrock <code>synthesizeResponses()</code></td></tr><tr><td>Streaming</td><td>None</td><td>SSE <code>chunk</code> event real-time delivery</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>How Multi-Route Works</div><div class="admonitionContent_BuS1"><p>The intent classifier in <code>src/app/api/ai/route.ts</code> analyzes questions and returns a <code>routes: string[]</code> array.
When the array length is 2 or more, <code>Promise.allSettled()</code> makes parallel calls, and successful responses are synthesized via <code>synthesizeResponses()</code>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard-redesign">Dashboard Redesign<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#dashboard-redesign" class="hash-link" aria-label="Direct link to Dashboard Redesign" title="Direct link to Dashboard Redesign" translate="no">​</a></h2>
<p>18 cards arranged in a 6x3 layout, mapped 1:1 with sidebar menu items.</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>Card sub-metrics</strong>: Key figures in <code>18 running · 4 stopped</code> format</li>
<li class=""><strong>CIS Compliance Pass Rate</strong>: Overall benchmark pass rate gauge</li>
<li class=""><strong>Monthly Cost</strong>: Current month cost + MoM change rate</li>
<li class=""><strong>Resource Distribution + K8s Pod Status</strong>: Visualized with Recharts charts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sse-streaming-ai-responses">SSE Streaming AI Responses<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#sse-streaming-ai-responses" class="hash-link" aria-label="Direct link to SSE Streaming AI Responses" title="Direct link to SSE Streaming AI Responses" translate="no">​</a></h2>
<p>Improved UX by streaming AI responses in real time.</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> event</strong>: Displays stages — Analyzing → Gateway connection → Tool calls</li>
<li class=""><strong><code>chunk</code> event</strong>: Real-time response text delivery</li>
<li class=""><strong><code>done</code> event</strong>: Final result + tools used + response time + token count</li>
<li class="">Added response time display, clipboard copy, and related question suggestions</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-pages-3">New Pages (3)<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#new-pages-3" class="hash-link" aria-label="Direct link to New Pages (3)" title="Direct link to New Pages (3)" translate="no">​</a></h2>
<table><thead><tr><th>Page</th><th>Path</th><th>Key Features</th></tr></thead><tbody><tr><td>CloudFront</td><td><code>/cloudfront-cdn</code></td><td>Distribution list, Origins, Behaviors, cache policies</td></tr><tr><td>WAF</td><td><code>/waf</code></td><td>WebACL rules, IP Sets, block logs</td></tr><tr><td>ECR</td><td><code>/ecr</code></td><td>Repositories, image tags, vulnerability scan results</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vpc--network-enhancements">VPC &amp; Network Enhancements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#vpc--network-enhancements" class="hash-link" aria-label="Direct link to VPC &amp; Network Enhancements" title="Direct link to VPC &amp; Network Enhancements" translate="no">​</a></h2>
<ul>
<li class=""><strong>VPC Resource Map</strong>: AWS Console-style 4-column layout<!-- -->
<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 Tab</strong>: Subnet associations, routing rules table</li>
<li class=""><strong>TGW Route Tables</strong>: Transit Gateway route table details</li>
<li class=""><strong>Resource Topology</strong>: React Flow-based Graph View / Map View toggle</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="eks--cost-enhancements">EKS &amp; Cost Enhancements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/12/v1.3.0#eks--cost-enhancements" class="hash-link" aria-label="Direct link to EKS &amp; Cost Enhancements" title="Direct link to EKS &amp; Cost Enhancements" translate="no">​</a></h2>
<p><strong>EKS Improvements</strong>:</p>
<ul>
<li class="">K8s Overview node cards: CPU/Memory progress bars</li>
<li class="">Node details: ENI card + per-ENI traffic + Pods table</li>
<li class="">EKS Explorer: Status/Node filters, pagination</li>
</ul>
<p><strong>Cost Explorer Improvements</strong>:</p>
<ul>
<li class="">Period/Service filters, Projected end-of-month cost, MoM Change</li>
<li class="">Monthly Trend line, Cost by Service pie chart</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 Query Note</div><div class="admonitionContent_BuS1"><p>Cost Explorer data is only available from <strong>MSP (Managed Service Provider) Payer accounts</strong>.
<code>checkCostAvailability()</code> verifies availability first, and falls back to <code>cost-snapshot.ts</code> data if unavailable.</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 Split + Deployment Stability + Performance Optimization]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Split Infra Gateway into Network (17) + Container (24). 93% accuracy across 104 test questions. 20% latency reduction with Bedrock region optimization.]]></summary>
        <content type="html"><![CDATA[<p>Expanded from 7 to <strong>8 Gateways</strong> with major deployment stability improvements. Container responses are <strong>54% faster</strong> (50s → 23s), achieving <strong>104/104 test pass rate</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>Key Achievements</div><div class="admonitionContent_BuS1"><p><strong>8 Gateways</strong> · <strong>10 Routes</strong> · <strong>104/104 Tests Passed</strong> · <strong>93% Classification Accuracy</strong> · <strong>Container 54% Speed Improvement</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-split-infra--network--container">Gateway Split: Infra → Network + Container<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0#gateway-split-infra--network--container" class="hash-link" aria-label="Direct link to Gateway Split: Infra → Network + Container" title="Direct link to Gateway Split: Infra → Network + Container" translate="no">​</a></h2>
<p>The v1.1.0 Infra Gateway (41 tools) contained too many tools, so it was split into Network and Container domains.</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>Item</th><th>Before (Single Infra)</th><th>After (Split)</th></tr></thead><tbody><tr><td>Gateway</td><td>1 (Infra, 41 tools)</td><td>2 (Network 17 + Container 24)</td></tr><tr><td>Container Response Time</td><td>~50s</td><td>~23s (<strong>54% improvement</strong>)</td></tr><tr><td>Tool Selection Accuracy</td><td>LLM selects from 41</td><td>Selects from 24</td></tr><tr><td>Route Structure</td><td>7 Gateways, 9 Routes</td><td><strong>8 Gateways, 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>Why is splitting effective?</div><div class="admonitionContent_BuS1"><p>Having the LLM select from 17 (Network) or 24 (Container) tools is <strong>faster and more accurate</strong> than selecting from all 41. Notably, errors where network tools were incorrectly selected for container questions have been eliminated.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment-stability-improvements">Deployment Stability Improvements<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0#deployment-stability-improvements" class="hash-link" aria-label="Direct link to Deployment Stability Improvements" title="Direct link to Deployment Stability Improvements" translate="no">​</a></h2>
<p>Added error handling and automatic detection logic to deployment scripts.</p>
<table><thead><tr><th>Script</th><th>Improvement</th></tr></thead><tbody><tr><td><code>06a-setup-agentcore-runtime.sh</code></td><td><code>run_or_fail</code> helper + AWS credential preflight check</td></tr><tr><td><code>06b-setup-agentcore-gateway.sh</code></td><td>Bulk creation of 8 Gateways (reflecting Network/Container split)</td></tr><tr><td><code>07-setup-cloudfront-auth.sh</code></td><td>CloudFront auto-detection — CDK stack priority, ALB origin fallback</td></tr><tr><td>Steampipe connection</td><td>Password hardcoding → dynamic lookup via <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="test-results-104104-passed">Test Results: 104/104 Passed<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0#test-results-104104-passed" class="hash-link" aria-label="Direct link to Test Results: 104/104 Passed" title="Direct link to Test Results: 104/104 Passed" 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>Perfect Test Results</div><div class="admonitionContent_BuS1"><p>Out of 104 questions, <strong>all 104 passed</strong>, with route classification at <strong>93% accuracy</strong> and content verification at <strong>99% accuracy</strong>.</p></div></div>
<table><thead><tr><th>Item</th><th>Result</th></tr></thead><tbody><tr><td>Questions Passed</td><td><strong>104/104</strong> (100%)</td></tr><tr><td>Route Classification Accuracy</td><td><strong>93%</strong> (97/104)</td></tr><tr><td>Content Verification Accuracy</td><td><strong>99%</strong> (103/104)</td></tr><tr><td>Average Response Time</td><td><strong>27s</strong></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-bug-fixes">Key Bug Fixes<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/11/v1.2.0#key-bug-fixes" class="hash-link" aria-label="Direct link to Key Bug Fixes" title="Direct link to Key Bug Fixes" translate="no">​</a></h2>
<table><thead><tr><th>Issue</th><th>Cause</th><th>Fix</th></tr></thead><tbody><tr><td>EKS access entry failure</td><td>Used <code>arn:aws:sts::</code> format</td><td>Converted to <code>arn:aws:iam::</code> format</td></tr><tr><td>Cognito custom domain error</td><td>Missing <code>SupportedIdentityProviders</code></td><td>Added parameter</td></tr><tr><td>AgentCore permission error</td><td>Insufficient permissions</td><td>Added <code>bedrock-agentcore:*</code> permissions</td></tr><tr><td>K8s PVC query failure</td><td>JSONB serialization error</td><td>Applied <code>::text</code> casting in <code>k8s.ts</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 Note</div><div class="admonitionContent_BuS1"><p>Returning JSONB columns (<code>spec</code>, <code>status</code>) directly from Kubernetes tables causes serialization errors.
Use <code>SELECT spec::text</code> or <code>spec-&gt;&gt;'key'</code> for conversion.</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 Tools Architecture]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Complete redesign from single Gateway to 7 role-based Gateways. 19 Lambda functions, 125 MCP tools, Sonnet intent classification.]]></summary>
        <content type="html"><![CDATA[<p>A milestone release featuring a complete redesign from a single Gateway (29 tools) to <strong>7 specialized Gateways x 125 MCP tools</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>Key Changes</div><div class="admonitionContent_BuS1"><p><strong>1 Gateway → 7 Gateways</strong> · <strong>29 tools → 125 tools</strong> · <strong>19 Lambda functions</strong> · <strong>Sonnet intent classifier introduced</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="before--after-gateway-architecture">Before / After: Gateway Architecture<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0#before--after-gateway-architecture" class="hash-link" aria-label="Direct link to Before / After: Gateway Architecture" title="Direct link to Before / After: Gateway Architecture" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>Before (v1.0)</th><th>After (v1.1.0)</th></tr></thead><tbody><tr><td>Gateway Count</td><td>1 (Ops)</td><td>7 (role-based)</td></tr><tr><td>MCP Tools</td><td>29</td><td>125</td></tr><tr><td>Lambda Functions</td><td>5</td><td>19</td></tr><tr><td>Routing</td><td>Single path</td><td>9-level priority</td></tr><tr><td>Intent Classification</td><td>Keyword matching</td><td>Sonnet natural language classification</td></tr><tr><td>Container Response Time</td><td>~50s</td><td>~23s</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-role-based-gateways">7 Role-Based Gateways<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0#7-role-based-gateways" class="hash-link" aria-label="Direct link to 7 Role-Based Gateways" title="Direct link to 7 Role-Based Gateways" translate="no">​</a></h2>
<p>Each Gateway provides a tool set optimized for a specific domain. Gateway URLs are managed in the <code>GATEWAYS</code> dictionary in <code>agent.py</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>Tools</th><th>Key Features</th><th>Lambda Functions</th></tr></thead><tbody><tr><td><strong>Network</strong></td><td>17</td><td>VPC Flow Logs, SG Rules, 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 troubleshooting</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 policy simulation, permission analysis</td><td><code>iam_analyzer</code></td></tr><tr><td><strong>Monitoring</strong></td><td>16</td><td>CloudWatch metrics/alarms, CloudTrail events</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-functions">19 Lambda Functions<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0#19-lambda-functions" class="hash-link" aria-label="Direct link to 19 Lambda Functions" title="Direct link to 19 Lambda Functions" translate="no">​</a></h2>
<p>Managed in the <code>agent/lambda/</code> directory, with <code>create_targets.py</code> for bulk Gateway Target creation.</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 Creation</div><div class="admonitionContent_BuS1"><p>Uses <strong>Python/boto3</strong> instead of CLI (<code>mcp.lambda</code> + <code>credentialProviderConfigurations</code>).
The programmatic approach is required due to CLI <code>inlinePayload</code> issues.</p></div></div>
<table><thead><tr><th>#</th><th>Lambda</th><th>Domain</th><th>Key Features</th></tr></thead><tbody><tr><td>1</td><td><code>network_analyzer</code></td><td>Network</td><td>VPC Flow Logs analysis, SG rule validation</td></tr><tr><td>2</td><td><code>reachability_analyzer</code></td><td>Network</td><td>VPC Reachability Analyzer path analysis</td></tr><tr><td>3</td><td><code>tgw_analyzer</code></td><td>Network</td><td>Transit Gateway routing</td></tr><tr><td>4</td><td><code>vpn_analyzer</code></td><td>Network</td><td>Site-to-Site VPN status/tunnels</td></tr><tr><td>5</td><td><code>firewall_analyzer</code></td><td>Network</td><td>Network Firewall rules</td></tr><tr><td>6</td><td><code>eks_analyzer</code></td><td>Container</td><td>EKS clusters, node groups, add-ons</td></tr><tr><td>7</td><td><code>ecs_analyzer</code></td><td>Container</td><td>ECS services, tasks, insights</td></tr><tr><td>8</td><td><code>istio_analyzer</code></td><td>Container</td><td>Istio service mesh configuration</td></tr><tr><td>9</td><td><code>dynamodb_analyzer</code></td><td>Data</td><td>Table capacity, GSI/LSI</td></tr><tr><td>10</td><td><code>rds_analyzer</code></td><td>Data</td><td>Instance performance, parameter groups</td></tr><tr><td>11</td><td><code>elasticache_analyzer</code></td><td>Data</td><td>Cluster status, Valkey support</td></tr><tr><td>12</td><td><code>msk_analyzer</code></td><td>Data</td><td>Broker status, topic analysis</td></tr><tr><td>13</td><td><code>iam_analyzer</code></td><td>Security</td><td>Policy simulation, permission analysis</td></tr><tr><td>14</td><td><code>cloudwatch_analyzer</code></td><td>Monitoring</td><td>Metrics/alarm analysis</td></tr><tr><td>15</td><td><code>cloudtrail_analyzer</code></td><td>Monitoring</td><td>Event search</td></tr><tr><td>16</td><td><code>cost_analyzer</code></td><td>Cost</td><td>Cost Explorer cost/forecasting</td></tr><tr><td>17</td><td><code>budget_analyzer</code></td><td>Cost</td><td>Budgets monitoring</td></tr><tr><td>18</td><td><code>cfn_analyzer</code></td><td>IaC</td><td>CloudFormation stack/drift</td></tr><tr><td>19</td><td><code>steampipe_query</code></td><td>Ops</td><td>Steampipe SQL query execution</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-routing-system">Dynamic Routing System<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0#dynamic-routing-system" class="hash-link" aria-label="Direct link to Dynamic Routing System" title="Direct link to Dynamic Routing System" translate="no">​</a></h2>
<p>9-level priority keyword-based routing in <code>src/app/api/ai/route.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>
<ul>
<li class=""><strong><code>agent.py</code></strong>: Gateway selection via <code>payload.gateway</code> parameter</li>
<li class=""><strong><code>route.ts</code></strong>: 9-level priority keyword-based routing</li>
<li class=""><strong>Sonnet intent classifier</strong> introduced (<code>c56f557</code>) — Selects optimal Gateway via natural language analysis when no keyword match</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-test-results">AI Test Results<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/10/v1.1.0#ai-test-results" class="hash-link" aria-label="Direct link to AI Test Results" title="Direct link to AI Test Results" translate="no">​</a></h2>
<p>104-question test conducted to verify the effectiveness of Gateway separation.</p>
<table><thead><tr><th>Item</th><th>Result</th></tr></thead><tbody><tr><td>Test Questions</td><td>104</td></tr><tr><td>Routing Accuracy</td><td>93% (97/104)</td></tr><tr><td>Container Response Speed Improvement</td><td><strong>54%</strong> (50s → 23s)</td></tr><tr><td>Gateway Separation Effect</td><td>Improved response quality through domain-specific tools</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>Performance Improvement</div><div class="admonitionContent_BuS1"><p>Separating Gateways reduces the number of tools the agent references, improving both <strong>tool selection accuracy</strong> and <strong>response speed</strong>.
With a single Gateway (125 tools), the LLM takes time to find the right tool, but with the Container Gateway (24 tools), it selects the relevant tool immediately.</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 Dashboard Initial Release]]></title>
        <id>https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0</id>
        <link href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0"/>
        <updated>2026-03-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[First release of AWS operations dashboard built with Next.js 14 + Steampipe + Bedrock AgentCore. CDK infrastructure, Cognito authentication, 7 Gateways with 125 MCP tools.]]></summary>
        <content type="html"><![CDATA[<p>The first release of the AWSops Dashboard. An <strong>integrated AWS/Kubernetes operations dashboard</strong> built with Next.js 14 + Steampipe + Amazon Bedrock AgentCore is here.</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>Key Numbers</div><div class="admonitionContent_BuS1"><p><strong>21 Pages</strong> · <strong>5 API Routes</strong> · <strong>380+ AWS Tables</strong> · <strong>60+ K8s Tables</strong> · <strong>125 MCP Tools</strong></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-overview">Architecture Overview<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#architecture-overview" class="hash-link" aria-label="Direct link to Architecture Overview" title="Direct link to Architecture Overview" translate="no">​</a></h2>
<p>User requests arrive at CloudFront, pass through the ALB, and reach the Next.js app running on EC2, which queries AWS APIs in real time via Steampipe using SQL.</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-infrastructure-migration">CDK Infrastructure Migration<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#cdk-infrastructure-migration" class="hash-link" aria-label="Direct link to CDK Infrastructure Migration" title="Direct link to CDK Infrastructure Migration" translate="no">​</a></h2>
<p>Transitioned from CloudFormation YAML templates to AWS CDK TypeScript for infrastructure-as-code management.</p>
<table><thead><tr><th>Item</th><th>Before (CloudFormation)</th><th>After (CDK)</th></tr></thead><tbody><tr><td>Language</td><td>YAML 2000+ lines</td><td>TypeScript type-safe</td></tr><tr><td>Deployment</td><td><code>aws cloudformation deploy</code></td><td><code>cdk deploy</code></td></tr><tr><td>VPC</td><td>Manual subnet CIDR calculation</td><td><code>ec2.Vpc()</code> automatic</td></tr><tr><td>ALB</td><td>Manual listener/target setup</td><td><code>elbv2.ApplicationLoadBalancer()</code></td></tr><tr><td>Reuse</td><td>Copy-paste</td><td>Stack inheritance + 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>Key Files</div><div class="admonitionContent_BuS1"><ul>
<li class=""><code>infra-cdk/lib/awsops-stack.ts</code> — VPC, EC2 (t4g.2xlarge ARM64), ALB, CloudFront configuration</li>
<li class=""><code>00-deploy-infra.sh</code> — CDK bootstrap (<code>ap-northeast-2</code> + <code>us-east-1</code>) and deployment script</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cognito-authentication">Cognito Authentication<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#cognito-authentication" class="hash-link" aria-label="Direct link to Cognito Authentication" title="Direct link to Cognito Authentication" translate="no">​</a></h2>
<p>Built a user authentication system using 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) — JWT verification at CloudFront viewer-request</li>
<li class=""><strong>OAuth2 Authorization Code</strong> flow for secure authentication</li>
<li class=""><code>07-setup-cloudfront-auth.sh</code> script for automatic setup</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentcore-runtime--gateway">AgentCore Runtime + Gateway<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#agentcore-runtime--gateway" class="hash-link" aria-label="Direct link to AgentCore Runtime + Gateway" title="Direct link to AgentCore Runtime + Gateway" translate="no">​</a></h2>
<p>AI agent system leveraging Amazon Bedrock AgentCore.</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>Component</th><th>Description</th></tr></thead><tbody><tr><td>Strands Agent</td><td>arm64 Docker image, managed in ECR</td></tr><tr><td>MCP Protocol</td><td>Standard communication between Gateway and Lambda</td></tr><tr><td>Code Interpreter</td><td><code>awsops_code_interpreter</code> (Python sandbox)</td></tr><tr><td>Deployment Scripts</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 Build Note</div><div class="admonitionContent_BuS1"><p>EC2 only <strong>builds</strong> the Docker image. Execution runs as a container on AgentCore managed service.
arm64 required: <code>docker buildx --platform linux/arm64 --load</code></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-dashboard">Initial Dashboard<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#initial-dashboard" class="hash-link" aria-label="Direct link to Initial Dashboard" title="Direct link to Initial Dashboard" translate="no">​</a></h2>
<table><thead><tr><th>Item</th><th>Count</th></tr></thead><tbody><tr><td>Pages</td><td>21</td></tr><tr><td>API Routes</td><td>5</td></tr><tr><td>Steampipe AWS Tables</td><td>380+</td></tr><tr><td>Steampipe K8s Tables</td><td>60+</td></tr><tr><td>CIS Benchmarks</td><td>v1.5 ~ v4.0</td></tr></tbody></table>
<ul>
<li class=""><strong>Recharts</strong> metrics visualization — CPU, Memory, Network trends</li>
<li class=""><strong>React Flow</strong> network topology — VPC, Subnet, Route Table relationships</li>
<li class=""><strong>CIS Compliance</strong> — v1.5 ~ v4.0 benchmark automated checks (Steampipe <code>aws_compliance</code> tables)</li>
<li class=""><strong>AI Routing</strong> — Code Interpreter → AgentCore → Steampipe+Bedrock → Bedrock Direct</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-code-scaffolding">Claude Code Scaffolding<a href="https://www.atomai.click/awsops/en/whatsnew/2026/03/08/v1.0#claude-code-scaffolding" class="hash-link" aria-label="Direct link to Claude Code Scaffolding" title="Direct link to Claude Code Scaffolding" translate="no">​</a></h2>
<p>Claude Code integration environment configured for improved development productivity.</p>
<ul>
<li class=""><strong>Module CLAUDE.md</strong> — Context documents for each directory (<code>src/lib/CLAUDE.md</code>, <code>src/app/CLAUDE.md</code>, etc.)</li>
<li class=""><strong>Auto-Sync Rules</strong> — Automatic documentation sync rules on code changes</li>
<li class=""><code>.claude/hooks/check-doc-sync.sh</code> — Documentation sync verification hook</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>