<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Debapriya Dey</title>
    <description>The latest articles on DEV Community by Debapriya Dey (@debapriya_dey_aada54b7766).</description>
    <link>https://dev.to/debapriya_dey_aada54b7766</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3629352%2Fc2df7286-c4fc-4673-8f29-762200a23f13.jpg</url>
      <title>DEV Community: Debapriya Dey</title>
      <link>https://dev.to/debapriya_dey_aada54b7766</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/debapriya_dey_aada54b7766"/>
    <language>en</language>
    <item>
      <title>Building an AI Model Evaluation Pipeline on AWS for Audio Content Generation</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Fri, 22 May 2026 10:47:49 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/building-an-ai-model-evaluation-pipeline-on-aws-for-audio-content-generation-682</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/building-an-ai-model-evaluation-pipeline-on-aws-for-audio-content-generation-682</guid>
      <description>&lt;h2&gt;
  
  
  Executive Summary
&lt;/h2&gt;

&lt;p&gt;A European digital media publisher needed to determine which foundation model on Amazon Bedrock produces the highest-quality podcast-style summaries from news articles. Rather than selecting a model based on general benchmarks, they built a serverless evaluation pipeline on AWS that runs structured experiments — comparing multiple models in parallel, scoring outputs with an LLM-as-Judge approach, and delivering actionable insights to both technical and editorial teams.&lt;/p&gt;

&lt;p&gt;This post describes the business drivers, architectural approach, evaluation methodology, and outcomes of the proof of concept (PoC), built entirely on AWS-native services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Business Challenge
&lt;/h2&gt;

&lt;p&gt;The customer is a digital media publisher experiencing declining engagement as user consumption shifts toward flexible, audio-first formats. Their strategic objective is to evolve from traditional text delivery into personalized, AI-driven audio experiences — such as user-specific podcast-style summaries generated from their existing article library.&lt;/p&gt;

&lt;p&gt;This initiative is expected to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase content consumption by meeting users where they are (commutes, workouts, passive listening)&lt;/li&gt;
&lt;li&gt;Unlock new monetization opportunities through premium audio tiers and advertising&lt;/li&gt;
&lt;li&gt;Extend the value of existing editorial content without proportional editorial cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical challenge: &lt;strong&gt;foundation models produce highly variable output quality depending on the model, prompt strategy, and content type&lt;/strong&gt;. Selecting the wrong model risks hallucinated facts (unacceptable for a news publisher), poor audio readability, or unsustainable cost per article.&lt;/p&gt;

&lt;p&gt;The customer needed a data-driven approach to model selection — not a one-off playground test, but a repeatable evaluation framework that could inform decisions across formats, topics, and evolving model capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  PoC Scope and Objectives
&lt;/h2&gt;

&lt;p&gt;The PoC focused on building an &lt;strong&gt;evaluation and experimentation pipeline&lt;/strong&gt; — not the production audio generation system itself. The goal was to enable structured, repeatable testing of multiple foundation models and prompt strategies for summarization and script generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Evaluation &amp;amp; Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test multiple models on Amazon Bedrock in parallel; compare outputs on quality, tone, coherence, and editorial relevance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt &amp;amp; Format Experimentation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Support different summary styles (short-form, multi-speaker podcast, custom editorial prompts) to identify optimal content structures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalable Evaluation Pipeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automated workflows triggered via API, with consistent storage of outputs and metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evaluation Metrics Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLM-as-Judge scoring combined with native Bedrock evaluation metrics, covering accuracy, completeness, faithfulness, and style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Results Visualization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Side-by-side comparison of outputs with cost, latency, and quality insights for technical and editorial stakeholders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS-Native Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fully built on AWS services: Amazon Bedrock, AWS Step Functions, AWS Lambda, Amazon S3, Amazon API Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Solution Architecture
&lt;/h2&gt;

&lt;p&gt;The evaluation pipeline is fully serverless, deployed via Terraform, and designed around the principle of &lt;strong&gt;experiment-as-configuration&lt;/strong&gt; — each evaluation run is defined by a JSON document specifying models, prompts, inputs, and scoring criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bz4nmhd3qhld1lgeajc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bz4nmhd3qhld1lgeajc.png" alt="AWS Architecture" width="790" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Services Used
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Role in Architecture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Bedrock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Foundation model access via unified Converse API; supports Llama, Claude, DeepSeek, Nova, and others&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Step Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orchestrates the multi-step evaluation workflow with built-in error handling and state management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless compute for API handling, model invocation, scoring, and report generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP API entry point with CORS support; JWT authorizer ready for Amazon Cognito integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistent storage for experiment artifacts, outputs, and generated reports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Cognito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User authentication (pre-built, ready to enable for production)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured logging, billing alarms, and operational monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon SNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alert notifications when cost thresholds are breached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How It Works: The Evaluation Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Prompt Generation and Review
&lt;/h3&gt;

&lt;p&gt;The user submits an article and selects a scenario type (interview, monologue, debate, short summary). A &lt;strong&gt;Prompt Agent&lt;/strong&gt; powered by Claude Haiku generates an optimized instruction prompt tailored to the article topic and requested format.&lt;/p&gt;

&lt;p&gt;The user reviews and optionally edits the prompt before execution. This human-in-the-loop step prevents wasted model invocations on suboptimal prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Parallel Model Invocation
&lt;/h3&gt;

&lt;p&gt;AWS Step Functions triggers the evaluation workflow. The Invoker Lambda uses Python's &lt;code&gt;ThreadPoolExecutor&lt;/code&gt; to invoke 2-5 Bedrock models simultaneously via the &lt;strong&gt;Converse API&lt;/strong&gt; — a unified interface that eliminates provider-specific request/response handling.&lt;/p&gt;

&lt;p&gt;Results are written to S3 progressively as each model completes, enabling the frontend to display partial results without waiting for the slowest model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: LLM-as-Judge Scoring
&lt;/h3&gt;

&lt;p&gt;A separate Claude Haiku instance evaluates each model's output against the source text using a strict rubric. Five dimensions are scored on a 0-100 scale:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Evaluation Criteria&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Factual correctness; penalizes hallucinations, distortions, and vague references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fluency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natural language quality; penalizes unfinished sentences, repetition, and awkward phrasing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Completeness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coverage of key points; penalizes missing sections or shallow treatment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neutrality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Objectivity; penalizes editorial opinion or speculation presented as fact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adherence to format, tone, and constraints; violations cap the score&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rubric is deliberately strict: scores of 96-100 are "almost never given," and most solid outputs land in the 61-80 range. This forces meaningful differentiation between models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4: Report Generation and Approval
&lt;/h3&gt;

&lt;p&gt;The pipeline generates a self-contained HTML comparison report with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Side-by-side model outputs&lt;/li&gt;
&lt;li&gt;Color-coded score badges per dimension&lt;/li&gt;
&lt;li&gt;Latency and cost metadata&lt;/li&gt;
&lt;li&gt;Reviewer preference selection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Editorial stakeholders can view reports via presigned S3 URLs without requiring AWS console access. The approval workflow saves the selected output for downstream use.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Architectural Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Amazon Bedrock's Converse API?
&lt;/h3&gt;

&lt;p&gt;The Converse API provides a &lt;strong&gt;unified interface across all foundation models&lt;/strong&gt; on Bedrock. Adding a new model to the evaluation requires only a configuration change — no code modifications for request formatting or response parsing. This is critical for an evaluation platform where the set of models under test changes frequently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Serverless (Lambda + Step Functions)?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost at rest: zero.&lt;/strong&gt; The platform costs nothing when no experiments are running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling.&lt;/strong&gt; Parallel model invocations scale with Lambda concurrency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational simplicity.&lt;/strong&gt; No servers to patch, no clusters to size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in observability.&lt;/strong&gt; Step Functions provides visual execution tracking; Lambda integrates natively with CloudWatch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why LLM-as-Judge Over Traditional Metrics?
&lt;/h3&gt;

&lt;p&gt;Traditional NLP metrics (ROUGE, BLEU) measure surface-level text similarity. They cannot evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether a podcast script sounds natural when read aloud&lt;/li&gt;
&lt;li&gt;Whether the tone matches the editorial brand&lt;/li&gt;
&lt;li&gt;Whether the format constraints were followed (no markdown, no stage directions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An LLM-as-Judge captures these subjective quality dimensions that matter most to editorial teams. The strict rubric ensures scoring consistency across experiments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Build Evaluation Before Production?
&lt;/h3&gt;

&lt;p&gt;The cost of running 100 evaluation experiments ($15-50 in Bedrock usage) is negligible compared to the cost of building a production system on the wrong model and discovering quality issues after launch. The evaluation pipeline de-risks the model selection decision and creates a reusable framework for ongoing optimization.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evaluation Metrics Framework
&lt;/h2&gt;

&lt;p&gt;The platform supports two complementary evaluation approaches:&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM-as-Judge (Primary)
&lt;/h3&gt;

&lt;p&gt;A separate foundation model evaluates outputs against source text and prompt instructions. Scoring features are configurable per experiment — teams can define custom dimensions relevant to their use case.&lt;/p&gt;

&lt;p&gt;The scoring agent receives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original source text&lt;/li&gt;
&lt;li&gt;The instruction prompt given to the content model&lt;/li&gt;
&lt;li&gt;The model's output&lt;/li&gt;
&lt;li&gt;A detailed rubric with scoring guidelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It returns a JSON object with integer scores per dimension, which are validated against the defined scale ranges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon Bedrock Native Evaluation (Secondary)
&lt;/h3&gt;

&lt;p&gt;Where available, the platform also leverages Bedrock's built-in evaluation API for standardized metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy&lt;/strong&gt; — factual alignment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robustness&lt;/strong&gt; — consistency under variation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toxicity&lt;/strong&gt; — harmful content detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These provide a baseline that complements the more nuanced LLM-as-Judge scores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Area: Custom Metrics via API
&lt;/h3&gt;

&lt;p&gt;An area under exploration is the ability to define and register custom evaluation metrics programmatically — for example, an "audio readability" metric that specifically penalizes text patterns that sound unnatural in text-to-speech synthesis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results and Insights
&lt;/h2&gt;

&lt;p&gt;After running structured experiments across multiple articles, models, and prompt strategies:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model quality varies significantly by format.&lt;/strong&gt; A model that excels at short-form summaries may produce awkward multi-speaker scripts. Format-specific evaluation is essential — there is no single "best model" across all use cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt engineering impact often exceeds model selection impact.&lt;/strong&gt; The quality difference between a well-crafted prompt and a generic one frequently exceeds the difference between models. The Prompt Agent + human review loop captures this value early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hallucination rates correlate with topic complexity.&lt;/strong&gt; Simple event reporting is handled well by all tested models. Complex topics with nuance (scientific findings, policy debates) show significantly higher hallucination variance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoring consistency requires explicit rubric design.&lt;/strong&gt; Without strict guidelines, the AI judge assigns uniformly high scores. The calibrated rubric forces differentiation that maps to real editorial quality differences.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost Profile
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS Lambda (API + Invoker)&lt;/td&gt;
&lt;td&gt;~$7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Step Functions&lt;/td&gt;
&lt;td&gt;~$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;td&gt;&amp;lt; $1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon API Gateway&lt;/td&gt;
&lt;td&gt;&amp;lt; $1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon CloudWatch&lt;/td&gt;
&lt;td&gt;~$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; $15/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Bedrock (variable)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.15-0.50 per experiment&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The serverless architecture means infrastructure costs are near-zero when the platform is idle. The primary cost driver is Bedrock model invocations — directly proportional to experiment volume and controllable via API rate limiting and usage quotas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security and Operational Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API authentication:&lt;/strong&gt; Amazon Cognito with JWT authorizer (pre-built, ready to enable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting:&lt;/strong&gt; API Gateway usage plans with per-key quotas to control Bedrock spend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost controls:&lt;/strong&gt; CloudWatch billing alarms at $10 and $25 thresholds with SNS notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error sanitization:&lt;/strong&gt; AWS resource identifiers (ARNs, account IDs) are stripped from user-facing error messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code:&lt;/strong&gt; Full Terraform deployment; reproducible and version-controlled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token usage tracking:&lt;/strong&gt; Bedrock response metadata passed through for downstream billing attribution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Strategic Outlook : : The Start of Something Bigger
&lt;/h2&gt;

&lt;p&gt;This PoC is phase one of a broader initiative:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Evaluation pipeline — model comparison, prompt experimentation, quality scoring&lt;/td&gt;
&lt;td&gt;✅ Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production summarization — selected model(s) deployed for automated generation&lt;/td&gt;
&lt;td&gt;Planned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-format generation — short-form audio/video, text-to-speech integration&lt;/td&gt;
&lt;td&gt;Roadmap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optimization — fine-tuning on editorial feedback, A/B testing, cost-based model routing&lt;/td&gt;
&lt;td&gt;Roadmap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The customer is evaluating AWS as the long-term platform to support end-to-end content generation workflows — from article ingestion through summarization, text-to-speech synthesis, and media distribution.&lt;/p&gt;




&lt;h3&gt;
  
  
  The TikTok-Style Video Opportunity
&lt;/h3&gt;

&lt;p&gt;The customer's next ambition is to automatically generate daily short-form video content — 30-60 second clips summarizing top stories in a format optimized for TikTok, Instagram Reels, and YouTube Shorts. This requires chaining multiple AI capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Summarization&lt;/strong&gt; (Amazon Bedrock) — condense articles into punchy, spoken-word scripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text-to-Speech&lt;/strong&gt; (Amazon Polly or third-party) — generate natural-sounding narration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual generation&lt;/strong&gt; — create or select imagery to accompany the audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assembly&lt;/strong&gt; — combine audio, visuals, and captions into a publishable video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evaluation pipeline built in Phase 1 directly informs this: the model and prompt strategy selected for summarization quality will power the script generation layer of the video pipeline. The same LLM-as-Judge framework can evaluate script quality for the shorter, punchier format that short-form video demands.&lt;/p&gt;

&lt;p&gt;The customer is seeking a continued partnership with AWS to build this end-to-end workflow — from article ingestion through AI summarization, speech synthesis, and automated video publishing. This represents a multi-phase engagement with growing AWS service consumption across Bedrock, Polly, S3, MediaConvert, and potentially SageMaker for fine-tuning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Expected Outcomes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A working evaluation pipeline for large-scale AI experimentation on Amazon Bedrock&lt;/li&gt;
&lt;li&gt;Clear, data-driven comparison of foundation models and prompt strategies&lt;/li&gt;
&lt;li&gt;Identification of the most suitable model(s) for summarization and script generation&lt;/li&gt;
&lt;li&gt;A reusable framework for future optimization and potential fine-tuning&lt;/li&gt;
&lt;li&gt;Reduced decision risk around model selection through structured experimentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Foundation model selection for production use cases requires more than benchmark comparisons. It requires evaluation on your actual content, with your actual quality criteria, at sufficient scale to surface meaningful differences.&lt;/p&gt;

&lt;p&gt;By building the evaluation infrastructure first — using Amazon Bedrock for model access, AWS Step Functions for orchestration, and an LLM-as-Judge approach for quality scoring — this customer established a repeatable, cost-effective framework for making model decisions with confidence.&lt;/p&gt;

&lt;p&gt;The serverless architecture ensures the platform costs nothing at rest, scales automatically during experimentation, and deploys in minutes via Terraform. The evaluation framework will continue to serve as new models become available on Amazon Bedrock and as the customer expands into new content formats.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Continued Investment Matters
&lt;/h3&gt;

&lt;p&gt;Funding this initiative accelerates experimentation on Amazon Bedrock, reduces decision risk around model selection, and establishes a reusable evaluation framework that supports not just the current summarization use case — but the entire roadmap from podcast generation through TikTok-style video automation. The customer's growing ambition maps directly to expanding AWS service adoption.&lt;/p&gt;




&lt;h3&gt;
  
  
  AWS Services Referenced
&lt;/h3&gt;

&lt;p&gt;Amazon Bedrock · AWS Step Functions · AWS Lambda · Amazon API Gateway · Amazon S3 · Amazon Cognito · Amazon CloudWatch · Amazon SNS · Terraform (Infrastructure as Code)&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This solution was built by Storm Reply as part of an AWS-funded proof of concept for AI-driven content generation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Building a Serverless AI Model Evaluation Platform on AWS</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:38 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/building-a-serverless-ai-model-evaluation-platform-on-aws-4d47</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/building-a-serverless-ai-model-evaluation-platform-on-aws-4d47</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A media company needed to evaluate which AI model produces the best podcast-style summaries from news articles. They wanted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send an article to multiple AI models simultaneously&lt;/li&gt;
&lt;li&gt;Compare the outputs side by side&lt;/li&gt;
&lt;li&gt;Score each output automatically&lt;/li&gt;
&lt;li&gt;Generate a visual comparison report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing this manually, copying articles into different model playgrounds, reading outputs, judging quality, doesn't scale. They needed an automated evaluation pipeline that could run experiments on demand and produce consistent, comparable results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;A fully serverless evaluation platform on AWS that accepts an article, runs it through multiple foundation models in parallel, scores each output using a separate AI judge, and produces an HTML comparison report. All triggered by a single API call.&lt;/p&gt;

&lt;p&gt;The system handles the entire lifecycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompt optimization&lt;/strong&gt; — an AI agent refines the user's instructions into an effective prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel model invocation&lt;/strong&gt; — multiple Bedrock models generate summaries simultaneously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated scoring&lt;/strong&gt; — a scoring agent evaluates each output against quality criteria&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report generation&lt;/strong&gt; — produces a formatted HTML comparison page&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7xyueysjhyrnt1b4kpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7xyueysjhyrnt1b4kpf.png" alt="AWS Architecture Overview" width="779" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6-Step Workflow
&lt;/h2&gt;

&lt;p&gt;The core of the system is a Step Functions state machine that orchestrates six Lambda functions in sequence. Here's what each step does and why it exists as a separate step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F748rwuza6dd4kh2iit3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F748rwuza6dd4kh2iit3g.png" alt="6 Step Pipeline" width="768" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Validate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Read and validate the experiment definition from S3.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;definition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BUCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;definitions/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;experiment_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/definition.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Validate required fields: article, models, prompt
&lt;/span&gt;    &lt;span class="c1"&gt;# Fail fast if inputs are malformed
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;validated_definition&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why a separate step? Fail-fast validation before incurring any Bedrock costs. If the definition is malformed, we stop here — no wasted model invocations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Invoke Models (Parallel)
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting. We invoke multiple Bedrock models simultaneously using Python's &lt;code&gt;ThreadPoolExecutor&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;concurrent.futures&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;as_completed&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke_models&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;models&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# e.g., ["meta.llama3-70b", "deepseek-r1", "amazon.nova-lite"]
&lt;/span&gt;    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;article&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;futures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoke_bedrock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;as_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;model_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inputTokens&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;outputTokens&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why ThreadPoolExecutor inside Lambda? Bedrock API calls are I/O-bound. Running them in parallel within a single Lambda invocation means we pay for one Lambda execution instead of three, and the total wall-clock time is roughly equal to the slowest model rather than the sum of all models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Store Outputs
&lt;/h3&gt;

&lt;p&gt;Writes &lt;code&gt;comparison.json&lt;/code&gt; to S3 — containing all model outputs but no scores yet. This creates a checkpoint: if scoring fails, we don't lose the generated content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Score (Parallel)
&lt;/h3&gt;

&lt;p&gt;The scoring agent (Claude Haiku) evaluates each model's output against quality criteria. Again, parallel execution via ThreadPoolExecutor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;scoring_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Rate this podcast summary on:
    - Accuracy (1-10): Does it faithfully represent the article?
    - Engagement (1-10): Would a listener find this compelling?
    - Structure (1-10): Is it well-organized for audio?
    Respond with JSON only.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;futures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoke_bedrock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCORING_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scoring_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;# ... collect scores
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why a separate scoring model? Using a different model (or at minimum, a separate invocation with a scoring-specific prompt) as the judge avoids self-evaluation bias. The scoring agent doesn't know which model produced which output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Store Scores
&lt;/h3&gt;

&lt;p&gt;Updates &lt;code&gt;comparison.json&lt;/code&gt; with the scores attached to each model's output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Generate HTML
&lt;/h3&gt;

&lt;p&gt;Produces a formatted &lt;code&gt;comparison.html&lt;/code&gt; report that displays all outputs side by side with their scores. This is the final deliverable the user downloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Amazon Bedrock's Converse API?
&lt;/h2&gt;

&lt;p&gt;We use the &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html" rel="noopener noreferrer"&gt;Converse API&lt;/a&gt; rather than the model-specific &lt;code&gt;InvokeModel&lt;/code&gt; API. The key advantage: &lt;strong&gt;one unified interface across all models&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke_bedrock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;converse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;}]}],&lt;/span&gt;
        &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switching from Llama to Claude to Nova Lite requires changing only the &lt;code&gt;model_id&lt;/code&gt; string. No code changes, no different request formats, no response parsing differences.&lt;/p&gt;

&lt;p&gt;The Converse API also returns token usage in every response — which we pass through to the caller for billing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"model_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"meta.llama3-70b-instruct-v1:0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1523&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;847&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total_input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4569&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total_output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2541&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cost Control: The Hardest Part
&lt;/h2&gt;

&lt;p&gt;Here's the reality of building on top of foundation models: &lt;strong&gt;every API call costs money&lt;/strong&gt;, and costs scale with input size. A single &lt;code&gt;/run&lt;/code&gt; request invoking 3 models on a long article can cost $0.10–0.50. That sounds small until someone writes a script that calls it in a loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Billing Alarms (Day 1)
&lt;/h3&gt;

&lt;p&gt;We set up CloudWatch billing alarms immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch Alarm ($10 threshold) → SNS → Email notification
CloudWatch Alarm ($25 threshold) → SNS → Email notification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the bare minimum. You'll know when costs are climbing, even if you can't stop them automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Security (Critical for Any AI-Backed API)
&lt;/h3&gt;

&lt;p&gt;An unprotected API that invokes foundation models is essentially a public credit card. We learned this the hard way and now treat API security as P0 — before any external access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Keys&lt;/strong&gt; on every endpoint (immediate protection)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage plans&lt;/strong&gt; with per-key quotas (500 requests/day, 5000/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; (10 req/s throttle) to prevent burst abuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request logging&lt;/strong&gt; to attribute usage to specific callers
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Every request must include the API key&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.example.com/run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: btk_live_abc123def456"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"article": "...", "models": ["meta.llama3-70b"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, anyone who discovers your API URL can generate unbounded Bedrock charges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Separate validation from execution
&lt;/h3&gt;

&lt;p&gt;Bedrock calls are expensive. Validate everything before invoking any model. Check that the article isn't empty, the model IDs are valid, the prompt isn't too long. Fail at Step 1, not Step 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ThreadPoolExecutor &amp;gt; separate Lambda invocations for parallel model calls
&lt;/h3&gt;

&lt;p&gt;We considered using Step Functions' native parallel states or invoking separate Lambdas per model. ThreadPoolExecutor within a single Lambda turned out simpler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Lambda execution to pay for (not N)&lt;/li&gt;
&lt;li&gt;Shared memory for the article text (no repeated S3 reads)&lt;/li&gt;
&lt;li&gt;Simpler error handling&lt;/li&gt;
&lt;li&gt;Total time ≈ slowest model, not sum of all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tradeoff: if one model times out, the entire Lambda times out. We mitigate this with per-future timeouts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Store intermediate results
&lt;/h3&gt;

&lt;p&gt;Each step writes to S3 before the next step begins. If Step 4 (scoring) fails, we still have the model outputs from Step 3. We can retry scoring without re-invoking the content models.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Token usage is free metadata — always capture it
&lt;/h3&gt;

&lt;p&gt;Bedrock returns &lt;code&gt;inputTokens&lt;/code&gt; and &lt;code&gt;outputTokens&lt;/code&gt; in every response. Capturing and returning this costs nothing but enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-customer billing&lt;/li&gt;
&lt;li&gt;Cost forecasting&lt;/li&gt;
&lt;li&gt;Identifying expensive prompts&lt;/li&gt;
&lt;li&gt;Detecting anomalies (sudden spike in token usage = possible abuse)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Start with S3, add a database when you need queries
&lt;/h3&gt;

&lt;p&gt;For the POC, S3 handles all storage. It's simple, cheap, and sufficient for sequential read/write patterns. We're adding DynamoDB only now that we need to query experiment history by user — something S3 can't do efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The platform is functional but evolving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Selection History&lt;/strong&gt; — DynamoDB-backed experiment sessions so users can revisit past comparisons and track which model they ultimately chose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend UI&lt;/strong&gt; — Visual interface for running experiments and browsing history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognito Authentication&lt;/strong&gt; — User-level access control when the UI ships&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;API Gateway (HTTP API)&lt;/td&gt;
&lt;td&gt;Low latency, pay-per-request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;AWS Lambda (Python)&lt;/td&gt;
&lt;td&gt;Serverless, scales to zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;Step Functions&lt;/td&gt;
&lt;td&gt;Visual workflow, built-in retries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Models&lt;/td&gt;
&lt;td&gt;Amazon Bedrock (Converse API)&lt;/td&gt;
&lt;td&gt;Multi-model, unified interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;td&gt;Cheap, durable, simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;td&gt;CloudWatch + SNS&lt;/td&gt;
&lt;td&gt;Billing alarms, email alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth (planned)&lt;/td&gt;
&lt;td&gt;API Keys + Cognito&lt;/td&gt;
&lt;td&gt;Layered security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History (planned)&lt;/td&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;Fast queries by user/session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Reach Out to Us
&lt;/h2&gt;

&lt;p&gt;Interested in modernizing your cloud infrastructure and building enterprise-grade solutions? &lt;strong&gt;Storm Reply&lt;/strong&gt; is driven by continuous learning and practical innovation. We specialize in designing and delivering scalable AWS architectures that support customers throughout their cloud journey, from early assessment to production-ready deployment.&lt;/p&gt;

&lt;p&gt;With deep experience in AWS architecture, data engineering, and security best practices, we help enterprises migrate with confidence and move faster on their cloud transformation goals.&lt;/p&gt;

&lt;p&gt;Let’s connect and explore how we can support your modernization initiatives.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.stormreply.cloud/" rel="noopener noreferrer"&gt;https://www.stormreply.cloud/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💼 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/company/storm-reply/posts/?feedView=all" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/storm-reply/posts/?feedView=all&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Date:&lt;/strong&gt; May 2026&lt;/p&gt;




&lt;p&gt;The full system runs in &lt;code&gt;eu-central-1&lt;/code&gt; (Frankfurt), costs under $20/month excluding Bedrock usage, and handles the entire evaluation lifecycle in a single API call. Serverless means we pay nothing when nobody's running experiments, and scale automatically when they are.&lt;/p&gt;

&lt;p&gt;If you're building something similar — any system where API calls trigger expensive downstream operations — lock down your API first, validate inputs aggressively, and always know what each request costs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with AWS Lambda, Step Functions, and Amazon Bedrock.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>llm</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Building a Production-Ready AWS Security Vulnerability Scanner: A Technical Deep Dive</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Wed, 28 Jan 2026 12:49:29 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/building-a-production-ready-aws-security-vulnerability-scanner-a-technical-deep-dive-1m33</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/building-a-production-ready-aws-security-vulnerability-scanner-a-technical-deep-dive-1m33</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Security Visibility at Scale
&lt;/h2&gt;

&lt;p&gt;In modern cloud environments, security vulnerabilities don't announce themselves. They hide in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outdated packages in Lambda functions&lt;/li&gt;
&lt;li&gt;Unpatched EC2 instances running critical workloads&lt;/li&gt;
&lt;li&gt;Container images with known CVEs in ECR&lt;/li&gt;
&lt;li&gt;Misconfigured security groups exposing services to the internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; Organizations using AWS face a fragmented security landscape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security Hub aggregates findings but lacks actionable remediation&lt;/li&gt;
&lt;li&gt;Inspector scans for CVEs but doesn't prioritize by business impact&lt;/li&gt;
&lt;li&gt;AWS Config checks compliance but doesn't show cost implications&lt;/li&gt;
&lt;li&gt;Trusted Advisor provides recommendations but requires manual correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; Security teams spend hours:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manually correlating findings across multiple AWS services&lt;/li&gt;
&lt;li&gt;Determining which vulnerabilities to fix first&lt;/li&gt;
&lt;li&gt;Finding the exact commands to remediate issues&lt;/li&gt;
&lt;li&gt;Tracking unused resources that increase attack surface&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Our Solution: An Intelligent, Unified Security Dashboard
&lt;/h2&gt;

&lt;p&gt;We built a comprehensive AWS Security Vulnerability Scanner that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregates&lt;/strong&gt; findings from Security Hub, Inspector, AWS Config, and Trusted Advisor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritizes&lt;/strong&gt; vulnerabilities using intelligent scoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provides&lt;/strong&gt; exact remediation commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identifies&lt;/strong&gt; cost optimization opportunities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivers&lt;/strong&gt; an intuitive, scannable interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mk0x8611vuoph5mbcsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mk0x8611vuoph5mbcsh.png" alt="Architecture Diagram" width="768" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Implementation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Multi-Service Data Collection
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Each AWS security service returns data in different formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Unified scanner with normalized output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AWSSecurityScanner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;securityhub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;securityhub&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inspector2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;support&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;findings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;security_hub&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan_security_hub_findings&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inspector&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan_inspector_vulnerabilities&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan_config_compliance&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;trusted_advisor&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan_trusted_advisor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parallel API calls for performance&lt;/li&gt;
&lt;li&gt;Error handling for partial failures&lt;/li&gt;
&lt;li&gt;Pagination for large result sets&lt;/li&gt;
&lt;li&gt;Caching to reduce API costs&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Operational Issue Detection
&lt;/h4&gt;

&lt;p&gt;Beyond CVEs, we detect operational security issues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OperationalScanner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_unused_s3_buckets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find S3 buckets with no activity&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Check last modified date
&lt;/span&gt;        &lt;span class="c1"&gt;# Calculate storage costs
&lt;/span&gt;        &lt;span class="c1"&gt;# Generate deletion recommendations
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_expiring_certificates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find ACM certificates expiring soon&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Check NotAfter date
&lt;/span&gt;        &lt;span class="c1"&gt;# Prioritize by usage (InUseBy)
&lt;/span&gt;        &lt;span class="c1"&gt;# Alert on critical expirations
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_idle_load_balancers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find load balancers with no traffic&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Query CloudWatch metrics
&lt;/span&gt;        &lt;span class="c1"&gt;# Calculate monthly cost waste
&lt;/span&gt;        &lt;span class="c1"&gt;# Recommend deletion
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Found $70/month in cost savings in our sandbox account alone.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Intelligent Prioritization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Not all vulnerabilities are equal. A Critical CVE in a non-production Lambda is less urgent than a High CVE in a public-facing EC2 instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Multi-factor priority scoring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isTopPriority&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Severity&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fixAvailable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Vulnerabilities&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;FixAvailable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ageInDays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CreatedAt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isExposed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;isInternetExposed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
           &lt;span class="nx"&gt;fixAvailable&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YES&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
           &lt;span class="nx"&gt;ageInDays&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
           &lt;span class="nx"&gt;isExposed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Priority Factors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Severity (CVSS score)&lt;/li&gt;
&lt;li&gt;Fix availability&lt;/li&gt;
&lt;li&gt;Age (older = higher priority)&lt;/li&gt;
&lt;li&gt;Internet exposure&lt;/li&gt;
&lt;li&gt;Environment (production &amp;gt; non-production)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. User Experience Innovation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Traditional security dashboards are overwhelming. Users see hundreds of findings with no clear action path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Approach:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8nj710uwy76sfel3p4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8nj710uwy76sfel3p4m.png" alt="Guided remediation workflow" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key UX Improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compact Row View&lt;/strong&gt; - Scan 10+ findings without scrolling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Filters&lt;/strong&gt; - Filter by region, service, environment, time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Search&lt;/strong&gt; - Search CVE IDs, instance IDs, package names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linked Remediation&lt;/strong&gt; - Click vulnerability → See exact fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy-Paste Commands&lt;/strong&gt; - One-click copy of remediation commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Refresh&lt;/strong&gt; - Optional 5-minute auto-refresh with toast notifications&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Performance Optimizations
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Efficient Data Loading
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Cache busting for fresh data&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheBuster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`findings.json?v=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cacheBuster&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Skeleton loading states&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showLoadingState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;skeletonHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
        &amp;lt;div class="skeleton skeleton-card"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="skeleton skeleton-card"&amp;gt;&amp;lt;/div&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;skeletonHTML&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Client-Side Filtering
&lt;/h4&gt;

&lt;p&gt;All filtering happens client-side for instant response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;matchesGlobalFilters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Region filter&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Region&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Service filter&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resourceType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Resources&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Search filter (fuzzy match)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;globalFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; 
               &lt;span class="nx"&gt;cve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; 
               &lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Smart Sorting
&lt;/h4&gt;

&lt;p&gt;Multiple sort options with O(n log n) performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sortFindings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sortBy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortBy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;severity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="nx"&gt;severityOrder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Severity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;severityOrder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Severity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cvss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="nf"&gt;getCVSS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;getCVSS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CreatedAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CreatedAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deployment Architecture
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Infrastructure as Code
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CloudFormation Template&lt;/span&gt;
&lt;span class="na"&gt;Resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;SecurityScannerFunction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Lambda::Function&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3.11&lt;/span&gt;
      &lt;span class="na"&gt;Handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;index.lambda_handler&lt;/span&gt;
      &lt;span class="na"&gt;Timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
      &lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;Variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;REPORTS_BUCKET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;SecurityReportsBucket&lt;/span&gt;
          &lt;span class="na"&gt;SNS_TOPIC_ARN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;SecurityAlertsTopic&lt;/span&gt;

  &lt;span class="na"&gt;DailyScanRule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Events::Rule&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ScheduleExpression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cron(0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*)'&lt;/span&gt;
      &lt;span class="na"&gt;Targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!GetAtt&lt;/span&gt; &lt;span class="s"&gt;SecurityScannerFunction.Arn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cost Optimization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Monthly Costs (Small Environment):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security Hub: $30&lt;/li&gt;
&lt;li&gt;Inspector: $40&lt;/li&gt;
&lt;li&gt;AWS Config: $15&lt;/li&gt;
&lt;li&gt;Lambda: $5&lt;/li&gt;
&lt;li&gt;S3 + CloudFront: $2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: ~$92/month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ROI:&lt;/strong&gt; Found $70/month in cost savings (idle resources) in first scan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Results &amp;amp; Impact
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Metrics from Sandbox Deployment:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;73 vulnerabilities&lt;/strong&gt; identified across 5 services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 Critical&lt;/strong&gt; (CVE-2025-69264 - pnpm RCE)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;72 High&lt;/strong&gt; severity findings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7 unused S3 buckets&lt;/strong&gt; (inactive 100+ days)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 idle load balancer&lt;/strong&gt; ($20/month waste)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 idle RDS instance&lt;/strong&gt; ($50/month waste)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time Savings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; 2-3 hours to manually correlate findings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After:&lt;/strong&gt; 5 minutes to identify and prioritize top issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;User Feedback:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Finally, a security dashboard that tells me what to do"&lt;/li&gt;
&lt;li&gt;"The copy-paste commands save so much time"&lt;/li&gt;
&lt;li&gt;"Love the Top Priority filter - shows exactly what needs fixing"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UX Matters in Security Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security teams are overwhelmed with data&lt;/li&gt;
&lt;li&gt;Actionable guidance &amp;gt; Raw findings&lt;/li&gt;
&lt;li&gt;Scannable interfaces &amp;gt; Detailed cards&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration is Key&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No single AWS service provides complete visibility&lt;/li&gt;
&lt;li&gt;Correlation across services reveals true risk&lt;/li&gt;
&lt;li&gt;Operational issues (cost, unused resources) matter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prioritization is Critical&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not all vulnerabilities are equal&lt;/li&gt;
&lt;li&gt;Context matters (environment, exposure, age)&lt;/li&gt;
&lt;li&gt;Fix availability should drive priority&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation Reduces Toil&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily scans catch new issues early&lt;/li&gt;
&lt;li&gt;Auto-generated remediation commands reduce errors&lt;/li&gt;
&lt;li&gt;Toast notifications build trust&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Future Enhancements
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automated Remediation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-patch non-production resources&lt;/li&gt;
&lt;li&gt;Create Jira tickets for manual review&lt;/li&gt;
&lt;li&gt;Track remediation progress&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ML-Based Prioritization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn from user actions&lt;/li&gt;
&lt;li&gt;Predict likelihood of exploitation&lt;/li&gt;
&lt;li&gt;Recommend based on similar environments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compliance Mapping&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Map findings to compliance frameworks (PCI-DSS, HIPAA, SOC 2)&lt;/li&gt;
&lt;li&gt;Generate compliance reports&lt;/li&gt;
&lt;li&gt;Track remediation for audits&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Account Support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregate findings across AWS accounts&lt;/li&gt;
&lt;li&gt;Organization-wide dashboards&lt;/li&gt;
&lt;li&gt;Role-based access control&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Building effective security tools requires more than just collecting data. It requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent aggregation&lt;/strong&gt; across multiple sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart prioritization&lt;/strong&gt; based on real risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionable guidance&lt;/strong&gt; that reduces time-to-fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive UX&lt;/strong&gt; that security teams actually want to use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our AWS Security Vulnerability Scanner demonstrates that with thoughtful design and implementation, security tools can be both powerful and delightful to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reach Out to Us
&lt;/h2&gt;

&lt;p&gt;Interested in modernizing your cloud infrastructure and building enterprise-grade solutions? &lt;strong&gt;Storm Reply&lt;/strong&gt; is driven by continuous learning and practical innovation. We specialize in designing and delivering scalable AWS architectures that support customers throughout their cloud journey, from early assessment to production-ready deployment.&lt;/p&gt;

&lt;p&gt;With deep experience in AWS architecture, data engineering, and security best practices, we help enterprises migrate with confidence and move faster on their cloud transformation goals.&lt;/p&gt;

&lt;p&gt;Let’s connect and explore how we can support your modernization initiatives.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.stormreply.cloud/" rel="noopener noreferrer"&gt;https://www.stormreply.cloud/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💼 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/company/storm-reply/posts/?feedView=all" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/storm-reply/posts/?feedView=all&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Date:&lt;/strong&gt; January 2026&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: Python 3.11, Boto3&lt;/li&gt;
&lt;li&gt;Frontend: Vanilla JavaScript, HTML5, CSS3&lt;/li&gt;
&lt;li&gt;Infrastructure: AWS Lambda, CloudFormation, S3, SNS&lt;/li&gt;
&lt;li&gt;APIs: Security Hub, Inspector, Config, Trusted Advisor&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>From Chaos to Clarity: How We Built Jira-Assist (SmartBoard AI) to Transform Ticket Management</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Tue, 16 Dec 2025 13:58:57 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/from-chaos-to-clarity-how-we-built-jira-assist-smartboard-ai-to-transform-ticket-management-3k4h</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/from-chaos-to-clarity-how-we-built-jira-assist-smartboard-ai-to-transform-ticket-management-3k4h</guid>
      <description>&lt;h1&gt;
  
  
  Taming Jira Chaos with Generative AI: Building Jira-Assist (SmartBoard AI)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the age of software-defined vehicles and agile development, speed and collaboration define success. Yet one challenge persists across engineering teams: Jira ticket chaos.&lt;/p&gt;

&lt;p&gt;Manual ticket creation, misclassified issues, duplicate entries, and fragmented project data often lead to confusion, missed dependencies, and slower releases. In automotive software programs, where traceability and process governance are non-negotiable, this problem becomes even more visible.&lt;/p&gt;

&lt;p&gt;To address this, we built &lt;strong&gt;Jira-Assist (SmartBoard AI)&lt;/strong&gt;, a generative AI-powered assistant that simplifies how developers interact with Jira. The goal was to make ticket management conversational, intelligent, and seamlessly integrated into tools engineers already use, like Microsoft Teams and Slack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Business Challenge
&lt;/h2&gt;

&lt;p&gt;Across large engineering programs, teams were spending excessive time on Jira administration rather than actual engineering work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating and updating tickets
&lt;/li&gt;
&lt;li&gt;Finding the right Epic or component
&lt;/li&gt;
&lt;li&gt;Linking issues correctly
&lt;/li&gt;
&lt;li&gt;Cleaning up metadata after the fact
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These inefficiencies resulted in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slower delivery cycles due to inconsistent ticket handling
&lt;/li&gt;
&lt;li&gt;Lost traceability across components and releases
&lt;/li&gt;
&lt;li&gt;Difficult onboarding for engineers unfamiliar with Jira taxonomy
&lt;/li&gt;
&lt;li&gt;Limited sprint visibility without manual cleanup
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We needed an intelligent automation layer that could understand natural language intent and act on it reliably, without adding another tool or workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Solution Overview: Jira-Assist (SmartBoard AI)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Jira-Assist&lt;/strong&gt; is a conversational AI assistant that interprets natural language and converts it into structured Jira actions. Engineers can create, update, query, or track Jira issues directly from chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt-to-Ticket&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Converts conversational input into fully structured Jira issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Tagging&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically identifies Epics, priorities, components, and ownership.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Duplicate Detection&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Suggests existing or related issues before creating new ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Querying&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Retrieves real-time Jira updates directly in Slack or Teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless Integration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Acts as an always-available AI teammate inside everyday workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not just automation. It is augmented intelligence built into the developer experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Architecture (AWS-Powered)
&lt;/h2&gt;

&lt;p&gt;The platform is built entirely on AWS with a strong focus on security, scalability, and resilience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mu2q39nmxfy9c8ruxjq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mu2q39nmxfy9c8ruxjq.png" alt="Architecture diagram" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chat Interface (Cognito Pool + AppSync + GraphQL + SQS)&lt;/strong&gt; Connects Slack and Microsoft Teams to backend services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon Bedrock&lt;/strong&gt; Provides the generative AI foundation using models such as Claude 3.5.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt; Stores prompt templates and contextual knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Lambda Orchestrator&lt;/strong&gt; Coordinates AI responses, context retrieval, and Jira operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jira Agent Lambda&lt;/strong&gt; Handles Jira-specific actions like create, update, and search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; Manages user profiles and conversational context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon API Gateway&lt;/strong&gt; Secures communication between chat interfaces and backend services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jira Cloud API&lt;/strong&gt; Enables bidirectional interaction with Jira projects and boards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CloudWatch and SNS&lt;/strong&gt; Provide monitoring, logging, and operational alerts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implementation Highlights
&lt;/h2&gt;

&lt;p&gt;Each request follows a clear orchestration flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chat input is analyzed to detect intent such as create, query, or update.
&lt;/li&gt;
&lt;li&gt;User context and prior session data are retrieved from DynamoDB.
&lt;/li&gt;
&lt;li&gt;Amazon Bedrock generates a structured Jira payload with metadata.
&lt;/li&gt;
&lt;li&gt;The Lambda Orchestrator routes the request to the Jira Agent.
&lt;/li&gt;
&lt;li&gt;Jira APIs execute the requested action.
&lt;/li&gt;
&lt;li&gt;Logs and metrics are published to CloudWatch for visibility and analysis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By integrating directly with Teams and Slack, engineers can discuss work, create tickets, and track progress without switching tools. Jira-Assist becomes part of the conversation.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzpd65pqvzcp2esiszwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzpd65pqvzcp2esiszwu.png" alt="Chat Interface" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi92ejrgzcjrd3gnvnn1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi92ejrgzcjrd3gnvnn1g.png" alt="Chatbot Creates Jira Ticket" width="720" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qtxb8eoo0i2m8mon8nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qtxb8eoo0i2m8mon8nn.png" alt="Automatic Ticket Creation in Jiraboad" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits Realized
&lt;/h2&gt;

&lt;p&gt;After an internal pilot deployment, the results were immediate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40% reduction in manual ticket handling
&lt;/li&gt;
&lt;li&gt;Improved consistency in Epics, priorities, and ownership
&lt;/li&gt;
&lt;li&gt;Faster onboarding with reduced training overhead
&lt;/li&gt;
&lt;li&gt;Better visibility into Jira health and sprint metrics
&lt;/li&gt;
&lt;li&gt;Smoother collaboration across Teams and Slack
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automating repetitive tasks freed up engineering time for design, testing, and innovation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;The Jira-Assist roadmap includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-driven sprint and backlog planning
&lt;/li&gt;
&lt;li&gt;Multi-language support for global engineering teams
&lt;/li&gt;
&lt;li&gt;Deeper integration with CI/CD dashboards
&lt;/li&gt;
&lt;li&gt;Expansion into other ticket systems such as ServiceNow and GitHub Issues
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Jira-Assist (SmartBoard AI) is more than a productivity improvement. It is an AI co-pilot that reshapes how engineering teams collaborate and deliver software.&lt;/p&gt;

&lt;p&gt;By combining generative AI with AWS-native services, we built a secure, context-aware assistant that aligns with enterprise governance while staying easy to use.&lt;/p&gt;

&lt;p&gt;The future of work is not about replacing people. It is about removing friction so engineers can focus on what matters most.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reach Out to Us
&lt;/h2&gt;

&lt;p&gt;Interested in modernizing your cloud infrastructure and building enterprise-grade solutions? &lt;strong&gt;Storm Reply&lt;/strong&gt; is driven by continuous learning and practical innovation. We specialize in designing and delivering scalable AWS architectures that support customers throughout their cloud journey, from early assessment to production-ready deployment.&lt;/p&gt;

&lt;p&gt;With deep experience in AWS architecture, data engineering, and security best practices, we help enterprises migrate with confidence and move faster on their cloud transformation goals.&lt;/p&gt;

&lt;p&gt;Let’s connect and explore how we can support your modernization initiatives.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.stormreply.cloud/" rel="noopener noreferrer"&gt;https://www.stormreply.cloud/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💼 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/company/storm-reply/posts/?feedView=all" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/storm-reply/posts/?feedView=all&lt;/a&gt;&lt;/p&gt;

</description>
      <category>atlassian</category>
      <category>bedrock</category>
      <category>genai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building an Enterprise Patching Dashboard with AWS - A Complete Guide</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Wed, 26 Nov 2025 12:56:51 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/building-an-enterprise-patching-dashboard-with-aws-a-complete-guide-3dah</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/building-an-enterprise-patching-dashboard-with-aws-a-complete-guide-3dah</guid>
      <description>&lt;h1&gt;
  
  
  Learn how to build a centralized patching and inventory management solution using AWS Systems Manager, Glue, Athena, and QuickSight
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Imagine managing 50+ EC2 instances across multiple AWS regions. Your security team asks: &lt;em&gt;"Which servers are missing critical patches?"&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Without proper tooling, you'd need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH into each server manually&lt;/li&gt;
&lt;li&gt;Run patch compliance checks one by one&lt;/li&gt;
&lt;li&gt;Compile results in a spreadsheet&lt;/li&gt;
&lt;li&gt;Repeat this process weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time required:&lt;/strong&gt; 2-3 hours. &lt;strong&gt;Accuracy:&lt;/strong&gt; Questionable. &lt;strong&gt;Scalability:&lt;/strong&gt; Impossible.&lt;/p&gt;

&lt;p&gt;There had to be a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built an &lt;strong&gt;enterprise-grade patching and inventory management dashboard&lt;/strong&gt; that automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Collects inventory from all EC2 instances across regions&lt;/li&gt;
&lt;li&gt;✅ Tracks patch compliance in real-time&lt;/li&gt;
&lt;li&gt;✅ Visualizes data in interactive dashboards&lt;/li&gt;
&lt;li&gt;✅ Enables natural language queries with Amazon Q&lt;/li&gt;
&lt;li&gt;✅ Requires zero manual intervention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time to check compliance:&lt;/strong&gt; 5 seconds. &lt;strong&gt;Accuracy:&lt;/strong&gt; 100%. &lt;strong&gt;Scalability:&lt;/strong&gt; Unlimited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2f2nf8x1ssq7t36ry0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2f2nf8x1ssq7t36ry0e.png" alt="SSM Inventory to Quicksight Architecture" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The solution uses a serverless, 4-layer architecture:&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This Special?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Region Architecture
&lt;/h3&gt;

&lt;p&gt;I implemented two network patterns to demonstrate real-world scenarios:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: Private Subnet with VPC Endpoints (eu-central-1)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 Amazon Linux instances in private subnets&lt;/li&gt;
&lt;li&gt;Zero internet access&lt;/li&gt;
&lt;li&gt;Communication via VPC endpoints (SSM, S3)&lt;/li&gt;
&lt;li&gt;Perfect for production workloads requiring strict isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: Public Subnet with Internet Gateway (eu-west-1)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 Windows instance&lt;/li&gt;
&lt;li&gt;Internet gateway for updates&lt;/li&gt;
&lt;li&gt;Suitable for dev/test environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Automated Data Pipeline
&lt;/h3&gt;

&lt;p&gt;Systems Manager collects 9 types of inventory data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instance information (OS, platform, IP addresses)&lt;/li&gt;
&lt;li&gt;Patch compliance status&lt;/li&gt;
&lt;li&gt;Installed applications and versions&lt;/li&gt;
&lt;li&gt;Windows updates&lt;/li&gt;
&lt;li&gt;Network configurations&lt;/li&gt;
&lt;li&gt;Running services&lt;/li&gt;
&lt;li&gt;File inventory&lt;/li&gt;
&lt;li&gt;Custom tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All data automatically syncs to a central S3 bucket every 30 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Serverless Processing
&lt;/h3&gt;

&lt;p&gt;AWS Glue crawlers automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover new inventory data&lt;/li&gt;
&lt;li&gt;Create/update table schemas&lt;/li&gt;
&lt;li&gt;Catalog data for querying&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No servers to manage, no infrastructure to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Interactive Dashboards
&lt;/h3&gt;

&lt;p&gt;QuickSight dashboards provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Patch Compliance Overview:&lt;/strong&gt; See compliance percentage at a glance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing Patches by Severity:&lt;/strong&gt; Prioritize critical updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instance Inventory:&lt;/strong&gt; Group by region, OS, or application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend Analysis:&lt;/strong&gt; Track compliance over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Amazon Q integration enables natural language queries like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me all Windows servers in eu-west-1 missing critical patches"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Implementation Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Setup EC2 Instances
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Region 1: eu-central-1 (Private Subnet)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create VPC with private subnet&lt;/span&gt;
aws ec2 create-vpc &lt;span class="nt"&gt;--cidr-block&lt;/span&gt; 10.0.0.0/16 &lt;span class="nt"&gt;--region&lt;/span&gt; eu-central-1

&lt;span class="c"&gt;# Create VPC Endpoints for SSM&lt;/span&gt;
aws ec2 create-vpc-endpoint &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-id&lt;/span&gt; vpc-xxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service-name&lt;/span&gt; com.amazonaws.eu-central-1.ssm &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-endpoint-type&lt;/span&gt; Interface

&lt;span class="c"&gt;# Launch instances with SSM role&lt;/span&gt;
aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-xxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--iam-instance-profile&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SSMInstanceProfile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet-id&lt;/span&gt; subnet-xxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--count&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Region 2: eu-west-1 (Public Subnet)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Launch Windows instance&lt;/span&gt;
aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-xxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--iam-instance-profile&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SSMInstanceProfile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet-id&lt;/span&gt; subnet-xxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; eu-west-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Systems Manager Inventory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create S3 bucket for inventory data&lt;/span&gt;
aws s3 mb s3://my-ssm-inventory-bucket &lt;span class="nt"&gt;--region&lt;/span&gt; eu-central-1

&lt;span class="c"&gt;# Create Resource Data Sync (aggregates multi-region data)&lt;/span&gt;
aws ssm create-resource-data-sync &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sync-name&lt;/span&gt; my-inventory-sync &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--s3-destination&lt;/span&gt; &lt;span class="s2"&gt;"BucketName=my-ssm-inventory-bucket,Region=eu-central-1"&lt;/span&gt;

&lt;span class="c"&gt;# Enable inventory collection&lt;/span&gt;
aws ssm create-association &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; AWS-GatherSoftwareInventory &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--targets&lt;/span&gt; &lt;span class="s2"&gt;"Key=InstanceIds,Values=*"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--schedule-expression&lt;/span&gt; &lt;span class="s2"&gt;"rate(30 minutes)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Setup AWS Glue
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Glue database&lt;/span&gt;
aws glue create-database &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--database-input&lt;/span&gt; &lt;span class="s1"&gt;'{"Name":"ssm_inventory_db"}'&lt;/span&gt;

&lt;span class="c"&gt;# Create Glue crawler&lt;/span&gt;
aws glue create-crawler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ssm-inventory-crawler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; GlueServiceRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--database-name&lt;/span&gt; ssm_inventory_db &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--targets&lt;/span&gt; &lt;span class="s1"&gt;'{"S3Targets":[{"Path":"s3://my-ssm-inventory-bucket/"}]}'&lt;/span&gt;

&lt;span class="c"&gt;# Run crawler&lt;/span&gt;
aws glue start-crawler &lt;span class="nt"&gt;--name&lt;/span&gt; ssm-inventory-crawler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Query with Athena
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check patch compliance across all instances&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;instanceid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;platformname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;patchgroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;installedcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;missingcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;failedcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;installedcount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;installedcount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;missingcount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;compliance_percentage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ssm_inventory_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aws_patchsummary&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;missingcount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;missingcount&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Find instances with critical missing patches&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;instanceid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;state&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ssm_inventory_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aws_patchcompliance&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Missing'&lt;/span&gt; 
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Critical'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Create QuickSight Dashboard
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Subscribe to QuickSight Enterprise Edition&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grant S3 and Athena permissions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create datasets from Athena tables&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build visualizations:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Donut chart: Patch compliance percentage&lt;/li&gt;
&lt;li&gt;Bar chart: Missing patches by severity&lt;/li&gt;
&lt;li&gt;Table: Instance inventory with drill-down&lt;/li&gt;
&lt;li&gt;Line chart: Compliance trends over time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdw8znbx3b5om581yq08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdw8znbx3b5om581yq08.png" alt="Analysis Dashboard" width="790" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wuzj8ty6kx82v5uecik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wuzj8ty6kx82v5uecik.png" alt="Analysis Dashboard" width="779" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F579oli9xfvr1qk6k9p9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F579oli9xfvr1qk6k9p9v.png" alt="Analysis Dashboard" width="777" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Flow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  End to End Data Pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0opc8akfojvuvhh2o97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0opc8akfojvuvhh2o97.png" alt="SSM Data Pipeline-5 Stage Flow" width="644" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Insights &amp;amp; Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. VPC Endpoints Are Essential
&lt;/h3&gt;

&lt;p&gt;For private subnet instances, VPC endpoints are non-negotiable. Without them, SSM agents can't communicate with AWS services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.01/hour per endpoint (~$7/month)&lt;br&gt;
&lt;strong&gt;Value:&lt;/strong&gt; Priceless for security compliance&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Resource Data Sync Simplifies Multi-Region
&lt;/h3&gt;

&lt;p&gt;Instead of managing separate S3 buckets per region, Resource Data Sync aggregates everything into one location. This makes Glue crawling and Athena queries much simpler.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Glue Crawlers Are Smart
&lt;/h3&gt;

&lt;p&gt;Glue automatically detects schema changes and creates partitions. When SSM adds new inventory types, the crawler adapts without manual intervention.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. QuickSight + Amazon Q = Game Changer
&lt;/h3&gt;

&lt;p&gt;Non-technical stakeholders can ask questions in plain English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Which servers need patching?"&lt;/li&gt;
&lt;li&gt;"Show me compliance by region"&lt;/li&gt;
&lt;li&gt;"What applications are installed on production servers?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No SQL knowledge required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Breakdown
&lt;/h2&gt;

&lt;p&gt;For a 50-instance deployment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Existing instances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systems Manager&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Inventory is free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;~$1/month&lt;/td&gt;
&lt;td&gt;Minimal data storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glue&lt;/td&gt;
&lt;td&gt;~$5/month&lt;/td&gt;
&lt;td&gt;Crawler runs + catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena&lt;/td&gt;
&lt;td&gt;~$5/month&lt;/td&gt;
&lt;td&gt;$5 per TB scanned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QuickSight&lt;/td&gt;
&lt;td&gt;$24/user/month&lt;/td&gt;
&lt;td&gt;Enterprise Edition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC Endpoints&lt;/td&gt;
&lt;td&gt;~$21/month&lt;/td&gt;
&lt;td&gt;3 endpoints × $7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; ~$56/month for enterprise-grade visibility&lt;/p&gt;

&lt;p&gt;Compare this to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual process: 2-3 hours/week × $50/hour = $400-600/month&lt;/li&gt;
&lt;li&gt;Third-party tools: $100-500/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ROI:&lt;/strong&gt; Positive from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Impact
&lt;/h2&gt;

&lt;p&gt;After implementing this solution:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Reduced patch compliance checking from 3 hours to 5 seconds&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Identified 15 instances with critical missing patches immediately&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Automated monthly compliance reports for security audits&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Discovered unused applications, saving licensing costs&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Enabled proactive patching before vulnerabilities are exploited&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This PoC can be extended with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automated Patching:&lt;/strong&gt; Integrate with SSM Patch Manager for automatic remediation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerting:&lt;/strong&gt; SNS notifications when compliance drops below threshold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Account:&lt;/strong&gt; AWS Organizations integration for enterprise-wide visibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Inventory:&lt;/strong&gt; Track business-specific configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Policies:&lt;/strong&gt; Enforce patching SLAs with automated workflows&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start small:&lt;/strong&gt; Begin with 2-3 instances, validate the pipeline, then scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test both network patterns:&lt;/strong&gt; Private subnets require VPC endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Glue crawler costs:&lt;/strong&gt; Schedule crawlers wisely (daily is usually enough)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Athena partitions:&lt;/strong&gt; Partition by date to reduce query costs&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building this enterprise patching dashboard taught me that &lt;strong&gt;visibility is the foundation of security&lt;/strong&gt;. You can't patch what you can't see.&lt;/p&gt;

&lt;p&gt;This solution demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-region AWS architecture&lt;/li&gt;
&lt;li&gt;Serverless data engineering&lt;/li&gt;
&lt;li&gt;Security best practices&lt;/li&gt;
&lt;li&gt;Real-world problem solving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're managing 10 servers or 10,000, this pattern scales effortlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best part?&lt;/strong&gt; It's 100% serverless. Deploy it, forget it, and let AWS handle the rest.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reach Out to Us
&lt;/h2&gt;

&lt;p&gt;Interested in modernizing your cloud infrastructure and implementing enterprise-grade solutions? &lt;strong&gt;Storm Reply&lt;/strong&gt; is committed to continuous learning and innovation. Our team specializes in building scalable AWS architectures to support customers on their cloud journey—from initial assessment to full deployment.&lt;/p&gt;

&lt;p&gt;With expertise in AWS architecture, data engineering, and security best practices, we can help enterprises migrate confidently and accelerate their cloud transformation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's connect and discuss how we can support your modernization initiatives.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🌐 Visit: [&lt;a href="https://www.stormreply.cloud/" rel="noopener noreferrer"&gt;https://www.stormreply.cloud/&lt;/a&gt;]&lt;br&gt;&lt;br&gt;
💼 LinkedIn: [&lt;a href="https://www.linkedin.com/company/storm-reply/posts/?feedView=all" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/storm-reply/posts/?feedView=all&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>AWS Blu Age Modernization</title>
      <dc:creator>Debapriya Dey</dc:creator>
      <pubDate>Tue, 25 Nov 2025 21:10:21 +0000</pubDate>
      <link>https://dev.to/debapriya_dey_aada54b7766/aws-blu-age-modernization-my-journey-through-all-3-certification-levels-18c5</link>
      <guid>https://dev.to/debapriya_dey_aada54b7766/aws-blu-age-modernization-my-journey-through-all-3-certification-levels-18c5</guid>
      <description>&lt;h2&gt;
  
  
  About AWS Blu Age?
&lt;/h2&gt;

&lt;p&gt;AWS Blu Age is an automated mainframe modernization solution that transforms legacy COBOL applications into modern Java Spring Boot applications running on AWS. It's part of AWS Mainframe Modernization service and uses AI-powered refactoring to convert decades-old code into cloud-native applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Value&lt;/strong&gt;: Instead of manually rewriting millions of lines of COBOL code (which takes years), Blu Age automates 85-95% of the transformation in weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: Organizations run critical business applications on mainframes but face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High operational costs (licensing, hardware, specialized staff)&lt;/li&gt;
&lt;li&gt;Scarce COBOL talent&lt;/li&gt;
&lt;li&gt;Inability to innovate quickly&lt;/li&gt;
&lt;li&gt;Difficulty integrating with modern systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2xn7mmt4u8jju4p5q6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2xn7mmt4u8jju4p5q6d.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Blu Age transforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;COBOL → Java Spring Boot&lt;/li&gt;
&lt;li&gt;JCL batch jobs → AWS Batch/Step Functions&lt;/li&gt;
&lt;li&gt;CICS transactions → REST APIs&lt;/li&gt;
&lt;li&gt;DB2/IMS → PostgreSQL/Aurora&lt;/li&gt;
&lt;li&gt;Mainframe → AWS Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9idr3x7ii5hd7vagx00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9idr3x7ii5hd7vagx00.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flq0zuc5vhta92o4dd44c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flq0zuc5vhta92o4dd44c.png" alt=" " width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Components
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blu Insights&lt;/strong&gt;: Assessment tool to analyze mainframe code and create transformation roadmap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refactoring Engine&lt;/strong&gt;: Automated code transformation with customizable rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blu Age Runtime&lt;/strong&gt;: Modern Java runtime environment for refactored applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blu Age Developer&lt;/strong&gt;: IDE for post-transformation customization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspgqcl4hsx9u8zeilsmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspgqcl4hsx9u8zeilsmr.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Certification Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Level 1: Foundations (Black Belt)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus&lt;/strong&gt;: Understanding mainframe modernization fundamentals&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mainframe basics (COBOL, JCL, CICS, DB2)&lt;/li&gt;
&lt;li&gt;AWS Mainframe Modernization service architecture&lt;/li&gt;
&lt;li&gt;Assessment methodology using Blu Insights&lt;/li&gt;
&lt;li&gt;Transformation strategies (Rehost vs Replatform vs Refactor)&lt;/li&gt;
&lt;li&gt;Business case development and ROI calculation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Proper assessment is critical. Blu Insights analyzes your codebase to identify complexity, dependencies, and transformation effort before you start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 2: Advanced Refactoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus&lt;/strong&gt;: Hands-on transformation and implementation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep dive into refactoring engine mechanics&lt;/li&gt;
&lt;li&gt;Custom transformation rules and patterns&lt;/li&gt;
&lt;li&gt;Database migration strategies (DB2 to PostgreSQL)&lt;/li&gt;
&lt;li&gt;Batch processing transformation (JCL to AWS Batch)&lt;/li&gt;
&lt;li&gt;Online transaction processing (CICS to Spring Boot REST APIs)&lt;/li&gt;
&lt;li&gt;Testing and validation approaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: The refactoring engine is highly accurate, but you need to understand the patterns to customize transformations for complex business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 3: Expert Delivery
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Focus&lt;/strong&gt;: Production-ready implementations and customer delivery&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end project delivery methodology&lt;/li&gt;
&lt;li&gt;Production deployment strategies (ECS, EKS, EC2)&lt;/li&gt;
&lt;li&gt;Performance optimization and tuning&lt;/li&gt;
&lt;li&gt;Ad-hoc modifications and customizations&lt;/li&gt;
&lt;li&gt;Customer POC execution&lt;/li&gt;
&lt;li&gt;Go-live planning and cutover strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advanced Topics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices decomposition&lt;/li&gt;
&lt;li&gt;CI/CD pipeline setup&lt;/li&gt;
&lt;li&gt;Monitoring and observability&lt;/li&gt;
&lt;li&gt;Troubleshooting production issues&lt;/li&gt;
&lt;li&gt;Leading customer workshops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hands-On&lt;/strong&gt;: Worked with CardDemo sample application - a complete mainframe banking app with COBOL programs, CICS transactions, VSAM files, and DB2 databases. Transformed it end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Success isn't just about transformation - it's about delivering production-ready, performant applications with proper DevOps practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modernization Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Assessment (Blu Insights)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Upload mainframe source code&lt;/li&gt;
&lt;li&gt;Analyze application portfolio&lt;/li&gt;
&lt;li&gt;Identify dependencies and complexity&lt;/li&gt;
&lt;li&gt;Generate effort estimates&lt;/li&gt;
&lt;li&gt;Create transformation roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Refactoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Configure transformation rules&lt;/li&gt;
&lt;li&gt;Execute automated refactoring&lt;/li&gt;
&lt;li&gt;Generate Java Spring Boot code&lt;/li&gt;
&lt;li&gt;Transform data structures&lt;/li&gt;
&lt;li&gt;Create AWS deployment artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Testing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automated test generation&lt;/li&gt;
&lt;li&gt;Functional equivalence testing&lt;/li&gt;
&lt;li&gt;Performance benchmarking&lt;/li&gt;
&lt;li&gt;User acceptance testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to AWS (containerized or VM-based)&lt;/li&gt;
&lt;li&gt;Configure monitoring (CloudWatch, X-Ray)&lt;/li&gt;
&lt;li&gt;Set up CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Implement security controls&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Performance tuning&lt;/li&gt;
&lt;li&gt;Cost optimization&lt;/li&gt;
&lt;li&gt;Microservices decomposition&lt;/li&gt;
&lt;li&gt;Cloud-native enhancements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Applications
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Financial Services&lt;/strong&gt;: Core banking systems, payment processing&lt;br&gt;
&lt;strong&gt;Insurance&lt;/strong&gt;: Policy administration, claims processing&lt;br&gt;
&lt;strong&gt;Government&lt;/strong&gt;: Tax systems, benefits administration&lt;br&gt;
&lt;strong&gt;Retail&lt;/strong&gt;: Inventory management, order processing&lt;/p&gt;

&lt;h2&gt;
  
  
  Certification Path
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic mainframe knowledge (helpful but not required)&lt;/li&gt;
&lt;li&gt;AWS fundamentals&lt;/li&gt;
&lt;li&gt;Java basics (for Level 2+)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Steps&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Join AWS Partner Network (APN)&lt;/li&gt;
&lt;li&gt;Complete AWS Mainframe Modernization training&lt;/li&gt;
&lt;li&gt;Pass Level 1 exam (foundations)&lt;/li&gt;
&lt;li&gt;Complete hands-on labs for Level 2&lt;/li&gt;
&lt;li&gt;Pass Level 2 exam (refactoring)&lt;/li&gt;
&lt;li&gt;Participate in customer POCs for Level 3&lt;/li&gt;
&lt;li&gt;Pass Level 3 exam (expert delivery)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Study Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Skill Builder courses&lt;/li&gt;
&lt;li&gt;AWS Partner Central training&lt;/li&gt;
&lt;li&gt;Blu Age documentation&lt;/li&gt;
&lt;li&gt;Sample applications (CardDemo, GenApp)&lt;/li&gt;
&lt;li&gt;Hands-on workshops&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Assessment First&lt;/strong&gt;: Never skip the assessment phase. Understanding your codebase complexity saves time later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start Small&lt;/strong&gt;: Begin with non-critical applications to build confidence and refine your process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust the Automation&lt;/strong&gt;: The refactoring engine is highly accurate (85-95%), but always validate outputs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Migration is Critical&lt;/strong&gt;: Plan database migration early. It's often more complex than code transformation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DevOps from Day One&lt;/strong&gt;: Set up CI/CD pipelines immediately to accelerate testing and deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business Involvement&lt;/strong&gt;: Keep business stakeholders engaged throughout the process for validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Complex business logic in COBOL&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use custom transformation rules and pattern recognition&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Data migration complexity&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Leverage AWS DMS alongside Blu Age for seamless migration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Testing effort&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Automate test generation and use equivalence testing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Skills gap&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Hybrid teams with mainframe + cloud expertise&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Get Certified?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Career Growth&lt;/strong&gt;: Mainframe modernization is a multi-billion dollar market&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique Skillset&lt;/strong&gt;: Combination of legacy and modern cloud skills is rare&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Demand&lt;/strong&gt;: Enterprises are actively seeking certified professionals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands-On Experience&lt;/strong&gt;: Certification provides practical, real-world skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Recognition&lt;/strong&gt;: Official AWS partner certification&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Completing all three levels of AWS Blu Age certification has been transformative. The technology is mature, proven, and capable of handling the most complex mainframe modernization challenges. &lt;/p&gt;

&lt;p&gt;If you're a solutions architect, developer, or IT leader, AWS Blu Age opens doors to exciting modernization opportunities. The mainframe era isn't ending - it's evolving into cloud-native applications that preserve decades of business logic while enabling modern innovation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to start?&lt;/strong&gt; &lt;a href="https://aws.amazon.com/mainframe-modernization/" rel="noopener noreferrer"&gt;Visit AWS Mainframe Modernization service page &lt;/a&gt;and begin your &lt;a href="https://bluinsights.aws/certification/" rel="noopener noreferrer"&gt;Level 1 certification journey&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reach Out to Us
&lt;/h2&gt;

&lt;p&gt;Interested in modernizing your mainframe applications with AWS Blu Age? Storm Reply is committed to continuous learning and innovation. Our team is building the Blu Age expertise to support customers on their modernization path—from initial assessment to full refactoring and deployment.&lt;/p&gt;

&lt;p&gt;With a blend of mainframe understanding, AWS architecture knowledge, and Java engineering skills, we can help enterprises migrate confidently and accelerate their cloud journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's connect and discuss how we can support your modernization initiatives.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🌐 Visit: [&lt;a href="https://www.stormreply.cloud" rel="noopener noreferrer"&gt;https://www.stormreply.cloud&lt;/a&gt;]&lt;br&gt;&lt;br&gt;
💼 LinkedIn: [&lt;a href="https://www.linkedin.com/company/storm-reply/posts/?feedView=all" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/storm-reply/posts/?feedView=all&lt;/a&gt;]&lt;/p&gt;




</description>
      <category>learning</category>
      <category>java</category>
      <category>ai</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
