<?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: AlpeshKumbhare</title>
    <description>The latest articles on DEV Community by AlpeshKumbhare (@alpeshkumbhare).</description>
    <link>https://dev.to/alpeshkumbhare</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4052950%2F5b138a7b-f1ab-4f3d-9046-fdea671e3aa0.jpg</url>
      <title>DEV Community: AlpeshKumbhare</title>
      <link>https://dev.to/alpeshkumbhare</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alpeshkumbhare"/>
    <language>en</language>
    <item>
      <title>Migrating to AWS: The 7 Rs, Migration Tools, and How to Actually Move an Enterprise Portfolio</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Mon, 07 Sep 2026 06:47:42 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/migrating-to-aws-the-7-rs-migration-tools-and-how-to-actually-move-an-enterprise-portfolio-2ljn</link>
      <guid>https://dev.to/alpeshkumbhare/migrating-to-aws-the-7-rs-migration-tools-and-how-to-actually-move-an-enterprise-portfolio-2ljn</guid>
      <description>&lt;p&gt;Migrating a handful of servers to AWS is easy. Migrating an enterprise portfolio of hundreds of applications — with dependencies, compliance constraints, and zero downtime tolerance — is a program, not a project. The difference between success and a stalled migration is a clear strategy per application and the right tools for each phase.&lt;/p&gt;

&lt;p&gt;This guide covers the 7 Rs migration framework, the migration lifecycle, and the AWS tools that turn "we should move to cloud" into a tracked, executable plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Migration Lifecycle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│  ASSESS   │──→│ MOBILIZE │──→│ MIGRATE  │──→│MODERNIZE │
│          │   │          │   │          │   │          │
│ Discover  │   │ Landing  │   │ Move     │   │ Optimize │
│ portfolio │   │ zone,    │   │ workloads│   │ refactor │
│ + business│   │ pilot,   │   │ in waves │   │ to cloud │
│ case      │   │ skills   │   │          │   │ native   │
└──────────┘   └──────────┘   └──────────┘   └──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most failed migrations skip &lt;strong&gt;Assess&lt;/strong&gt; (no dependency mapping) or &lt;strong&gt;Mobilize&lt;/strong&gt; (no landing zone) and jump straight to moving servers. Don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 Rs: Strategy Per Application
&lt;/h2&gt;

&lt;p&gt;Every application gets one of seven dispositions. This is the core decision.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│  7 Rs MIGRATION STRATEGIES                                       │
├────────────┬─────────────────────────────────────────────────────┤
│ Retire      │ Decommission — no longer needed                     │
│ Retain      │ Keep on-premises (for now) — not ready/not worth it │
│ Relocate    │ Move VMware as-is (VMware Cloud on AWS / EVS)        │
│ Rehost      │ Lift-and-shift (MGN) — move, then optimize          │
│ Replatform  │ Lift-tinker-shift (e.g., DB → RDS, self-mgd → managed)│
│ Repurchase  │ Drop and shop (move to SaaS)                        │
│ Refactor    │ Re-architect for cloud-native (microservices, serverless)│
└────────────┴─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Choosing the Right R
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retire&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;App is unused or redundant&lt;/td&gt;
&lt;td&gt;Legacy reporting tool nobody opens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Compliance/latency keeps it on-prem, or mainframe not ready&lt;/td&gt;
&lt;td&gt;Regulated system pending modernization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relocate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;VMware estate, want fast exit from data center&lt;/td&gt;
&lt;td&gt;vSphere workloads → EVS / VMware Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rehost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Speed matters, optimize later&lt;/td&gt;
&lt;td&gt;App server → EC2 via MGN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replatform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Small changes yield big managed-service wins&lt;/td&gt;
&lt;td&gt;Self-managed MySQL → RDS/Aurora&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repurchase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Commercial SaaS exists&lt;/td&gt;
&lt;td&gt;On-prem CRM → Salesforce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Strategic app needing scale/agility&lt;/td&gt;
&lt;td&gt;Monolith → microservices on ECS/Lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Pragmatic Reality
&lt;/h3&gt;

&lt;p&gt;Most large migrations are &lt;strong&gt;70% Rehost/Relocate, 20% Replatform, 10% Refactor&lt;/strong&gt;. You cannot refactor everything — it's too slow and expensive. Rehost first to exit the data center (hit the deadline), then modernize the applications that justify the investment. This is the "move then improve" pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1: Assess
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Discovery — You Can't Migrate What You Can't See
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS Application Discovery Service&lt;/strong&gt; collects server configs, performance metrics, and — critically — &lt;strong&gt;network dependencies&lt;/strong&gt; from your on-premises environment.&lt;/p&gt;

&lt;p&gt;Two collection methods:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Agentless&lt;/strong&gt; (OVA appliance)&lt;/td&gt;
&lt;td&gt;VM in vCenter, collects VM inventory&lt;/td&gt;
&lt;td&gt;VMware environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Install agent on each server&lt;/td&gt;
&lt;td&gt;Detailed process + dependency data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Discovery answers: What do we have? How is it used? What talks to what? (Dependency mapping prevents the classic "we migrated the app but forgot it calls a database still on-prem" disaster.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Migration Evaluator / Business Case
&lt;/h3&gt;

&lt;p&gt;Before moving anything, build the business case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current TCO (hardware, licensing, data center, staff)&lt;/li&gt;
&lt;li&gt;Projected AWS cost (right-sized, with Savings Plans)&lt;/li&gt;
&lt;li&gt;Migration cost + timeline&lt;/li&gt;
&lt;li&gt;Risk assessment per application&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Phase 2: Mobilize
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build the Foundation
&lt;/h3&gt;

&lt;p&gt;Before migrating workloads, establish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Landing Zone&lt;/strong&gt; — multi-account structure, guardrails, networking (Control Tower / Landing Zone Accelerator)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network connectivity&lt;/strong&gt; — Direct Connect or Site-to-Site VPN to on-premises&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security baseline&lt;/strong&gt; — GuardDuty, Security Hub, IAM Identity Center&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration pilot&lt;/strong&gt; — migrate 1-3 low-risk applications to validate the process and build team skills&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migration Waves
&lt;/h3&gt;

&lt;p&gt;Group applications into waves based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt; — migrate tightly-coupled apps together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; — start simple, build confidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business criticality&lt;/strong&gt; — non-critical first, crown jewels later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team capacity&lt;/strong&gt; — realistic parallel workload&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Phase 3: Migrate — The Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Migration Hub: Single Pane of Glass
&lt;/h3&gt;

&lt;p&gt;Migration Hub is the command center — it tracks migration status across all tools and applications in one dashboard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─────────────────────┐
                    │   Migration Hub      │
                    │  (tracks everything) │
                    └──────────┬──────────┘
              ┌────────────────┼────────────────┐
              │                │                │
              ▼                ▼                ▼
      ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
      │ App Discovery│ │     MGN      │ │     DMS      │
      │ (assess)     │ │  (rehost)    │ │ (databases)  │
      └──────────────┘ └──────────────┘ └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AWS Application Migration Service (MGN) — for Rehost
&lt;/h3&gt;

&lt;p&gt;The primary lift-and-shift tool. Continuous block-level replication from source servers to AWS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install MGN agent on source servers (or agentless for vCenter)&lt;/li&gt;
&lt;li&gt;Continuous replication to a staging area in AWS (low-cost)&lt;/li&gt;
&lt;li&gt;Launch test instances — validate without affecting source&lt;/li&gt;
&lt;li&gt;Cutover — final sync, launch production instances, redirect traffic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key benefit:&lt;/strong&gt; Minimal downtime (minutes at cutover), continuous sync means you can test repeatedly before committing.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Database Migration Service (DMS) — for Databases
&lt;/h3&gt;

&lt;p&gt;Migrates databases with minimal downtime, including &lt;strong&gt;heterogeneous&lt;/strong&gt; migrations (Oracle → PostgreSQL, SQL Server → Aurora):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Homogeneous&lt;/strong&gt; (same engine): direct migration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heterogeneous&lt;/strong&gt; (different engine): use Schema Conversion Tool (SCT) first to convert schema/code, then DMS for data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CDC (Change Data Capture)&lt;/strong&gt;: keeps source and target in sync during migration for near-zero downtime&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tool Selection by Strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Primary Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rehost&lt;/td&gt;
&lt;td&gt;Application Migration Service (MGN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relocate (VMware)&lt;/td&gt;
&lt;td&gt;VMware Cloud on AWS / Amazon EVS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replatform (database)&lt;/td&gt;
&lt;td&gt;DMS + Schema Conversion Tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor&lt;/td&gt;
&lt;td&gt;Manual re-architecture + CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mainframe&lt;/td&gt;
&lt;td&gt;AWS Mainframe Modernization service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Phase 4: Modernize
&lt;/h2&gt;

&lt;p&gt;Once workloads are on AWS, modernize the ones that justify it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;To&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 app servers&lt;/td&gt;
&lt;td&gt;Containers (ECS/EKS) or Lambda&lt;/td&gt;
&lt;td&gt;Scaling, cost, agility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-managed databases&lt;/td&gt;
&lt;td&gt;RDS/Aurora/DynamoDB&lt;/td&gt;
&lt;td&gt;Managed ops, auto-scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monolith&lt;/td&gt;
&lt;td&gt;Microservices&lt;/td&gt;
&lt;td&gt;Independent deployment, scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch on EC2&lt;/td&gt;
&lt;td&gt;Step Functions + Lambda&lt;/td&gt;
&lt;td&gt;Serverless, pay-per-use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File shares&lt;/td&gt;
&lt;td&gt;S3 + EFS/FSx&lt;/td&gt;
&lt;td&gt;Durability, cost tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data warehouse&lt;/td&gt;
&lt;td&gt;Redshift / Lakehouse (Iceberg)&lt;/td&gt;
&lt;td&gt;Modern analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  AI-Assisted Modernization (2026)
&lt;/h3&gt;

&lt;p&gt;AWS now offers AI-agent-driven modernization — particularly for mainframes. Specification-driven approaches use AI agents to analyze legacy code (COBOL), extract business logic, and generate modern microservices. This dramatically reduces the cost of the hardest migrations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: The Strangler Fig (Gradual Refactor)
&lt;/h3&gt;

&lt;p&gt;Instead of a big-bang rewrite, incrementally replace pieces of a monolith:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Legacy Monolith
    │
    ├── Route new feature → New microservice (AWS)
    ├── Route feature B → New microservice (AWS)
    └── (monolith shrinks over time until retired)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New functionality goes to cloud-native services; the monolith gradually "strangled" until it's gone. Lower risk than big-bang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Rehost Then Replatform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On-prem → MGN rehost to EC2 (hit the data center exit deadline)
       → then: migrate DB to RDS (replatform)
       → then: containerize app (modernize)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get out of the data center fast, improve incrementally. Avoids the trap of trying to perfect everything before moving.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: Database-First (for data-gravity apps)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. DMS replicate database to AWS (CDC keeps in sync)
2. Migrate application servers (MGN)
3. Cutover: point apps to AWS database, stop CDC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Migration Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No dependency mapping&lt;/td&gt;
&lt;td&gt;Break apps that call un-migrated services&lt;/td&gt;
&lt;td&gt;Application Discovery Service first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor everything&lt;/td&gt;
&lt;td&gt;Migration never finishes, budget blown&lt;/td&gt;
&lt;td&gt;Rehost 70%, refactor selectively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No landing zone first&lt;/td&gt;
&lt;td&gt;Ungoverned sprawl, security gaps&lt;/td&gt;
&lt;td&gt;Build landing zone in Mobilize phase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lift-and-shift then stop&lt;/td&gt;
&lt;td&gt;Pay for un-optimized EC2 forever&lt;/td&gt;
&lt;td&gt;Plan modernization backlog post-migration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Big-bang cutover&lt;/td&gt;
&lt;td&gt;High-risk, hard to roll back&lt;/td&gt;
&lt;td&gt;Wave-based migration with pilots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring licensing&lt;/td&gt;
&lt;td&gt;Bring problematic licenses to cloud&lt;/td&gt;
&lt;td&gt;Assess BYOL vs license-included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No rollback plan&lt;/td&gt;
&lt;td&gt;Stuck if cutover fails&lt;/td&gt;
&lt;td&gt;MGN test instances + documented rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Migration Readiness Checklist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASSESS
☐ Application Discovery Service deployed
☐ Dependency mapping complete
☐ 7 Rs disposition assigned per app
☐ Business case / TCO analysis done

MOBILIZE
☐ Landing zone deployed (Control Tower / LZA)
☐ Direct Connect / VPN to on-premises
☐ Security baseline (GuardDuty, Security Hub)
☐ Pilot migration completed + lessons captured
☐ Migration waves planned

MIGRATE
☐ Migration Hub tracking configured
☐ MGN for rehost workloads
☐ DMS + SCT for database migrations
☐ Test instances validated before cutover
☐ Rollback procedure documented per wave

MODERNIZE
☐ Post-migration optimization backlog
☐ Right-sizing (Compute Optimizer)
☐ Savings Plans purchased
☐ Modernization candidates prioritized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Migrating an enterprise to AWS is a disciplined program:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assess&lt;/strong&gt; — Discover the portfolio, map dependencies, assign a strategy (one of the 7 Rs) per app, build the business case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobilize&lt;/strong&gt; — Landing zone, connectivity, security baseline, pilot migration, wave planning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate&lt;/strong&gt; — Migration Hub as command center; MGN for rehost, DMS+SCT for databases, EVS for VMware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modernize&lt;/strong&gt; — Optimize and refactor the applications that justify the investment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The strategic truth:&lt;/strong&gt; You can't refactor everything, and you shouldn't try. Rehost the bulk to exit the data center on time, then modernize selectively where it delivers business value. "Move then improve" beats "perfect then move" every time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in cloud migration and AWS infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>migration</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AWS Secrets Management: Secrets Manager vs Parameter Store vs KMS — The Complete Decision Guide</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Thu, 03 Sep 2026 08:36:16 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-secrets-management-secrets-manager-vs-parameter-store-vs-kms-the-complete-decision-guide-3j71</link>
      <guid>https://dev.to/alpeshkumbhare/aws-secrets-management-secrets-manager-vs-parameter-store-vs-kms-the-complete-decision-guide-3j71</guid>
      <description>&lt;p&gt;Secrets management is one of those decisions you make on day zero and regret in month six if you get it wrong. Pick the wrong store and you'll either rewrite your bootstrap code later or pay thousands a year for configuration that could have been stored for free.&lt;/p&gt;

&lt;p&gt;AWS gives you two primary stores — &lt;strong&gt;Secrets Manager&lt;/strong&gt; and &lt;strong&gt;Systems Manager Parameter Store&lt;/strong&gt; — plus &lt;strong&gt;KMS&lt;/strong&gt; underpinning both. They overlap enough to be confusing but differ enough that the choice matters. This guide breaks down when to use each, with cost, rotation, and access patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Distinction
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────┐
│  SECRETS MANAGER          │  PARAMETER STORE (SSM)                 │
│                           │                                        │
│  Purpose-built for        │  General-purpose config store          │
│  SECRETS that rotate      │  that ALSO holds secrets               │
│                           │                                        │
│  • Automatic rotation     │  • Free standard tier                  │
│  • Cross-region replica   │  • Config + secrets together           │
│  • Cross-account sharing  │  • Hierarchical paths                  │
│  • ~$0.40/secret/month    │  • SecureString via KMS                │
│  • Built-in DB integration│  • No native rotation                  │
└──────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One-line rule:&lt;/strong&gt; If it needs to &lt;strong&gt;rotate&lt;/strong&gt;, use Secrets Manager. If it's &lt;strong&gt;configuration&lt;/strong&gt; (even encrypted config), use Parameter Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Decision Matrix
&lt;/h2&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;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database credentials with auto-rotation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API keys that must rotate on schedule&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region secret replication&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account secret sharing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application config (URLs, feature flags)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parameter Store (Standard)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static secrets that rarely change&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parameter Store (SecureString)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier / cost-sensitive&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parameter Store (Standard)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large parameters (up to 8KB)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parameter Store (Advanced)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption keys themselves&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;KMS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  AWS Secrets Manager
&lt;/h2&gt;

&lt;p&gt;Purpose-built for secrets that need lifecycle management — rotation, replication, and controlled sharing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Capabilities
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic rotation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda-driven rotation on a schedule (built-in support for RDS, Aurora, Redshift, DocumentDB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-region replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replicate secrets to other regions for DR and low-latency access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-account access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource policies allow sharing secrets across accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version staging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWSCURRENT / AWSPENDING / AWSPREVIOUS labels for safe rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KMS encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All secrets encrypted with KMS (customer-managed or AWS-managed key)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fine-grained IAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control access per secret via IAM + resource policies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Automatic Rotation
&lt;/h3&gt;

&lt;p&gt;This is the killer feature. For supported databases, Secrets Manager handles the entire rotation dance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rotation schedule triggers (e.g., every 30 days)
    │
    ▼
Lambda rotation function:
  1. Create new credential (AWSPENDING)
  2. Update credential in the database
  3. Test new credential works
  4. Mark new credential AWSCURRENT
  5. Old credential → AWSPREVIOUS (grace period)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applications always request &lt;code&gt;AWSCURRENT&lt;/code&gt; — they get the latest valid credential without knowing rotation happened.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieving a Secret
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;client&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;secretsmanager&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_secret_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SecretId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod/db/credentials&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&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;SecretString&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# Use secret['username'], secret['password']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best practice:&lt;/strong&gt; Cache the secret (SDK caching library or Lambda extension) — don't call &lt;code&gt;get_secret_value&lt;/code&gt; on every request. It's an API call with cost and latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$0.40 per secret per month&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$0.05 per 10,000 API calls&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At 100 secrets, that's ~$40/month before API calls. This adds up — which is why you shouldn't put non-rotating config here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Systems Manager Parameter Store
&lt;/h2&gt;

&lt;p&gt;A general-purpose hierarchical store for configuration and secrets. The free standard tier makes it the default home for anything that doesn't need rotation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parameter Types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Encrypted&lt;/th&gt;
&lt;th&gt;Use For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;String&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Plain config (URLs, region names, feature flags)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;StringList&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Comma-separated lists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SecureString&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (KMS)&lt;/td&gt;
&lt;td&gt;Secrets that don't need auto-rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Standard vs Advanced Tier
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard&lt;/th&gt;
&lt;th&gt;Advanced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.05/parameter/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max parameters&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max value size&lt;/td&gt;
&lt;td&gt;4 KB&lt;/td&gt;
&lt;td&gt;8 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter policies (expiration, notification)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Higher throughput&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Hierarchical Organization
&lt;/h3&gt;

&lt;p&gt;Parameter Store shines with path-based hierarchies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/myapp/prod/db/host
/myapp/prod/db/port
/myapp/prod/api/endpoint
/myapp/staging/db/host
/myapp/dev/db/host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch an entire branch with one call:&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;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;ssm&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;ssm&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_parameters_by_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/myapp/prod/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Recursive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;WithDecryption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Returns all prod parameters in one call
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Retrieving a Parameter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;ssm&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;ssm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;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;/myapp/prod/db/password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;WithDecryption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# decrypts SecureString via KMS
&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Parameter&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;Value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Secrets Manager vs Parameter Store: Side by Side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Secrets Manager&lt;/th&gt;
&lt;th&gt;Parameter Store&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secrets with lifecycle&lt;/td&gt;
&lt;td&gt;Config + secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic rotation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ (DIY with Lambda + EventBridge)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.40/secret/month&lt;/td&gt;
&lt;td&gt;Free (Standard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-region replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;td&gt;❌ (manual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Resource policies&lt;/td&gt;
&lt;td&gt;✅ (via RAM / advanced)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max value size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;64 KB&lt;/td&gt;
&lt;td&gt;4 KB (Std) / 8 KB (Adv)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version history&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Staging labels&lt;/td&gt;
&lt;td&gt;✅ Version numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DB integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ RDS/Aurora/Redshift/DocDB&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hierarchical paths&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ (naming convention only)&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KMS encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Always&lt;/td&gt;
&lt;td&gt;✅ (SecureString only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where KMS Fits
&lt;/h2&gt;

&lt;p&gt;KMS (Key Management Service) is the &lt;strong&gt;encryption layer underneath both&lt;/strong&gt; — it doesn't store secrets, it manages the keys that encrypt them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│  Secrets Manager / Parameter Store (SecureString) │
│         │                                         │
│         │ encrypts secret value using...          │
│         ▼                                         │
│      KMS Key (customer-managed or AWS-managed)    │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When You Interact With KMS Directly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Envelope encryption&lt;/strong&gt; for your own data (encrypt files, EBS, S3 objects)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key policies&lt;/strong&gt; controlling who can decrypt (even admins can be excluded)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-account key sharing&lt;/strong&gt; for shared encrypted resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit&lt;/strong&gt; — every decrypt operation logged to CloudTrail&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KMS vs CloudHSM
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;KMS&lt;/th&gt;
&lt;th&gt;CloudHSM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Fully managed&lt;/td&gt;
&lt;td&gt;You manage the HSM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tenancy&lt;/td&gt;
&lt;td&gt;Multi-tenant (FIPS 140-2 L3 available)&lt;/td&gt;
&lt;td&gt;Single-tenant dedicated HSM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;99% of encryption needs&lt;/td&gt;
&lt;td&gt;Strict compliance requiring dedicated hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Per key + per request&lt;/td&gt;
&lt;td&gt;Per HSM hour (expensive)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Use KMS unless a specific regulation mandates dedicated single-tenant HSMs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Access Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For EC2 / ECS / EKS
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;IAM roles&lt;/strong&gt; (instance profile, task role, IRSA) — never hardcode credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application → assumes IAM role → role has secretsmanager:GetSecretValue
           → on specific secret ARN only (least privilege)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For EKS Specifically
&lt;/h3&gt;

&lt;p&gt;Two clean patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;External Secrets Operator&lt;/strong&gt; — syncs Secrets Manager / Parameter Store into Kubernetes secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets Store CSI Driver&lt;/strong&gt; — mounts secrets directly into pods as volumes (never stored in etcd)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  For Lambda
&lt;/h3&gt;

&lt;p&gt;Use the &lt;strong&gt;Parameters and Secrets Lambda Extension&lt;/strong&gt; — caches secrets locally, reducing API calls and latency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lambda → localhost:2773 (extension cache) → Secrets Manager (only on cache miss)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cost Optimization
&lt;/h2&gt;

&lt;p&gt;The most common mistake: storing everything in Secrets Manager.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Wrong (costly)&lt;/th&gt;
&lt;th&gt;Right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200 app config values&lt;/td&gt;
&lt;td&gt;200 × $0.40 = $80/month in Secrets Manager&lt;/td&gt;
&lt;td&gt;Parameter Store Standard = &lt;strong&gt;free&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 database passwords (rotating)&lt;/td&gt;
&lt;td&gt;Parameter Store + custom rotation Lambda (fragile)&lt;/td&gt;
&lt;td&gt;Secrets Manager = $2/month + reliable rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags&lt;/td&gt;
&lt;td&gt;Secrets Manager&lt;/td&gt;
&lt;td&gt;Parameter Store or AppConfig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS private keys&lt;/td&gt;
&lt;td&gt;Parameter Store SecureString&lt;/td&gt;
&lt;td&gt;Secrets Manager (needs rotation) or ACM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Strategy:&lt;/strong&gt; Config → Parameter Store (free). Rotating secrets → Secrets Manager (worth the cost). Non-rotating secrets → Parameter Store SecureString.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rotation Without Secrets Manager
&lt;/h2&gt;

&lt;p&gt;If you must rotate a Parameter Store secret (to save cost), build it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Scheduler (every 30 days)
    │
    ▼
Lambda rotation function:
  1. Generate new credential
  2. Update the target system
  3. Update Parameter Store SecureString
  4. Notify dependents (or they poll)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But honestly — if you need reliable rotation, Secrets Manager's $0.40/month is cheaper than maintaining this yourself. Only DIY when you have many secrets and rotation is simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Everything in Secrets Manager&lt;/td&gt;
&lt;td&gt;Paying $0.40/month for static config&lt;/td&gt;
&lt;td&gt;Config → Parameter Store (free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardcoded secrets in code/env vars&lt;/td&gt;
&lt;td&gt;Exposure risk, no rotation&lt;/td&gt;
&lt;td&gt;IAM role + Secrets Manager/Parameter Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calling GetSecretValue every request&lt;/td&gt;
&lt;td&gt;Latency + API cost&lt;/td&gt;
&lt;td&gt;Cache (SDK caching or Lambda extension)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No least-privilege on secret access&lt;/td&gt;
&lt;td&gt;Any role can read all secrets&lt;/td&gt;
&lt;td&gt;Scope IAM to specific secret ARNs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SecureString for rotating DB creds&lt;/td&gt;
&lt;td&gt;Manual rotation is fragile&lt;/td&gt;
&lt;td&gt;Secrets Manager with auto-rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No CloudTrail on secret access&lt;/td&gt;
&lt;td&gt;Can't audit who read what&lt;/td&gt;
&lt;td&gt;Enable CloudTrail (both services log)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Committing secrets to Git&lt;/td&gt;
&lt;td&gt;Permanent exposure&lt;/td&gt;
&lt;td&gt;git-secrets pre-commit + rotate immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Decision Flowchart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START
  │
  ├── Is it an encryption KEY (not a secret value)?
  │     └── YES → KMS (or CloudHSM if dedicated HSM required)
  │
  ├── Does it need automatic rotation?
  │     └── YES → Secrets Manager
  │
  ├── Is it a database credential (RDS/Aurora/Redshift/DocDB)?
  │     └── YES → Secrets Manager (native integration)
  │
  ├── Does it need cross-region replication?
  │     └── YES → Secrets Manager
  │
  ├── Is it a secret that rarely/never rotates?
  │     └── YES → Parameter Store (SecureString)
  │
  └── Is it plain configuration?
        └── YES → Parameter Store (String, Standard tier — free)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AWS secrets management comes down to matching the store to the need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Secrets Manager&lt;/strong&gt; — rotating secrets, database credentials, cross-region/cross-account. Worth $0.40/secret/month for the rotation and integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter Store&lt;/strong&gt; — configuration and static secrets. Free standard tier makes it the default for anything not rotating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KMS&lt;/strong&gt; — the encryption layer under both. Direct use for envelope encryption and key policies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The guiding principle:&lt;/strong&gt; Don't pay Secrets Manager prices for Parameter Store problems. Config and static values go in Parameter Store (free). Reserve Secrets Manager for what actually needs rotation, replication, or database integration. And never — ever — hardcode secrets in code or environment variables when an IAM role + managed store does it securely.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS security architecture and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>devops</category>
      <category>secrets</category>
    </item>
    <item>
      <title>EKS Production Hardening Guide: Security, Karpenter, Cost, and Upgrades for Real-World Kubernetes</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Mon, 31 Aug 2026 06:27:45 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/eks-production-hardening-guide-security-karpenter-cost-and-upgrades-for-real-world-kubernetes-1c5e</link>
      <guid>https://dev.to/alpeshkumbhare/eks-production-hardening-guide-security-karpenter-cost-and-upgrades-for-real-world-kubernetes-1c5e</guid>
      <description>&lt;p&gt;Spinning up an EKS cluster takes 20 minutes. Running one in production without incidents takes a lot more. The gap between "it works in the demo" and "it survives Black Friday" is filled with security hardening, intelligent autoscaling, cost discipline, and upgrade strategy.&lt;/p&gt;

&lt;p&gt;This guide covers the production-readiness checklist for EKS: the security controls, the Karpenter setup, the cost optimization, and the day-2 operations that keep clusters healthy at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The EKS Shared Responsibility Model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  AWS MANAGES (Control Plane)                                     │
│  • Kubernetes API server, etcd, scheduler, controller manager    │
│  • Control plane HA across 3 AZs                                 │
│  • Control plane patching and availability                       │
├─────────────────────────────────────────────────────────────────┤
│  YOU MANAGE (Data Plane + Config)                                │
│  • Worker nodes (or use EKS Auto Mode / Fargate)                 │
│  • Pod security, network policies, RBAC                          │
│  • Secrets management, image scanning                            │
│  • Add-ons, upgrades, cost optimization                          │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 1: Security Hardening
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. RBAC and Least Privilege
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Default deny → Grant specific permissions per role

├── Developers: read pods/logs in their namespace only
├── CI/CD: deploy to specific namespaces
├── Platform team: cluster-admin (limited members)
└── Applications: ServiceAccount with minimal permissions (IRSA)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IRSA (IAM Roles for Service Accounts):&lt;/strong&gt; Map Kubernetes ServiceAccounts to IAM roles. Pods get AWS permissions without node-level credentials.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3-reader&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;eks.amazonaws.com/role-arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789:role/s3-read-role&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;EKS Pod Identity&lt;/strong&gt; (newer alternative to IRSA): simpler association, no OIDC trust policy management.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Network Policies (Default Deny)
&lt;/h3&gt;

&lt;p&gt;By default, all pods can talk to all pods. Lock it down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default-deny-all&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;policyTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Egress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then explicitly allow required traffic. Use the VPC CNI network policy support or Cilium for enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Secrets Encryption
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Envelope encryption:&lt;/strong&gt; Encrypt Kubernetes secrets in etcd using KMS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External Secrets Operator:&lt;/strong&gt; Sync from Secrets Manager / Parameter Store (don't store secrets in etcd at all)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never&lt;/strong&gt; commit secrets to Git or bake into images
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# EKS cluster with KMS envelope encryption&lt;/span&gt;
&lt;span class="na"&gt;encryptionConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secrets"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;keyArn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:kms:eu-west-1:123456789:key/xxx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Pod Security Standards
&lt;/h3&gt;

&lt;p&gt;Enforce Pod Security Admission (replaces deprecated PodSecurityPolicy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Namespace&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;pod-security.kubernetes.io/enforce&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restricted&lt;/span&gt;
    &lt;span class="na"&gt;pod-security.kubernetes.io/warn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restricted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;restricted&lt;/code&gt; prevents: privileged containers, host namespace access, running as root, privilege escalation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Image Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ECR image scanning:&lt;/strong&gt; Scan on push, block deploy on critical CVEs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image signing:&lt;/strong&gt; Cosign/Notation for supply chain integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admission control:&lt;/strong&gt; Kyverno or OPA Gatekeeper to enforce policies (only signed images, no &lt;code&gt;:latest&lt;/code&gt;, resource limits required)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Control Plane Logging
&lt;/h3&gt;

&lt;p&gt;Enable all control plane log types → CloudWatch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api | audit | authenticator | controllerManager | scheduler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;audit log&lt;/strong&gt; is critical for security forensics — it records every API call to the cluster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Karpenter for Intelligent Compute
&lt;/h2&gt;

&lt;p&gt;Karpenter replaced Cluster Autoscaler as the production standard. It provisions right-sized nodes in seconds based on actual pod requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Karpenter Over Cluster Autoscaler
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Cluster Autoscaler&lt;/th&gt;
&lt;th&gt;Karpenter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node selection&lt;/td&gt;
&lt;td&gt;Fixed node groups&lt;/td&gt;
&lt;td&gt;Dynamic, picks optimal instance type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bin packing&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Intelligent consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spot handling&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Advanced (diversification, interruption)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instance flexibility&lt;/td&gt;
&lt;td&gt;Per node group&lt;/td&gt;
&lt;td&gt;Any instance matching constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Karpenter NodePool (v1 API)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;karpenter.sh/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePool&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;karpenter.sh/capacity-type&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;In&lt;/span&gt;
          &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spot"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on-demand"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubernetes.io/arch&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;In&lt;/span&gt;
          &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arm64"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amd64"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Graviton + x86&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;karpenter.k8s.aws/instance-category&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;In&lt;/span&gt;
          &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;m"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;nodeClassRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;disruption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;consolidationPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;WhenEmptyOrUnderutilized&lt;/span&gt;
    &lt;span class="na"&gt;consolidateAfter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Karpenter Production Best Practices
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SQS interruption handling&lt;/strong&gt; — configure Spot interruption queue so Karpenter drains nodes gracefully (2-min warning)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NodePool isolation&lt;/strong&gt; — separate NodePools for system vs application workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disruption budgets&lt;/strong&gt; — limit how many nodes Karpenter can consolidate at once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AMI pinning&lt;/strong&gt; — pin AMI versions for predictable upgrades (don't auto-update)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation&lt;/strong&gt; — enable to bin-pack workloads and reduce node count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diversification&lt;/strong&gt; — allow multiple instance types to survive Spot interruptions&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Part 3: Cost Optimization
&lt;/h2&gt;

&lt;p&gt;EKS costs can spiral. Here's how to control them:&lt;/p&gt;

&lt;h3&gt;
  
  
  Compute Cost Levers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lever&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Karpenter consolidation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30-50% (bin-packing eliminates waste)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot for stateless workloads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 90% vs On-Demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graviton (arm64) nodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20-40% better price/performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Savings Plans for baseline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 72% for steady-state On-Demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Right-size pod requests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents over-provisioning nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Baseline + Burst Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Baseline (predictable load)  → On-Demand + Savings Plans (cost-committed)
Burst (variable load)        → Spot Instances (cheap, interruptible)
Critical system pods         → On-Demand (never interrupted)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Right-Sizing Pod Requests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;250m&lt;/span&gt;      &lt;span class="c1"&gt;# What the pod actually needs (from metrics)&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;   &lt;span class="c1"&gt;# Prevent OOM affecting neighbors&lt;/span&gt;
    &lt;span class="c1"&gt;# No CPU limit — let it burst (CPU is compressible)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Over-requesting CPU/memory forces Karpenter to provision more/bigger nodes. Use VPA recommendations or metrics to right-size requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminate NAT Gateway Costs
&lt;/h3&gt;

&lt;p&gt;Route AWS API traffic through VPC endpoints (Gateway endpoints for S3/DynamoDB are free):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without VPC endpoints: Pod → NAT Gateway ($0.045/GB) → S3
With VPC endpoints:    Pod → S3 Gateway Endpoint ($0) → S3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 4: Networking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  VPC CNI Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prefix delegation&lt;/strong&gt; — assign /28 prefixes to ENIs (more pods per node)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom networking&lt;/strong&gt; — pods in separate subnets from nodes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security groups for pods&lt;/strong&gt; — apply SGs at pod level (not just node)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ingress and Load Balancing
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Use For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Load Balancer Controller&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ALB (L7) or NLB (L4) for ingress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ingress (ALB)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP/HTTPS routing, path-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gateway API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modern replacement for Ingress (more expressive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Lattice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-cluster service mesh with IAM auth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Service Mesh (When Needed)
&lt;/h3&gt;

&lt;p&gt;Don't add a service mesh by default. Add Istio/Linkerd only when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mTLS between all services&lt;/li&gt;
&lt;li&gt;Advanced traffic management (retries, circuit breaking)&lt;/li&gt;
&lt;li&gt;Detailed L7 observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For simpler needs, VPC Lattice or App Mesh may suffice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: Observability
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Metrics  → CloudWatch Container Insights + Prometheus (Managed Prometheus)
Logs     → Fluent Bit → CloudWatch Logs / OpenSearch
Traces   → ADOT (OpenTelemetry) → X-Ray
Dashboards → Managed Grafana
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Essential Metrics to Monitor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node CPU/memory pressure&lt;/li&gt;
&lt;li&gt;Pod restart counts (crash loops)&lt;/li&gt;
&lt;li&gt;Pending pods (capacity issues)&lt;/li&gt;
&lt;li&gt;Karpenter provisioning latency&lt;/li&gt;
&lt;li&gt;Persistent volume usage&lt;/li&gt;
&lt;li&gt;API server latency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 6: Upgrades
&lt;/h2&gt;

&lt;p&gt;EKS supports Kubernetes versions for ~14 months. Plan upgrades:&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrade Strategy
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the changelog&lt;/strong&gt; — check for deprecated APIs (use &lt;code&gt;kubent&lt;/code&gt; / Pluto to find them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade control plane first&lt;/strong&gt; — AWS handles this (one minor version at a time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade add-ons&lt;/strong&gt; — VPC CNI, CoreDNS, kube-proxy must be compatible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade nodes&lt;/strong&gt; — rolling replacement (Karpenter makes this easy — drain + provision new AMI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test in non-prod first&lt;/strong&gt; — always&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  EKS Auto Mode (Simplify Everything)
&lt;/h3&gt;

&lt;p&gt;EKS Auto Mode (GA) manages compute, scaling, and upgrades automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS manages node provisioning, patching, and Karpenter under the hood&lt;/li&gt;
&lt;li&gt;You focus on workloads, not infrastructure&lt;/li&gt;
&lt;li&gt;Trade-off: less control, slightly higher cost, but dramatically less ops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Consider Auto Mode when:&lt;/strong&gt; small platform team, want minimal Kubernetes ops overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 7: Resilience
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backup and DR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Velero&lt;/strong&gt; — backup cluster state and persistent volumes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-AZ&lt;/strong&gt; — spread nodes across 3 AZs (Karpenter handles this)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pod Disruption Budgets&lt;/strong&gt; — ensure minimum replicas during disruptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-region DR&lt;/strong&gt; — GitOps (ArgoCD) redeploys to DR cluster from Git&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pod Disruption Budget
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;policy/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PodDisruptionBudget&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-pdb&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minAvailable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensures at least 2 API pods stay running during node drains/upgrades.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production Readiness Checklist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SECURITY
☐ RBAC with least privilege
☐ IRSA / Pod Identity (no node-level AWS creds)
☐ Default-deny NetworkPolicy per namespace
☐ Secrets encrypted (KMS envelope or External Secrets)
☐ Pod Security Standards (restricted)
☐ ECR image scanning + admission control
☐ Control plane audit logging enabled

COMPUTE
☐ Karpenter with Spot + On-Demand + Graviton
☐ SQS interruption handling
☐ Consolidation enabled
☐ Right-sized pod requests

COST
☐ VPC endpoints (eliminate NAT charges)
☐ Savings Plans for baseline
☐ Spot for stateless workloads

OBSERVABILITY
☐ Container Insights + Prometheus
☐ Centralized logging (Fluent Bit)
☐ Distributed tracing (ADOT)

RESILIENCE
☐ Multi-AZ node distribution
☐ Pod Disruption Budgets
☐ Velero backups
☐ Tested upgrade path

GITOPS
☐ ArgoCD / Flux for declarative deployments
☐ All cluster config in Git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common EKS Production Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No resource requests/limits&lt;/td&gt;
&lt;td&gt;Node overcommit, OOM kills&lt;/td&gt;
&lt;td&gt;Set requests based on metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All traffic through NAT Gateway&lt;/td&gt;
&lt;td&gt;High data processing costs&lt;/td&gt;
&lt;td&gt;VPC endpoints for S3/DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No NetworkPolicy&lt;/td&gt;
&lt;td&gt;Lateral movement if breached&lt;/td&gt;
&lt;td&gt;Default-deny + explicit allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node-level IAM credentials&lt;/td&gt;
&lt;td&gt;Over-privileged pods&lt;/td&gt;
&lt;td&gt;IRSA / Pod Identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Autoscaler (legacy)&lt;/td&gt;
&lt;td&gt;Slow, inefficient scaling&lt;/td&gt;
&lt;td&gt;Migrate to Karpenter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No PDB&lt;/td&gt;
&lt;td&gt;Outages during upgrades&lt;/td&gt;
&lt;td&gt;Pod Disruption Budgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring version support window&lt;/td&gt;
&lt;td&gt;Forced emergency upgrades&lt;/td&gt;
&lt;td&gt;Scheduled upgrade cadence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets in etcd unencrypted&lt;/td&gt;
&lt;td&gt;Exposure risk&lt;/td&gt;
&lt;td&gt;KMS envelope encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Production EKS comes down to seven pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — RBAC, IRSA, NetworkPolicies, Pod Security Standards, image scanning, audit logging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute&lt;/strong&gt; — Karpenter with Spot + On-Demand + Graviton, intelligent consolidation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — VPC endpoints, Savings Plans, Spot, right-sized requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking&lt;/strong&gt; — VPC CNI tuning, ALB Controller, Gateway API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; — Container Insights, Prometheus, ADOT tracing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrades&lt;/strong&gt; — scheduled cadence, add-on compatibility, or EKS Auto Mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience&lt;/strong&gt; — multi-AZ, PDBs, Velero backups, GitOps&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your team is small and Kubernetes ops is a burden, seriously evaluate &lt;strong&gt;EKS Auto Mode&lt;/strong&gt; — it handles most of the compute, scaling, and upgrade complexity so you can focus on workloads.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in Kubernetes, container platforms, and AWS infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kubernetes</category>
      <category>eks</category>
      <category>devops</category>
    </item>
    <item>
      <title>Building a Modern Data Lakehouse on AWS: S3, Iceberg, Glue, Athena, and Lake Formation</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:15:51 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/building-a-modern-data-lakehouse-on-aws-s3-iceberg-glue-athena-and-lake-formation-1lel</link>
      <guid>https://dev.to/alpeshkumbhare/building-a-modern-data-lakehouse-on-aws-s3-iceberg-glue-athena-and-lake-formation-1lel</guid>
      <description>&lt;p&gt;The data lakehouse has become the default architecture for analytics on AWS in 2026. It combines the best of both worlds: the low-cost, schema-flexible storage of a data lake (S3) with the performance, ACID transactions, and governance of a data warehouse — without actually running a warehouse for most workloads.&lt;/p&gt;

&lt;p&gt;The enabling technology: &lt;strong&gt;Apache Iceberg&lt;/strong&gt; — an open table format that brings SQL-like capabilities (INSERT, UPDATE, DELETE, time travel) to files sitting in S3. Combined with AWS Glue for ETL, Athena for queries, and Lake Formation for governance, you get a complete analytics platform without managing servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lake vs Data Warehouse vs Lakehouse
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────┐  ┌──────────────────┐  ┌──────────────────────────┐
│   DATA LAKE      │  │  DATA WAREHOUSE  │  │     DATA LAKEHOUSE       │
│                  │  │                  │  │                          │
│ ✅ Cheap storage │  │ ✅ Fast queries   │  │ ✅ Cheap storage (S3)    │
│ ✅ Schema-on-read│  │ ✅ ACID txns     │  │ ✅ Fast queries (Iceberg)│
│ ✅ Any format    │  │ ✅ Governance    │  │ ✅ ACID transactions     │
│ ❌ No ACID       │  │ ❌ Expensive     │  │ ✅ Governance (LF)       │
│ ❌ No updates    │  │ ❌ Vendor lock-in│  │ ✅ Open format           │
│ ❌ Stale data    │  │ ❌ Schema-rigid  │  │ ✅ Schema evolution      │
│                  │  │                  │  │ ✅ Time travel           │
│  (S3 + Parquet)  │  │  (Redshift)      │  │ (S3 + Iceberg + Athena) │
└──────────────────┘  └──────────────────┘  └──────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The AWS Lakehouse Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────┐
│                         CONSUMPTION                                   │
│  Athena (SQL) | Redshift Spectrum | EMR (Spark) | QuickSight (BI)   │
├─────────────────────────────────────────────────────────────────────┤
│                         GOVERNANCE                                    │
│  Lake Formation (permissions, audit) | Glue Data Catalog (metadata) │
├─────────────────────────────────────────────────────────────────────┤
│                         TABLE FORMAT                                  │
│  Apache Iceberg (ACID, time travel, schema evolution, compaction)    │
├─────────────────────────────────────────────────────────────────────┤
│                         PROCESSING                                    │
│  Glue ETL (Spark) | Glue Streaming | EMR | Zero-ETL | Firehose     │
├─────────────────────────────────────────────────────────────────────┤
│                         INGESTION                                     │
│  Kinesis | DMS | AppFlow | S3 Transfer | Direct PUT                 │
├─────────────────────────────────────────────────────────────────────┤
│                         STORAGE                                       │
│  Amazon S3 (raw / curated / analytics zones)                         │
└─────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Apache Iceberg: The Game Changer
&lt;/h2&gt;

&lt;p&gt;Iceberg is an open table format that sits between your query engine and S3 files. It enables data warehouse capabilities on data lake storage:&lt;/p&gt;

&lt;h3&gt;
  
  
  What Iceberg Adds to S3
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Without Iceberg (Parquet on S3)&lt;/th&gt;
&lt;th&gt;With Iceberg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INSERT/UPDATE/DELETE&lt;/td&gt;
&lt;td&gt;❌ Append-only&lt;/td&gt;
&lt;td&gt;✅ Row-level operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACID transactions&lt;/td&gt;
&lt;td&gt;❌ Partial writes possible&lt;/td&gt;
&lt;td&gt;✅ Atomic commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema evolution&lt;/td&gt;
&lt;td&gt;❌ Break consumers&lt;/td&gt;
&lt;td&gt;✅ Add/rename/drop columns safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time travel&lt;/td&gt;
&lt;td&gt;❌ No history&lt;/td&gt;
&lt;td&gt;✅ Query any past snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partition evolution&lt;/td&gt;
&lt;td&gt;❌ Rewrite all data&lt;/td&gt;
&lt;td&gt;✅ Change partitioning without rewrite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden partitioning&lt;/td&gt;
&lt;td&gt;❌ User must know partition scheme&lt;/td&gt;
&lt;td&gt;✅ Engine handles automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent writes&lt;/td&gt;
&lt;td&gt;❌ Last write wins&lt;/td&gt;
&lt;td&gt;✅ Optimistic concurrency control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Iceberg on AWS: Service Support
&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;Iceberg Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Athena&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full read/write (CREATE TABLE, INSERT, UPDATE, DELETE, MERGE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue ETL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full read/write via Spark connector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EMR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full support (Spark, Trino, Flink)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redshift Spectrum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read access to Iceberg tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Data Catalog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native Iceberg catalog integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lake Formation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine-grained access control on Iceberg tables&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Creating an Iceberg Table (Athena)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;PARTITIONED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;LOCATION&lt;/span&gt; &lt;span class="s1"&gt;'s3://my-lakehouse/analytics/orders/'&lt;/span&gt;
&lt;span class="n"&gt;TBLPROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'table_type'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ICEBERG'&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;Note:&lt;/strong&gt; &lt;code&gt;month(order_date)&lt;/code&gt; is hidden partitioning — queries don't need to know the partition scheme. Iceberg handles pruning automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Row-Level Operations
&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;-- Update order status&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'shipped'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ORD-12345'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Delete cancelled orders older than 1 year&lt;/span&gt;
&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'cancelled'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;current_timestamp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt; &lt;span class="nb"&gt;year&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Merge (upsert) from staging&lt;/span&gt;
&lt;span class="n"&gt;MERGE&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_orders&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;
&lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;MATCHED&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;MATCHED&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Time Travel
&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;-- Query data as it was 24 hours ago&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;OF&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;current_timestamp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'24'&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Query a specific snapshot&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;VERSION&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;OF&lt;/span&gt; &lt;span class="mi"&gt;12345678901234&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- View snapshot history&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;"analytics"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;"orders$snapshots"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Data Lake Zones: Organizing Your S3 Storage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3://company-lakehouse/
├── raw/                    ← Landing zone (source format, immutable)
│   ├── crm/
│   ├── erp/
│   └── clickstream/
│
├── curated/                ← Cleaned, validated, Iceberg format
│   ├── customers/
│   ├── orders/
│   └── products/
│
└── analytics/              ← Aggregated, business-ready
    ├── daily_revenue/
    ├── customer_360/
    └── product_performance/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Access&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Source format (JSON, CSV, Parquet)&lt;/td&gt;
&lt;td&gt;Immutable landing zone, audit trail&lt;/td&gt;
&lt;td&gt;Data engineers only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Iceberg (optimized Parquet)&lt;/td&gt;
&lt;td&gt;Cleaned, validated, single source of truth&lt;/td&gt;
&lt;td&gt;Data engineers + analysts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Iceberg (aggregated)&lt;/td&gt;
&lt;td&gt;Business-ready datasets, dashboards&lt;/td&gt;
&lt;td&gt;Analysts + BI tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  AWS Glue: The ETL Engine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Glue Components
&lt;/h3&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;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Data Catalog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centralized metadata (databases, tables, schemas) — the "card catalog"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue ETL Jobs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spark-based data transformation (Python/Scala)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Crawlers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-discover schemas from S3 data, populate catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Studio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual ETL designer (no-code/low-code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Streaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Near-real-time ETL from Kinesis/Kafka/MSK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Glue Data Quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define and enforce quality rules on datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Glue ETL Job: Raw → Curated (Iceberg)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;awsglue.transforms&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;awsglue.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GlueContext&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SparkContext&lt;/span&gt;

&lt;span class="n"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SparkContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;glueContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GlueContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glueContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spark_session&lt;/span&gt;

&lt;span class="c1"&gt;# Read raw data
&lt;/span&gt;&lt;span class="n"&gt;raw_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3://company-lakehouse/raw/orders/2026/08/25/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Transform: clean, validate, enrich
&lt;/span&gt;&lt;span class="n"&gt;curated_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_df&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isNotNull&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;to_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_date_str&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="nf"&gt;withColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;decimal(10,2)&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="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_date_str&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;_metadata&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="c1"&gt;# Write to Iceberg table (append or merge)
&lt;/span&gt;&lt;span class="n"&gt;curated_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glue_catalog.curated.orders&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="nf"&gt;using&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iceberg&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="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lake Formation: Governance Layer
&lt;/h2&gt;

&lt;p&gt;Lake Formation provides fine-grained access control — column-level and row-level security on your lakehouse:&lt;/p&gt;

&lt;h3&gt;
  
  
  Permission Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lake Formation Permissions:
├── Database-level: Who can see which databases?
├── Table-level: Who can query which tables?
├── Column-level: Who can see which columns? (mask PII)
└── Row-level: Who can see which rows? (data filters by region/team)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Row-Level Security Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Policy: "EU Data Residency"
├── Principal: EU-Analytics-Team
├── Table: curated.customers
├── Filter: region IN ('eu-west-1', 'eu-central-1')
└── Effect: Team can ONLY see EU customers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tag-Based Access Control (LF-TBAC)
&lt;/h3&gt;

&lt;p&gt;Instead of managing permissions per table, assign tags and grant access by tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tag: classification = "pii"
  → Applied to: customers.email, customers.phone, orders.billing_address
  → Grant: Only "PII-Authorized" group can see these columns
  → Everyone else: columns masked or hidden
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Amazon Athena: Serverless Queries
&lt;/h2&gt;

&lt;p&gt;Athena queries Iceberg tables directly on S3 — no infrastructure to manage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serverless&lt;/strong&gt; — pay per query ($5 per TB scanned)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Federated queries&lt;/strong&gt; — query RDS, DynamoDB, Redshift alongside S3 in one SQL statement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepared statements&lt;/strong&gt; — parameterized queries for applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workgroups&lt;/strong&gt; — separate teams with cost controls and query limits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost Optimization for Athena
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Columnar format (Parquet/ORC via Iceberg)&lt;/td&gt;
&lt;td&gt;30-90% less data scanned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partition pruning (Iceberg hidden partitioning)&lt;/td&gt;
&lt;td&gt;Scan only relevant partitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compression (Snappy/ZSTD)&lt;/td&gt;
&lt;td&gt;50-70% less storage + scan cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CTAS for materialized views&lt;/td&gt;
&lt;td&gt;Pre-compute expensive joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workgroup byte limits&lt;/td&gt;
&lt;td&gt;Prevent runaway queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Zero-ETL Integrations
&lt;/h2&gt;

&lt;p&gt;AWS is pushing "zero-ETL" — direct integration between operational databases and analytics without building ETL pipelines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aurora → Redshift&lt;/td&gt;
&lt;td&gt;Zero-ETL&lt;/td&gt;
&lt;td&gt;Near-real-time replication without Glue jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB → OpenSearch&lt;/td&gt;
&lt;td&gt;Zero-ETL&lt;/td&gt;
&lt;td&gt;Automatic sync for search/analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB → Redshift&lt;/td&gt;
&lt;td&gt;Zero-ETL&lt;/td&gt;
&lt;td&gt;Export DynamoDB data for analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS → S3 (via DMS)&lt;/td&gt;
&lt;td&gt;CDC&lt;/td&gt;
&lt;td&gt;Change data capture for lakehouse ingestion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When Zero-ETL vs Glue ETL
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Zero-ETL when...&lt;/th&gt;
&lt;th&gt;Use Glue ETL when...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source → destination without transformation&lt;/td&gt;
&lt;td&gt;Need data cleansing, validation, enrichment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported source/destination pair&lt;/td&gt;
&lt;td&gt;Custom transformation logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimal latency requirements&lt;/td&gt;
&lt;td&gt;Complex multi-source joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple replication&lt;/td&gt;
&lt;td&gt;Business rule application&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Real-Time Lakehouse Pattern
&lt;/h2&gt;

&lt;p&gt;For near-real-time analytics, combine streaming ingestion with Iceberg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App Events → Kinesis Data Streams → Glue Streaming ETL → Iceberg Table
                                                              │
                                              Athena (queries latest data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Glue Streaming writes micro-batches to Iceberg every 1-5 minutes. Athena queries see near-real-time data without separate real-time infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table Maintenance (Iceberg Housekeeping)
&lt;/h2&gt;

&lt;p&gt;Iceberg tables need periodic maintenance for optimal performance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compaction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Merge small files into larger ones (better query performance)&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expire snapshots&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove old snapshots (reduce metadata overhead + storage)&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remove orphan files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delete files not referenced by any snapshot&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rewrite manifests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optimize manifest file layout&lt;/td&gt;
&lt;td&gt;As needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Athena OPTIMIZE (Compaction)
&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;-- Compact small files for better query performance&lt;/span&gt;
&lt;span class="n"&gt;OPTIMIZE&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;REWRITE&lt;/span&gt; &lt;span class="k"&gt;DATA&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;BIN_PACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Expire old snapshots (keep last 7 days)&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;TBLPROPERTIES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'vacuum_min_snapshots_to_keep'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'vacuum_max_snapshot_age_seconds'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'604800'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;VACUUM&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No partitioning strategy&lt;/td&gt;
&lt;td&gt;Full table scans on every query&lt;/td&gt;
&lt;td&gt;Use Iceberg hidden partitioning (by date, region)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too many small files&lt;/td&gt;
&lt;td&gt;Slow queries, high S3 API costs&lt;/td&gt;
&lt;td&gt;Regular compaction (OPTIMIZE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No snapshot expiry&lt;/td&gt;
&lt;td&gt;Storage costs grow forever&lt;/td&gt;
&lt;td&gt;VACUUM old snapshots weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw zone with no schema validation&lt;/td&gt;
&lt;td&gt;Bad data propagates downstream&lt;/td&gt;
&lt;td&gt;Glue Data Quality rules at ingestion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyone queries raw zone directly&lt;/td&gt;
&lt;td&gt;Inconsistent results, no governance&lt;/td&gt;
&lt;td&gt;Force queries through curated/analytics zones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Column-level security as afterthought&lt;/td&gt;
&lt;td&gt;PII exposed to unauthorized users&lt;/td&gt;
&lt;td&gt;Design Lake Formation tags from day one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redshift for everything&lt;/td&gt;
&lt;td&gt;Expensive for exploratory queries&lt;/td&gt;
&lt;td&gt;Athena for ad-hoc, Redshift for heavy BI only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The modern AWS lakehouse in 2026:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; S3 (cheap, durable, infinitely scalable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table format:&lt;/strong&gt; Apache Iceberg (ACID, time travel, schema evolution, hidden partitioning)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catalog:&lt;/strong&gt; Glue Data Catalog (centralized metadata for all engines)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing:&lt;/strong&gt; Glue ETL (batch + streaming) or Zero-ETL (for supported pairs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query:&lt;/strong&gt; Athena (serverless SQL, pay per scan) + Redshift Spectrum (for heavy BI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance:&lt;/strong&gt; Lake Formation (column/row-level security, tag-based access)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BI:&lt;/strong&gt; QuickSight (serverless dashboards connected to Athena/Redshift)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The key shift:&lt;/strong&gt; You don't need a data warehouse for most analytics anymore. Iceberg on S3 + Athena gives you warehouse-like capabilities at data lake prices. Add Redshift only when you need sub-second complex aggregations on petabytes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS data architecture and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>data</category>
      <category>architecture</category>
      <category>analytics</category>
    </item>
    <item>
      <title>AWS Continuum: AI-Powered Security at Machine Speed — What It Is, How It Works, and Why It Changes AppSec</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Mon, 24 Aug 2026 06:12:14 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-continuum-ai-powered-security-at-machine-speed-what-it-is-how-it-works-and-why-it-changes-nol</link>
      <guid>https://dev.to/alpeshkumbhare/aws-continuum-ai-powered-security-at-machine-speed-what-it-is-how-it-works-and-why-it-changes-nol</guid>
      <description>&lt;p&gt;In June 2026, AWS launched Continuum at AWS Summit NYC — an AI-native security platform that handles the full vulnerability lifecycle: discover, prioritize, validate, and remediate. In August 2026, they expanded it with integrations into Anthropic Claude Code and OpenAI Codex, bringing security intelligence directly into AI-assisted coding workflows.&lt;/p&gt;

&lt;p&gt;This isn't another scanner. It's a security agent that reasons about your environment, confirms what's actually exploitable, and drives toward resolution — at machine speed, within guardrails you define.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is AWS Continuum?
&lt;/h2&gt;

&lt;p&gt;AWS Continuum is an AI-powered security service that manages the full lifecycle of code vulnerabilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────────┐
│                   AWS CONTINUUM LIFECYCLE                            │
│                                                                      │
│  DISCOVER ──→ PRIORITIZE ──→ VALIDATE ──→ REMEDIATE ──→ VERIFY     │
│                                                                      │
│  Find vulns     Rank by       Confirm       Generate      Confirm   │
│  in code,       exploitability exploitable   fix, create   fix works │
│  deps, infra    + blast radius (not just     PR, deploy   (re-test) │
│                               theoretical)                           │
└────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The key differentiator:&lt;/strong&gt; Most scanners find vulnerabilities. Continuum validates whether they're actually exploitable in YOUR environment and context, then fixes them automatically.&lt;/p&gt;

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

&lt;p&gt;Traditional AppSec workflow in 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scanner finds 500 vulnerabilities
  → Security team triages (2 weeks)
    → 80% are false positives or not exploitable
      → 100 actual issues remain
        → Dev team prioritizes (1 week)
          → Fixes deployed over next sprint
            → Total time: 4-6 weeks from detection to fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continuum workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Continuum discovers vulnerabilities
  → AI validates exploitability (minutes)
    → Confirmed issues prioritized by blast radius
      → Automated remediation (PR generated)
        → Developer reviews and merges
          → Total time: hours, not weeks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AWS Continuum Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Continuum for Code Vulnerabilities
&lt;/h3&gt;

&lt;p&gt;The core service — continuous security for your application code and dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery:&lt;/strong&gt; Scans code repositories, dependencies, and container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritization:&lt;/strong&gt; AI ranks by real-world exploitability, not just CVSS score&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Confirms vulnerabilities are reachable in your specific code paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remediation:&lt;/strong&gt; Generates fixes, creates pull requests, monitors deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification:&lt;/strong&gt; Re-tests after fix to confirm resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. AWS Security Agent
&lt;/h3&gt;

&lt;p&gt;A frontier AI agent that performs on-demand penetration testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploys specialized AI agents against your application&lt;/li&gt;
&lt;li&gt;Develops application context from documentation and credentials&lt;/li&gt;
&lt;li&gt;Executes multi-step attack scenarios (like a human pentester)&lt;/li&gt;
&lt;li&gt;Discovers complex vulnerabilities that static scanners miss&lt;/li&gt;
&lt;li&gt;Reports findings with full attack chain documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Continuum + AI Coding Assistants (August 2026)
&lt;/h3&gt;

&lt;p&gt;The latest expansion — security intelligence embedded directly in developer workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code integration:&lt;/strong&gt; Anthropic's AI assistant gets Continuum context when writing/reviewing code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Codex integration:&lt;/strong&gt; Same security intelligence in Codex-powered workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiro integration:&lt;/strong&gt; AWS's own IDE incorporates Continuum findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When AI generates code, Continuum validates it against known vulnerability patterns and your organization's security policies — before it reaches production.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works: Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                    YOUR ENVIRONMENT                               │
│  Code Repos (GitHub, CodeCommit) | Container Images (ECR)        │
│  Running Applications | Infrastructure (CloudFormation/Terraform) │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                    AWS CONTINUUM                                  │
│                                                                   │
│  ┌─────────┐  ┌───────────┐  ┌───────────┐  ┌──────────────┐  │
│  │Discovery│→ │Prioritize │→ │ Validate  │→ │  Remediate   │  │
│  │         │  │           │  │           │  │              │  │
│  │• SAST   │  │• AI triage│  │• Confirm  │  │• Generate fix│  │
│  │• SCA    │  │• Context  │  │  exploit- │  │• Create PR   │  │
│  │• Secrets│  │  aware    │  │  ability  │  │• Auto-deploy │  │
│  │• Config │  │• Blast    │  │• Attack   │  │• Re-verify   │  │
│  │         │  │  radius   │  │  path     │  │              │  │
│  └─────────┘  └───────────┘  └───────────┘  └──────────────┘  │
│                                                                   │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │              GUARDRAILS (You Define)                       │   │
│  │  • What can be auto-fixed vs requires approval            │   │
│  │  • Scope boundaries (which repos, which envs)             │   │
│  │  • Remediation policies (PR review required, staging test)│   │
│  └──────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Capabilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Contextual Prioritization (Not Just CVSS)
&lt;/h3&gt;

&lt;p&gt;Traditional scanners rank by CVSS score. A "Critical 9.8" vulnerability in a library function that's never called in your code is actually zero risk. Continuum uses AI to assess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reachability:&lt;/strong&gt; Is the vulnerable code path actually reachable from your application's entry points?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploitability:&lt;/strong&gt; Given your environment (WAF rules, network config, IAM policies), can this be exploited?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blast radius:&lt;/strong&gt; If exploited, what's the impact? (data exposure, lateral movement, privilege escalation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business context:&lt;/strong&gt; Is this in a production-critical service or a development tool?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automated Validation
&lt;/h3&gt;

&lt;p&gt;Continuum doesn't just report — it confirms. The Security Agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes the vulnerability and your application architecture&lt;/li&gt;
&lt;li&gt;Develops a multi-step attack scenario&lt;/li&gt;
&lt;li&gt;Executes the attack in a controlled manner (like an automated pentester)&lt;/li&gt;
&lt;li&gt;Confirms whether the vulnerability is actually exploitable&lt;/li&gt;
&lt;li&gt;Documents the full attack chain for the development team&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Automated Remediation
&lt;/h3&gt;

&lt;p&gt;For confirmed vulnerabilities, Continuum generates fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependency updates:&lt;/strong&gt; Creates PR updating vulnerable library to patched version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code fixes:&lt;/strong&gt; Generates code patches for application-level vulnerabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration changes:&lt;/strong&gt; Proposes infrastructure configuration remediations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging validation:&lt;/strong&gt; Tests the fix in a staging environment before promoting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All within guardrails you define — you control what gets auto-fixed vs what requires human approval.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integration Points
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Developer Workflow Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer writes code
       │
       ├── In IDE (Claude Code / Codex / Kiro)
       │     └── Continuum provides real-time security feedback
       │
       ├── On Push (GitHub / CodeCommit)
       │     └── Continuum scans changes, comments on PR
       │
       ├── In Pipeline (CodeBuild / GitHub Actions)
       │     └── Continuum gates deployment on security posture
       │
       └── In Production
              └── Continuum continuously monitors, validates, remediates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AWS Service Integration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Integrates With&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PR comments, auto-fix PRs, repository scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeCommit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same as GitHub (native AWS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container image vulnerability scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeBuild&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pipeline gate — block deploy on critical findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Findings forwarded for unified security dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Audit trail of all Continuum actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scoped permissions for what Continuum can access/modify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code / Codex&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time security context during AI-assisted coding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Continuum vs Existing Security Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Continuum Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeGuru Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SAST scanning&lt;/td&gt;
&lt;td&gt;Continuum validates exploitability + auto-remediates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inspector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE scanning for EC2/ECR/Lambda&lt;/td&gt;
&lt;td&gt;Continuum adds AI reasoning about real-world risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GuardDuty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runtime threat detection&lt;/td&gt;
&lt;td&gt;Continuum is proactive (pre-production), GuardDuty is reactive (runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aggregates findings&lt;/td&gt;
&lt;td&gt;Continuum feeds INTO Security Hub with validated findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Third-party SAST (Snyk, Checkmarx)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code scanning&lt;/td&gt;
&lt;td&gt;Continuum adds validation + auto-remediation + AI coding assistant integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Continuum doesn't replace these tools&lt;/strong&gt; — it adds an AI reasoning layer on top. It can consume findings from Inspector, CodeGuru, and third-party scanners, then validate and remediate them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up Continuum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS account with Security Hub enabled&lt;/li&gt;
&lt;li&gt;Code repository connected (GitHub, CodeCommit, GitLab)&lt;/li&gt;
&lt;li&gt;IAM role for Continuum with appropriate permissions&lt;/li&gt;
&lt;li&gt;Define guardrails (what can auto-remediate vs requires approval)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Guardrail Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Guardrails:
├── Auto-fix: Dependency version bumps (low risk)
├── Auto-fix + Staging test: Code-level patches
├── Require approval: Infrastructure changes
├── Require approval: Breaking API changes
└── Block: Never auto-fix (cryptographic changes, auth logic)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scope Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;├── Repositories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;repo-1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;repo-2&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;repo-3&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;├── Environments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;production&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;staging&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;├── Languages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Python&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Java&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;TypeScript&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Go&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;└── Exclusions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;test/**&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;docs/**&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;vendor/**&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security Agent: AI Pentesting
&lt;/h2&gt;

&lt;p&gt;The Security Agent component is particularly interesting — it's essentially an AI penetration tester:&lt;/p&gt;

&lt;h3&gt;
  
  
  How Security Agent Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context gathering:&lt;/strong&gt; Agent reads application documentation, API specs, architecture diagrams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat modeling:&lt;/strong&gt; AI identifies likely attack vectors based on application type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attack planning:&lt;/strong&gt; Develops multi-step attack scenarios (SQLi → privilege escalation → data exfil)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution:&lt;/strong&gt; Runs attacks against your application (in controlled manner)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporting:&lt;/strong&gt; Documents successful attack chains with step-by-step reproduction&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pre-release security review (before production deployment)&lt;/li&gt;
&lt;li&gt;Quarterly penetration testing (continuous, not annual)&lt;/li&gt;
&lt;li&gt;Compliance validation (demonstrate attack testing for auditors)&lt;/li&gt;
&lt;li&gt;Red team exercises (automated adversary simulation)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Agent operates within defined scope boundaries&lt;/li&gt;
&lt;li&gt;Credentials are scoped and time-limited&lt;/li&gt;
&lt;li&gt;All actions are logged to CloudTrail&lt;/li&gt;
&lt;li&gt;Blast radius controlled by IAM permissions&lt;/li&gt;
&lt;li&gt;Can be restricted to non-production environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Continuum Fits in DevSecOps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  DEVELOPMENT                                                     │
│  IDE (Continuum in Claude/Codex) → pre-commit scanning           │
├─────────────────────────────────────────────────────────────────┤
│  BUILD                                                           │
│  Pipeline scan → PR comments → dependency check → container scan │
├─────────────────────────────────────────────────────────────────┤
│  TEST                                                            │
│  Security Agent pentest → staging validation → fix verification  │
├─────────────────────────────────────────────────────────────────┤
│  DEPLOY                                                          │
│  Gate on security posture → no critical unresolved findings      │
├─────────────────────────────────────────────────────────────────┤
│  OPERATE                                                         │
│  Continuous monitoring → new CVEs checked → auto-remediate       │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Makes Continuum Different
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full lifecycle&lt;/strong&gt; — not just scanning, but validation, prioritization, remediation, and verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-native&lt;/strong&gt; — uses frontier models to reason about exploitability, not just pattern matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context-aware&lt;/strong&gt; — understands YOUR code, YOUR infrastructure, YOUR environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer-integrated&lt;/strong&gt; — embedded in Claude Code, Codex, and Kiro (not a separate tool to check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrail-controlled&lt;/strong&gt; — you define what it can auto-fix and what requires human approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validates, not just reports&lt;/strong&gt; — confirms exploitability via Security Agent (AI pentesting)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AWS Continuum represents a shift from "scan and report" to "discover, validate, and fix":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery:&lt;/strong&gt; Continuous scanning of code, dependencies, containers, and infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritization:&lt;/strong&gt; AI-powered, context-aware ranking (not just CVSS scores)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Security Agent confirms exploitability via automated attack simulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remediation:&lt;/strong&gt; Generates fixes, creates PRs, validates in staging, all within guardrails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Embedded in AI coding assistants (Claude Code, Codex) for shift-left security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams drowning in scanner noise — hundreds of findings, most not exploitable — Continuum's validation and auto-remediation capabilities represent a significant operational improvement. The integration with AI coding assistants means security feedback arrives while code is being written, not weeks later in a vulnerability report.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS security architecture and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>ai</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>AWS Serverless Patterns and Anti-Patterns: What Works, What Breaks, and When to Use What</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Fri, 21 Aug 2026 09:32:42 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-serverless-patterns-and-anti-patterns-what-works-what-breaks-and-when-to-use-what-4k50</link>
      <guid>https://dev.to/alpeshkumbhare/aws-serverless-patterns-and-anti-patterns-what-works-what-breaks-and-when-to-use-what-4k50</guid>
      <description>&lt;p&gt;Serverless on AWS isn't "just use Lambda." It's a design philosophy: let AWS manage the infrastructure, pay only for what you use, and build with managed services that scale independently. But the patterns that work in serverless are fundamentally different from traditional architectures — and the anti-patterns are expensive to learn the hard way.&lt;/p&gt;

&lt;p&gt;This guide covers the patterns that work in production, the anti-patterns that waste money or cause outages, and the decision framework for when serverless is the right (or wrong) choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Serverless Building Blocks
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────┐
│                    AWS SERVERLESS STACK                               │
├─────────────────────────────────────────────────────────────────────┤
│  COMPUTE        │ Lambda | Fargate (serverless containers)           │
│  API            │ API Gateway (REST/HTTP/WebSocket) | AppSync (GraphQL)│
│  ORCHESTRATION  │ Step Functions | EventBridge Scheduler             │
│  MESSAGING      │ SQS | SNS | EventBridge                          │
│  STORAGE        │ S3 | DynamoDB | Aurora Serverless                  │
│  STREAMING      │ Kinesis | DynamoDB Streams | MSK Serverless        │
│  AUTH           │ Cognito | IAM | Lambda Authorizers                 │
│  OBSERVABILITY  │ CloudWatch | X-Ray | Application Signals           │
└─────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key principle:&lt;/strong&gt; In serverless, you compose applications from managed services. Lambda is the glue between them — not the application itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pattern 1: Synchronous API (Request/Response)
&lt;/h2&gt;

&lt;p&gt;The most common serverless pattern: HTTP API backed by Lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API Gateway → Lambda → DynamoDB / Aurora Serverless
                                    │
                              Response ← ─ ─ ─ ─ ─ ─ ┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway HTTP API&lt;/strong&gt; (not REST API) — cheaper, faster, simpler for most cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Lambda per route&lt;/strong&gt; (single responsibility) — not a monolith Lambda&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep Lambda warm&lt;/strong&gt; — use Provisioned Concurrency for latency-sensitive endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB for simple access patterns&lt;/strong&gt; — scales with traffic, no connection pooling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aurora Serverless v2&lt;/strong&gt; for complex queries — but use RDS Proxy to manage connections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Choose HTTP API vs REST API
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;HTTP API&lt;/th&gt;
&lt;th&gt;REST API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$1.00/million requests&lt;/td&gt;
&lt;td&gt;$3.50/million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Lower (~10ms added)&lt;/td&gt;
&lt;td&gt;Higher (~30ms added)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features&lt;/td&gt;
&lt;td&gt;JWT auth, CORS, Lambda integration&lt;/td&gt;
&lt;td&gt;WAF, usage plans, API keys, caching, request validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choose when&lt;/td&gt;
&lt;td&gt;Standard APIs, cost-sensitive&lt;/td&gt;
&lt;td&gt;Need WAF, throttling plans, request transforms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Pattern 2: Async Event Processing
&lt;/h2&gt;

&lt;p&gt;Events trigger Lambda. Processing happens independently of the caller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S3 Upload ──→ Lambda: process image ──→ S3: store thumbnail
SQS Message ──→ Lambda: process order ──→ DynamoDB: update status
EventBridge ──→ Lambda: handle event ──→ SNS: send notification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always use Dead Letter Queues (DLQ)&lt;/strong&gt; — failed events go to DLQ, not lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design for idempotency&lt;/strong&gt; — events may be delivered more than once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing&lt;/strong&gt; — SQS Lambda trigger processes up to 10 messages per invocation (cost efficient)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set reserved concurrency&lt;/strong&gt; — prevent one function from consuming all account concurrency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use event filtering&lt;/strong&gt; — Lambda event source filtering reduces invocations (cheaper + simpler)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Event Source Filtering Example
&lt;/h3&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;"FilterCriteria"&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;"Filters"&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;"Pattern"&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="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: {&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: [&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;critical&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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="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;p&gt;Lambda only invokes for messages where &lt;code&gt;body.status == "critical"&lt;/code&gt;. Other messages are filtered out at the service level (free).&lt;/p&gt;




&lt;h2&gt;
  
  
  Pattern 3: Workflow Orchestration (Step Functions)
&lt;/h2&gt;

&lt;p&gt;For multi-step processes with branching, retries, and error handling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step Function:
├── Validate input
├── Process payment (Lambda)
│     ├── Success → Reserve inventory (Lambda)
│     └── Failure → Notify customer (SNS) → End
├── Ship order (Lambda)
├── Wait 7 days
└── Send follow-up email (Lambda)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step Functions: Express vs Standard
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard&lt;/th&gt;
&lt;th&gt;Express&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;Up to 1 year&lt;/td&gt;
&lt;td&gt;Up to 5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Per state transition ($0.025/1000)&lt;/td&gt;
&lt;td&gt;Per execution + duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution model&lt;/td&gt;
&lt;td&gt;Exactly-once&lt;/td&gt;
&lt;td&gt;At-least-once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;Full execution history (90 days)&lt;/td&gt;
&lt;td&gt;CloudWatch Logs only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Long-running workflows, human approval&lt;/td&gt;
&lt;td&gt;High-volume, short processing (ETL, transforms)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Direct Service Integrations (Skip Lambda)
&lt;/h3&gt;

&lt;p&gt;Step Functions can call 200+ AWS services directly without Lambda:&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;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::dynamodb:putItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Parameters"&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;"TableName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Item"&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;"orderId"&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="nl"&gt;"S.$"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$.orderId"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&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="nl"&gt;"S"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirmed"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Lambda needed — Step Functions writes to DynamoDB directly. Cheaper, fewer moving parts, lower latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; If your Lambda only calls one AWS API — replace it with a direct integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pattern 4: Streaming / Real-Time Processing
&lt;/h2&gt;

&lt;p&gt;For continuous data ingestion and processing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoT Devices ──→ Kinesis ──→ Lambda (real-time) ──→ DynamoDB
                  │
                  └──→ Firehose ──→ S3 (data lake)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kinesis for ordering and replay&lt;/strong&gt; — Lambda for real-time processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firehose for batched delivery&lt;/strong&gt; — no code needed for S3/Redshift/OpenSearch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tumbling windows&lt;/strong&gt; — Lambda aggregates over time windows natively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bisect on error&lt;/strong&gt; — Kinesis + Lambda can split failed batches to isolate the bad record&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pattern 5: Fan-Out / Scatter-Gather
&lt;/h2&gt;

&lt;p&gt;One trigger spawns many parallel processes, results are aggregated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API → Step Function (Distributed Map):
  ├── Process item 1 (Lambda)
  ├── Process item 2 (Lambda)
  ├── Process item 3 (Lambda)
  └── ... (10,000 concurrent)

  → Aggregate results → Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step Functions Distributed Map&lt;/strong&gt; processes millions of items with up to 10,000 concurrent executions. Use for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch processing large datasets from S3&lt;/li&gt;
&lt;li&gt;Parallel API calls to external services&lt;/li&gt;
&lt;li&gt;Large-scale data transformation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pattern 6: GraphQL API (AppSync)
&lt;/h2&gt;

&lt;p&gt;For applications needing flexible, client-driven queries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → AppSync → Resolvers:
  ├── DynamoDB (direct resolver, no Lambda)
  ├── Lambda (complex logic)
  ├── Aurora (SQL queries)
  └── HTTP (external APIs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AppSync advantages over API Gateway + Lambda:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client fetches exactly what it needs (no over-fetching)&lt;/li&gt;
&lt;li&gt;Real-time subscriptions (WebSocket) built in&lt;/li&gt;
&lt;li&gt;Direct DynamoDB/Aurora resolvers (no Lambda needed for CRUD)&lt;/li&gt;
&lt;li&gt;Caching built in&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pattern 7: Scheduled Tasks
&lt;/h2&gt;

&lt;p&gt;Replace cron servers with serverless scheduling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge Scheduler → Lambda: run cleanup
EventBridge Rule (rate/cron) → Lambda: generate report
Step Functions Wait → Lambda: send reminder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  EventBridge Scheduler vs EventBridge Rules
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Scheduler&lt;/th&gt;
&lt;th&gt;Rules&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One-time events&lt;/td&gt;
&lt;td&gt;✅ (at specific time)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timezone support&lt;/td&gt;
&lt;td&gt;✅ (handles DST)&lt;/td&gt;
&lt;td&gt;❌ (UTC only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;Millions of schedules&lt;/td&gt;
&lt;td&gt;Limited rules per bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Per-entity schedules (user reminders)&lt;/td&gt;
&lt;td&gt;System-wide recurring jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Anti-Patterns: What NOT to Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 1: Lambda Monolith
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Putting your entire Express/Flask app inside one Lambda function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ BAD: Single Lambda handles ALL routes
   /users, /orders, /products, /admin → one 50MB Lambda

✅ GOOD: One Lambda per route (or per domain)
   /users → users-handler
   /orders → orders-handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it fails:&lt;/strong&gt; Cold starts scale with package size. One change requires redeploying everything. No independent scaling per endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 2: Lambda Calling Lambda (Synchronous Chain)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Lambda A calls Lambda B which calls Lambda C, all synchronously.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ BAD:
   Lambda A → invoke → Lambda B → invoke → Lambda C
   (paying for A's time while waiting for B and C)

✅ GOOD:
   Step Functions: A → B → C (orchestrated, not nested)
   Or: A → SQS → B → SQS → C (async, decoupled)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it fails:&lt;/strong&gt; You pay for idle time while waiting. Retry logic becomes complex. Timeouts cascade. Use Step Functions or async messaging instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 3: Recursive Lambda
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Lambda invokes itself (or triggers a loop).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ DANGEROUS:
   Lambda → writes to S3 → triggers same Lambda → writes to S3 → ...
   (infinite loop = infinite bill)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use separate buckets for input/output, or use event source filtering to exclude your own writes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 4: VPC Lambda Without Need
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Putting Lambda in a VPC "for security" when it doesn't access VPC resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it fails:&lt;/strong&gt; VPC Lambda has cold start overhead (ENI creation). If Lambda only calls DynamoDB, S3, or external APIs — it doesn't need VPC. Use VPC only when accessing RDS, ElastiCache, or private EC2 services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 5: Over-Orchestration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Using Step Functions for a simple sequential call that could be a direct Lambda + SDK call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ OVER-ENGINEERED:
   Step Function → Lambda (validate) → Lambda (save to DDB)
   (3 resources for what one Lambda could do)

✅ APPROPRIATE:
   Lambda: validate + save to DDB (if it's simple sequential logic)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Use Step Functions when you need branching, retries, parallel execution, wait states, or error handling across multiple services. Don't use it for simple A→B flows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 6: Ignoring Cold Starts in Latency-Sensitive Paths
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; Using Lambda for a user-facing API with p99 latency SLA of &amp;lt;100ms without addressing cold starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cold start impact:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python/Node.js: 100-300ms&lt;/li&gt;
&lt;li&gt;Java/.NET: 500-3000ms&lt;/li&gt;
&lt;li&gt;VPC Lambda: adds 200-500ms on top&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Provisioned Concurrency (pre-warm instances)&lt;/li&gt;
&lt;li&gt;Lambda SnapStart (Java only — restore from checkpoint)&lt;/li&gt;
&lt;li&gt;Keep Lambda small (fewer dependencies = faster cold start)&lt;/li&gt;
&lt;li&gt;Or use Fargate for latency-critical paths with predictable traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Anti-Pattern 7: No Concurrency Limits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The mistake:&lt;/strong&gt; No reserved concurrency on Lambdas in a shared account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; One function handling a burst consumes all 1,000 concurrent executions → other functions throttled → cascading failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Set reserved concurrency on critical functions. Set account-level concurrency limits on non-critical batch functions.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Serverless Fits vs When It Doesn't
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serverless Wins
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Characteristic&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;Variable/unpredictable traffic&lt;/td&gt;
&lt;td&gt;Scales to zero, no idle cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event-driven workloads&lt;/td&gt;
&lt;td&gt;Natural fit for trigger-based processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapid prototyping&lt;/td&gt;
&lt;td&gt;Ship in hours, not days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-request cost model preferred&lt;/td&gt;
&lt;td&gt;Pay only for what you use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team wants zero infrastructure ops&lt;/td&gt;
&lt;td&gt;No patching, scaling, or capacity planning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Serverless Doesn't Fit
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Characteristic&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;Alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consistent high traffic (always on)&lt;/td&gt;
&lt;td&gt;Fargate/EC2 is cheaper at high utilization&lt;/td&gt;
&lt;td&gt;Fargate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution &amp;gt; 15 minutes&lt;/td&gt;
&lt;td&gt;Lambda timeout limit&lt;/td&gt;
&lt;td&gt;ECS tasks / Step Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent connections (WebSocket server, gRPC stream)&lt;/td&gt;
&lt;td&gt;Lambda is request/response&lt;/td&gt;
&lt;td&gt;Fargate / EC2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold start unacceptable (&amp;lt; 50ms p99)&lt;/td&gt;
&lt;td&gt;Lambda can't guarantee this&lt;/td&gt;
&lt;td&gt;Fargate / EC2 with ALB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU / specialized hardware&lt;/td&gt;
&lt;td&gt;Lambda doesn't support GPU&lt;/td&gt;
&lt;td&gt;EC2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large deployment package (&amp;gt; 250MB)&lt;/td&gt;
&lt;td&gt;Lambda size limits&lt;/td&gt;
&lt;td&gt;Containers on Fargate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cost Optimization Patterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ARM (Graviton) Lambda&lt;/td&gt;
&lt;td&gt;20% cheaper, often 10-30% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increase memory (reduce duration)&lt;/td&gt;
&lt;td&gt;Often cheaper: 256MB × 400ms costs same as 512MB × 180ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch SQS messages (10 per invocation)&lt;/td&gt;
&lt;td&gt;10x fewer invocations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct integrations (skip Lambda)&lt;/td&gt;
&lt;td&gt;No Lambda cost for simple pass-through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event filtering&lt;/td&gt;
&lt;td&gt;Reduce unnecessary invocations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioned Concurrency (only for latency needs)&lt;/td&gt;
&lt;td&gt;⚠️ Adds cost — use only where needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Serverless on AWS works when you follow these principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compose from managed services&lt;/strong&gt; — Lambda is glue, not the application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single responsibility&lt;/strong&gt; — one function per task, not monolith Lambdas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async by default&lt;/strong&gt; — use SQS/EventBridge between services, not synchronous chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step Functions for orchestration&lt;/strong&gt; — don't build state machines in Lambda code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct integrations&lt;/strong&gt; — if Lambda just calls one AWS API, remove it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design for failure&lt;/strong&gt; — DLQs everywhere, idempotent handlers, circuit breakers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know when it doesn't fit&lt;/strong&gt; — persistent connections, GPU, &amp;gt;15 min, cold-start-sensitive paths → use Fargate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The best serverless architectures look nothing like traditional three-tier apps shrunk into Lambda. They're composed of events, queues, state machines, and managed services with Lambda connecting the dots.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS serverless architecture and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>lambda</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AWS Networking Decision Guide: Transit Gateway vs VPC Peering vs PrivateLink vs VPC Lattice vs Cloud WAN</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Wed, 19 Aug 2026 06:08:06 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-networking-decision-guide-transit-gateway-vs-vpc-peering-vs-privatelink-vs-vpc-lattice-vs-5cm8</link>
      <guid>https://dev.to/alpeshkumbhare/aws-networking-decision-guide-transit-gateway-vs-vpc-peering-vs-privatelink-vs-vpc-lattice-vs-5cm8</guid>
      <description>&lt;p&gt;AWS networking has five ways to connect VPCs and services. They're not interchangeable — each solves a different connectivity problem at a different cost point. Using Transit Gateway where VPC Peering suffices wastes money. Using VPC Peering where Transit Gateway is needed creates an unmanageable mesh.&lt;/p&gt;

&lt;p&gt;This guide maps each connectivity option to its sweet spot, compares cost and complexity, and provides architecture patterns for real-world multi-account, multi-region deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Connectivity Options
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────────┐
│                    AWS VPC CONNECTIVITY                                │
├──────────────┬──────────────┬───────────────┬──────────┬─────────────┤
│ VPC Peering  │Transit Gateway│  PrivateLink  │VPC Lattice│  Cloud WAN  │
│              │              │               │          │             │
│ Point-to-    │ Hub-and-     │ Service       │ Service  │ Global      │
│ point        │ spoke        │ endpoint      │ mesh     │ network     │
│              │              │               │          │             │
│ 2 VPCs       │ Many VPCs    │ Expose 1      │ Service- │ Multi-region│
│ directly     │ via hub      │ service       │ to-svc   │ backbone    │
│              │              │ privately     │ (L7+IAM) │             │
└──────────────┴──────────────┴───────────────┴──────────┴─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you need to...&lt;/th&gt;
&lt;th&gt;Use...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connect 2-3 VPCs directly (simple)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VPC Peering&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connect 5+ VPCs through a central hub&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expose a service to other VPCs without network joining&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PrivateLink&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service-to-service auth (IAM) across VPCs/accounts&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VPC Lattice&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global multi-region network with policy&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cloud WAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connect on-premises to AWS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Transit Gateway + VPN/Direct Connect&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  VPC Peering: Direct Point-to-Point
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A direct, private network link between two VPCs. Traffic uses AWS backbone — no internet, no gateway devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Topology&lt;/td&gt;
&lt;td&gt;Point-to-point (1 peering = 2 VPCs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transitive&lt;/td&gt;
&lt;td&gt;❌ No (A↔B and B↔C doesn't give A↔C)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region&lt;/td&gt;
&lt;td&gt;✅ Yes (inter-region peering)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;No limit (same as within VPC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;Lowest (no intermediate hop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free (same-AZ), $0.01/GB (cross-AZ/region)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use VPC Peering
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;2-3 VPCs that need full network connectivity&lt;/li&gt;
&lt;li&gt;Lowest latency requirement (no intermediate router)&lt;/li&gt;
&lt;li&gt;Cost-sensitive with high data transfer (no per-hour charge)&lt;/li&gt;
&lt;li&gt;Simple topology that won't grow beyond ~5 connections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When NOT to Use VPC Peering
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;5+ VPCs (creates N×(N-1)/2 peering connections — unmanageable mesh)&lt;/li&gt;
&lt;li&gt;Need transitive routing (VPC A talking to VPC C through VPC B)&lt;/li&gt;
&lt;li&gt;Need centralized inspection/firewall&lt;/li&gt;
&lt;li&gt;Need on-premises connectivity through a single point&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture: VPC Peering Mesh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     VPC-A ←──── peer ────→ VPC-B
       ↑                       ↑
       │                       │
     peer                    peer
       │                       │
       ↓                       ↓
     VPC-C ←──── peer ────→ VPC-D

4 VPCs = 6 peering connections
10 VPCs = 45 peering connections ← don't do this
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Transit Gateway: The Hub Router
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A regional network hub that connects VPCs, VPN connections, and Direct Connect gateways through a single gateway. Think of it as a cloud router.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Topology&lt;/td&gt;
&lt;td&gt;Hub-and-spoke (star)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transitive&lt;/td&gt;
&lt;td&gt;✅ Yes (all attachments can reach each other via route tables)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;✅ Yes (share via RAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region&lt;/td&gt;
&lt;td&gt;✅ Yes (TGW peering between regions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;50 Gbps per VPC attachment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max attachments&lt;/td&gt;
&lt;td&gt;5,000 per TGW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route tables&lt;/td&gt;
&lt;td&gt;Multiple (enables segmentation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$0.05/hr per attachment + $0.02/GB processed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Transit Gateway
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;5+ VPCs needing connectivity&lt;/li&gt;
&lt;li&gt;Hub-and-spoke topology (centralized networking)&lt;/li&gt;
&lt;li&gt;On-premises connectivity (VPN or Direct Connect terminates at TGW)&lt;/li&gt;
&lt;li&gt;Network segmentation via multiple route tables&lt;/li&gt;
&lt;li&gt;Centralized egress (inspection VPC with Network Firewall)&lt;/li&gt;
&lt;li&gt;Multi-account landing zone networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Transit Gateway Architecture: Segmented Network
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─────────────────────────┐
                    │     Transit Gateway      │
                    │                         │
                    │  Route Table: Prod      │
                    │  Route Table: Non-Prod  │
                    │  Route Table: Shared    │
                    └────┬───────┬───────┬────┘
                         │       │       │
              ┌──────────┤       │       ├──────────┐
              │          │       │       │          │
              ▼          ▼       ▼       ▼          ▼
         ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
         │Prod VPC│ │Dev VPC │ │Shared  │ │Inspect │
         │        │ │        │ │Services│ │VPC     │
         └────────┘ └────────┘ └────────┘ └────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Segmentation:&lt;/strong&gt; Prod route table only has routes to Shared Services and Inspection VPC. Dev cannot reach Prod directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  TGW Route Table Segmentation
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route Table&lt;/th&gt;
&lt;th&gt;Can Reach&lt;/th&gt;
&lt;th&gt;Cannot Reach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Shared Services, Inspection, On-Premises&lt;/td&gt;
&lt;td&gt;Development, Sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Shared Services, Inspection&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared Services&lt;/td&gt;
&lt;td&gt;Production, Development&lt;/td&gt;
&lt;td&gt;Direct internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-Premises&lt;/td&gt;
&lt;td&gt;Production, Shared Services&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  PrivateLink: Service Exposure Without Network Joining
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Exposes a specific service (behind NLB) to other VPCs via an interface endpoint. Consumer VPC gets an ENI in their subnet that routes to the provider's service. Networks don't join — only that one service is accessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Topology&lt;/td&gt;
&lt;td&gt;Provider → Consumer (one-directional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network joining&lt;/td&gt;
&lt;td&gt;❌ No (only specific service is exposed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region&lt;/td&gt;
&lt;td&gt;✅ Yes (since 2023)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;TCP (NLB-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$0.01/hr per endpoint + $0.01/GB processed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Consumer only sees the endpoint ENI, not provider's network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use PrivateLink
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Expose ONE service to other VPCs without sharing entire network&lt;/li&gt;
&lt;li&gt;SaaS provider offering private connectivity to customers&lt;/li&gt;
&lt;li&gt;Shared services (API, database proxy) accessible across accounts&lt;/li&gt;
&lt;li&gt;Third-party vendor integration (many AWS Marketplace products use PrivateLink)&lt;/li&gt;
&lt;li&gt;Security: consumer cannot scan/discover other resources in provider VPC&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture: Shared Service via PrivateLink
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Provider Account                    Consumer Account
┌──────────────────┐               ┌──────────────────┐
│  Service (EC2/ECS)│               │                  │
│       ↓          │               │   App Server     │
│     [NLB]        │               │       ↓          │
│       ↓          │               │  VPC Endpoint    │
│  Endpoint Service │◄─────────────│  (ENI in subnet) │
└──────────────────┘  PrivateLink  └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consumer's app calls the endpoint ENI's DNS → traffic flows privately to provider's NLB → reaches service. No internet, no peering, no TGW needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  VPC Lattice: Service-to-Service (L7 + IAM)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Application-layer service mesh that provides service discovery, traffic management, and IAM-based authentication between services — across VPCs and accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Layer&lt;/td&gt;
&lt;td&gt;L7 (HTTP/HTTPS/gRPC) + TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth model&lt;/td&gt;
&lt;td&gt;IAM (SigV4) — identity-based, not network-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;✅ Native (service networks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-VPC&lt;/td&gt;
&lt;td&gt;✅ No peering/TGW needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service discovery&lt;/td&gt;
&lt;td&gt;Built-in (DNS-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic management&lt;/td&gt;
&lt;td&gt;Weighted routing, health checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Built-in access logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Per request + per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use VPC Lattice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Service-to-service communication with IAM auth (Zero Trust)&lt;/li&gt;
&lt;li&gt;Cross-account service discovery without network plumbing&lt;/li&gt;
&lt;li&gt;Weighted traffic routing between service versions (canary)&lt;/li&gt;
&lt;li&gt;Don't want to manage TGW/peering for service connectivity&lt;/li&gt;
&lt;li&gt;Need L7 visibility (HTTP method, path, status code in access logs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VPC Lattice vs PrivateLink
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;PrivateLink&lt;/th&gt;
&lt;th&gt;VPC Lattice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Layer&lt;/td&gt;
&lt;td&gt;L4 (TCP via NLB)&lt;/td&gt;
&lt;td&gt;L7 (HTTP/gRPC + TCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Network-level only&lt;/td&gt;
&lt;td&gt;IAM (SigV4) per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Manual DNS config&lt;/td&gt;
&lt;td&gt;Built-in service discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic mgmt&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Weighted routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direction&lt;/td&gt;
&lt;td&gt;One-way (provider → consumer)&lt;/td&gt;
&lt;td&gt;Bidirectional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Exposing services to external consumers&lt;/td&gt;
&lt;td&gt;Internal service mesh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  VPC Lattice vs Transit Gateway
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Transit Gateway&lt;/th&gt;
&lt;th&gt;VPC Lattice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Layer&lt;/td&gt;
&lt;td&gt;L3/L4 (network routing)&lt;/td&gt;
&lt;td&gt;L7 (application routing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joins networks?&lt;/td&gt;
&lt;td&gt;Yes (full network reachability)&lt;/td&gt;
&lt;td&gt;No (only specific services)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Security groups / NACLs&lt;/td&gt;
&lt;td&gt;IAM per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Full network connectivity&lt;/td&gt;
&lt;td&gt;Service-to-service only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Per attachment-hour + GB&lt;/td&gt;
&lt;td&gt;Per request + GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Use TGW when you need network-level connectivity (SSH, database ports, broad access). Use VPC Lattice when you need application-level service communication with identity auth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cloud WAN: Global Network Fabric
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A managed global network that connects VPCs across regions and on-premises sites with centralized policy. Think of it as a multi-region Transit Gateway with global policy control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Multi-region, global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy&lt;/td&gt;
&lt;td&gt;Centralized network policy (segments, sharing, inspection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-premises&lt;/td&gt;
&lt;td&gt;Direct Connect, Site-to-Site VPN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segmentation&lt;/td&gt;
&lt;td&gt;Network segments (like TGW route tables, but global)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Core network edge per hour + per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Large enterprises with 10+ regions and complex segmentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Cloud WAN vs Transit Gateway
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Transit Gateway&lt;/th&gt;
&lt;th&gt;Cloud WAN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Single region&lt;/td&gt;
&lt;td&gt;Global (multi-region)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region&lt;/td&gt;
&lt;td&gt;TGW peering (manual per region pair)&lt;/td&gt;
&lt;td&gt;Automatic (policy-driven)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy&lt;/td&gt;
&lt;td&gt;Route tables per TGW&lt;/td&gt;
&lt;td&gt;Global segment policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High (enterprise-grade)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Single-region or 2-3 regions&lt;/td&gt;
&lt;td&gt;5+ regions with consistent policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cost Comparison
&lt;/h2&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;Hourly Cost&lt;/th&gt;
&lt;th&gt;Data Processing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Peering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0.01/GB (cross-AZ/region)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.05/hr per attachment&lt;/td&gt;
&lt;td&gt;$0.02/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PrivateLink&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.01/hr per endpoint&lt;/td&gt;
&lt;td&gt;$0.01/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Lattice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No hourly&lt;/td&gt;
&lt;td&gt;$0.025/GB + $0.10/million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud WAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.05/hr per attachment + core edge&lt;/td&gt;
&lt;td&gt;$0.02/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cost impact at scale:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;10 VPCs connected via TGW: $0.05 × 10 attachments × 730 hours = &lt;strong&gt;$365/month&lt;/strong&gt; (before data transfer)&lt;/p&gt;

&lt;p&gt;Same 10 VPCs via VPC Peering: 45 peering connections × &lt;strong&gt;$0/month&lt;/strong&gt; (peering is free, but management overhead is high)&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: Multi-Account Landing Zone (Most Common)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transit Gateway (centralized)
├── Shared Services VPC (AD, CI/CD, DNS)
├── Inspection VPC (Network Firewall, egress)
├── Production VPC (workloads)
├── Staging VPC (workloads)
├── Development VPC (workloads)
└── On-Premises (via Direct Connect / VPN)

+ PrivateLink for specific shared services (database proxy, API gateway)
+ VPC Lattice for microservice-to-microservice auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 2: Hybrid Cloud (On-Premises + AWS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On-Premises Data Center
      │
   Direct Connect (or VPN)
      │
      ▼
Transit Gateway
├── VPC: Production workloads
├── VPC: DR (disaster recovery)
└── VPC: Shared Services (DNS resolver, AD connector)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 3: SaaS Multi-Tenant (Provider)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SaaS Provider VPC
├── Service behind NLB
└── PrivateLink Endpoint Service
      │
      ├── Customer A VPC (endpoint) 
      ├── Customer B VPC (endpoint)
      └── Customer C VPC (endpoint)

Each customer has private access. Networks never join.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Networking Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VPC Peering mesh with 10+ VPCs&lt;/td&gt;
&lt;td&gt;Unmanageable, no transitive routing&lt;/td&gt;
&lt;td&gt;Transit Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TGW for 2-3 VPCs&lt;/td&gt;
&lt;td&gt;Over-engineered, unnecessary cost&lt;/td&gt;
&lt;td&gt;VPC Peering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All traffic through TGW (including AWS API calls)&lt;/td&gt;
&lt;td&gt;High data processing charges&lt;/td&gt;
&lt;td&gt;VPC endpoints for S3, DynamoDB (free gateway endpoints)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No network segmentation on TGW&lt;/td&gt;
&lt;td&gt;Dev can reach prod&lt;/td&gt;
&lt;td&gt;Multiple TGW route tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrivateLink when you need bidirectional&lt;/td&gt;
&lt;td&gt;PrivateLink is one-way&lt;/td&gt;
&lt;td&gt;VPC Lattice or TGW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overlapping CIDRs between VPCs&lt;/td&gt;
&lt;td&gt;Can't peer or TGW connect&lt;/td&gt;
&lt;td&gt;Plan CIDR with IPAM from day one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single AZ for NAT Gateway&lt;/td&gt;
&lt;td&gt;AZ failure = no egress&lt;/td&gt;
&lt;td&gt;NAT GW per AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AWS VPC connectivity comes down to what you're connecting and why:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2-3 VPCs, full connectivity, lowest cost&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VPC Peering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (hourly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5+ VPCs, hub-and-spoke, centralized routing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Transit Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expose one service privately, no network joining&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PrivateLink&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service-to-service with IAM auth, no network plumbing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VPC Lattice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global multi-region with policy-driven segmentation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cloud WAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$$$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-premises to AWS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TGW + Direct Connect/VPN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$$-$$$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 2026 pattern for most enterprises: &lt;strong&gt;Transit Gateway for network backbone&lt;/strong&gt; + &lt;strong&gt;VPC Lattice for service mesh&lt;/strong&gt; + &lt;strong&gt;PrivateLink for external/vendor services&lt;/strong&gt; + &lt;strong&gt;VPC Peering for the occasional simple 2-VPC connection&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS networking and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>CI/CD on AWS: Deployment Strategies, Pipeline Architectures, and the CodePipeline vs GitHub Actions Decision</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Tue, 18 Aug 2026 06:03:55 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/cicd-on-aws-deployment-strategies-pipeline-architectures-and-the-codepipeline-vs-github-actions-5h6i</link>
      <guid>https://dev.to/alpeshkumbhare/cicd-on-aws-deployment-strategies-pipeline-architectures-and-the-codepipeline-vs-github-actions-5h6i</guid>
      <description>&lt;p&gt;Shipping code to production should be boring. If your deployments are stressful, your pipeline is wrong. A well-designed CI/CD pipeline makes releases routine, reversible, and observable — whether you deploy once a day or fifty times.&lt;/p&gt;

&lt;p&gt;AWS provides both native CI/CD services (CodePipeline, CodeBuild, CodeDeploy) and deep integration with third-party tools (GitHub Actions, GitLab CI). The choice depends on your team's workflow preferences and how much you want to stay inside the AWS ecosystem.&lt;/p&gt;

&lt;p&gt;This guide covers the deployment strategies that matter, the pipeline architectures that work, and the decision framework for choosing your CI/CD stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment Strategies: How Code Reaches Production
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 1: Rolling Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Replace instances/tasks gradually. Old and new versions run simultaneously during the transition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Time 0:  [v1] [v1] [v1] [v1]  (4 tasks, all v1)
Time 1:  [v2] [v1] [v1] [v1]  (1 updated)
Time 2:  [v2] [v2] [v1] [v1]  (2 updated)
Time 3:  [v2] [v2] [v2] [v1]  (3 updated)
Time 4:  [v2] [v2] [v2] [v2]  (complete)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Simple, no extra infrastructure, works everywhere.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Two versions run simultaneously (must be backward-compatible). Rollback means rolling forward to v1 again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS implementation:&lt;/strong&gt; ECS rolling update (default), EKS rolling update, EC2 Auto Scaling group instance refresh.&lt;/p&gt;
&lt;h3&gt;
  
  
  Strategy 2: Blue/Green Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Deploy new version (green) alongside old version (blue). Switch traffic atomically. Keep blue alive for instant rollback.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐         ┌─────────────────┐
│   BLUE (v1)     │         │   GREEN (v2)    │
│   (serving)     │         │   (staged)      │
└────────┬────────┘         └────────┬────────┘
         │                           │
         ▼                           ▼
┌─────────────────────────────────────────────┐
│              ALB / Route53                    │
│         100% → Blue (until cutover)          │
│         Then: 100% → Green                   │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Zero downtime. Instant rollback (switch traffic back to blue). Full testing on green before cutover.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; 2x infrastructure during deployment (cost). Database schema changes need careful handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ECS native blue/green (GA July 2025) — built into ECS service, no CodeDeploy needed&lt;/li&gt;
&lt;li&gt;CodeDeploy blue/green for ECS (original approach)&lt;/li&gt;
&lt;li&gt;Route53 weighted routing (for broader blue/green)&lt;/li&gt;
&lt;li&gt;ALB target group swap&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Strategy 3: Canary Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Route a small percentage of traffic (1-10%) to the new version. Monitor errors. If healthy, gradually shift more traffic. If unhealthy, route all traffic back to old version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1:  95% → v1,  5% → v2  (canary)
Step 2:  70% → v1, 30% → v2  (expanding)
Step 3:  50% → v1, 50% → v2  (halfway)
Step 4:   0% → v1, 100% → v2 (complete)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Minimal blast radius. Real production traffic validates new version. Automatic rollback on alarm.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Complex routing. Must handle session affinity. Slower than blue/green.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ECS native canary/linear (GA October 2025) — percentage-based traffic shifting built into ECS&lt;/li&gt;
&lt;li&gt;CodeDeploy canary (Lambda, ECS)&lt;/li&gt;
&lt;li&gt;App Mesh / VPC Lattice (weighted routing between versions)&lt;/li&gt;
&lt;li&gt;ALB weighted target groups&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Strategy 4: Feature Flags (Decouple Deploy from Release)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Deploy code with new features disabled. Enable features independently via configuration (not deployment). Rollback = toggle flag off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS implementation:&lt;/strong&gt; AppConfig feature flags (native), LaunchDarkly, or custom DynamoDB-backed flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Deploy anytime. Release (enable feature) separately. Different features for different users (A/B testing).&lt;/p&gt;


&lt;h2&gt;
  
  
  ECS Native Deployment Capabilities (2025-2026)
&lt;/h2&gt;

&lt;p&gt;ECS received major deployment upgrades — eliminating the need for CodeDeploy in most container scenarios:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native blue/green&lt;/td&gt;
&lt;td&gt;July 2025&lt;/td&gt;
&lt;td&gt;Built-in blue/green without CodeDeploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linear/canary&lt;/td&gt;
&lt;td&gt;October 2025&lt;/td&gt;
&lt;td&gt;Percentage-based traffic shifting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLB support for linear/canary&lt;/td&gt;
&lt;td&gt;February 2026&lt;/td&gt;
&lt;td&gt;Canary for TCP/gRPC workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pause/continue&lt;/td&gt;
&lt;td&gt;May 2026&lt;/td&gt;
&lt;td&gt;Pause deployment for manual validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configurable circuit breaker&lt;/td&gt;
&lt;td&gt;July 2026&lt;/td&gt;
&lt;td&gt;Custom failure thresholds for auto-rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  ECS Deployment Configuration
&lt;/h3&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;"deploymentConfiguration"&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;"deploymentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BLUE_GREEN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blueGreenDeploymentConfiguration"&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;"trafficRoutingConfig"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CANARY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"canaryConfig"&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;"interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"percentage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&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;"terminationWaitTimeInMinutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"deploymentCircuitBreaker"&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;"enable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"rollback"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"failureThreshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This deploys with 10% canary, waits 5 minutes, then shifts remaining traffic. If 5+ tasks fail health checks, automatic rollback triggers.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pipeline Architecture: AWS-Native Stack
&lt;/h2&gt;
&lt;h3&gt;
  
  
  AWS CodePipeline + CodeBuild + CodeDeploy
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────┐     ┌───────────┐     ┌───────────┐     ┌───────────┐
│  Source   │────→│   Build   │────→│   Test    │────→│  Deploy   │
│(CodeCommit│     │(CodeBuild)│     │(CodeBuild)│     │(CodeDeploy│
│ or GitHub)│     │           │     │           │     │ or ECS)   │
└──────────┘     └───────────┘     └───────────┘     └───────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;CodePipeline:&lt;/strong&gt; Orchestrates the pipeline stages. Triggers on source change.&lt;br&gt;
&lt;strong&gt;CodeBuild:&lt;/strong&gt; Runs build commands, tests, security scans in managed containers.&lt;br&gt;
&lt;strong&gt;CodeDeploy:&lt;/strong&gt; Handles deployment strategies (rolling, blue/green, canary).&lt;/p&gt;
&lt;h3&gt;
  
  
  Pipeline Stages Best Practice
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source → Build → Unit Test → SAST Scan → Container Scan → 
  Deploy Dev → Integration Test → Deploy Staging → 
    Load Test → Manual Approval → Deploy Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Multi-Account Pipeline Pattern
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tooling Account (pipeline lives here)
  │
  ├── Deploy → Dev Account (automatic)
  ├── Deploy → Staging Account (automatic + integration tests)
  └── Deploy → Production Account (manual approval gate)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Cross-account deployment uses IAM roles. Pipeline in tooling account assumes role in target account to deploy.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pipeline Architecture: GitHub Actions
&lt;/h2&gt;

&lt;p&gt;For teams using GitHub as source control, GitHub Actions provides a complete CI/CD solution with AWS integration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to ECS&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;  &lt;span class="c1"&gt;# OIDC for AWS auth&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789:role/github-actions-deploy&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-west-1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecr-login@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and push image&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t $ECR_REGISTRY/my-app:$GITHUB_SHA .&lt;/span&gt;
          &lt;span class="s"&gt;docker push $ECR_REGISTRY/my-app:$GITHUB_SHA&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-deploy-task-definition@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-def.json&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-service&lt;/span&gt;
          &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
          &lt;span class="na"&gt;wait-for-service-stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Actions + OIDC (No Long-Lived Credentials)
&lt;/h3&gt;

&lt;p&gt;Use OpenID Connect (OIDC) to authenticate GitHub Actions to AWS — no access keys needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create IAM Identity Provider for GitHub in AWS&lt;/li&gt;
&lt;li&gt;Create IAM role with trust policy for specific repo/branch&lt;/li&gt;
&lt;li&gt;GitHub Actions exchanges OIDC token for temporary AWS credentials&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Credentials are short-lived (1 hour), scoped to specific repos, and never stored as secrets.&lt;/p&gt;




&lt;h2&gt;
  
  
  CodePipeline vs GitHub Actions vs GitLab CI
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;CodePipeline&lt;/th&gt;
&lt;th&gt;GitHub Actions&lt;/th&gt;
&lt;th&gt;GitLab CI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CodeCommit, GitHub, S3, ECR&lt;/td&gt;
&lt;td&gt;GitHub (native)&lt;/td&gt;
&lt;td&gt;GitLab (native)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CodeBuild (managed)&lt;/td&gt;
&lt;td&gt;Hosted runners or self-hosted&lt;/td&gt;
&lt;td&gt;Shared or self-hosted runners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep (native IAM, VPC, cross-account)&lt;/td&gt;
&lt;td&gt;Good (via aws-actions, OIDC)&lt;/td&gt;
&lt;td&gt;Good (via CLI, OIDC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment strategies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CodeDeploy (full support)&lt;/td&gt;
&lt;td&gt;Manual (scripts + AWS CLI)&lt;/td&gt;
&lt;td&gt;Manual (scripts + AWS CLI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free pipeline + CodeBuild minutes ($0.005/min)&lt;/td&gt;
&lt;td&gt;2000 free min/month, then $0.008/min&lt;/td&gt;
&lt;td&gt;400 free min/month, then $0.005/min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-only&lt;/td&gt;
&lt;td&gt;20K+ marketplace actions&lt;/td&gt;
&lt;td&gt;500+ templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pipeline as code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;YAML or console&lt;/td&gt;
&lt;td&gt;YAML (&lt;code&gt;.github/workflows/&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;YAML (&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approval gates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual approval action&lt;/td&gt;
&lt;td&gt;Environment protection rules&lt;/td&gt;
&lt;td&gt;Manual jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-native teams, complex deployment strategies&lt;/td&gt;
&lt;td&gt;Teams on GitHub, multi-cloud&lt;/td&gt;
&lt;td&gt;Teams on GitLab, self-hosted preference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Choose What
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CodePipeline:&lt;/strong&gt; You want native blue/green/canary via CodeDeploy, cross-account deployment patterns, or deep AWS integration without custom scripting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions:&lt;/strong&gt; Your code lives on GitHub, team prefers GitHub's ecosystem, and you want multi-cloud flexibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab CI:&lt;/strong&gt; Your code lives on GitLab, you want self-hosted runners, or you need built-in security scanning (SAST/DAST).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security in the Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shift-Left Security
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pre-commit&lt;/td&gt;
&lt;td&gt;git-secrets, talisman&lt;/td&gt;
&lt;td&gt;Hardcoded credentials before they enter repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;SAST (CodeGuru, Snyk, Semgrep)&lt;/td&gt;
&lt;td&gt;Code vulnerabilities (SQL injection, XSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;SCA (Dependabot, Snyk)&lt;/td&gt;
&lt;td&gt;Vulnerable dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container Build&lt;/td&gt;
&lt;td&gt;ECR image scanning, Trivy&lt;/td&gt;
&lt;td&gt;Container CVEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-Deploy&lt;/td&gt;
&lt;td&gt;IAM policy validation (IAM Access Analyzer)&lt;/td&gt;
&lt;td&gt;Over-privileged roles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post-Deploy&lt;/td&gt;
&lt;td&gt;DAST (OWASP ZAP)&lt;/td&gt;
&lt;td&gt;Runtime vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Pipeline Security Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No long-lived credentials&lt;/strong&gt; — use OIDC (GitHub) or IAM roles (CodeBuild)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least privilege&lt;/strong&gt; — pipeline role can only deploy to specific services/accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact signing&lt;/strong&gt; — sign container images (cosign / Notation) to ensure integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutable artifacts&lt;/strong&gt; — tag images with git SHA, never overwrite &lt;code&gt;:latest&lt;/code&gt; in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval gates&lt;/strong&gt; — require human approval before production deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit trail&lt;/strong&gt; — CloudTrail logs all deployment actions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Deployment Observability
&lt;/h2&gt;

&lt;p&gt;A deployment isn't done when the pipeline turns green. Monitor after deploy:&lt;/p&gt;

&lt;h3&gt;
  
  
  Post-Deploy Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deploy v2 → Wait 5 min → Check:
  ├── Error rate increased? → Rollback
  ├── Latency p99 &amp;gt; threshold? → Rollback
  ├── Health check failures? → Rollback
  └── All green → Deployment successful
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CloudWatch Alarms as Deployment Gates
&lt;/h3&gt;

&lt;p&gt;Configure CodeDeploy / ECS circuit breaker to monitor CloudWatch alarms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If alarm triggers during canary/linear deployment → automatic rollback&lt;/li&gt;
&lt;li&gt;No human intervention needed for obvious failures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Pipeline Anti-Patterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Anti-Pattern&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No staging environment&lt;/td&gt;
&lt;td&gt;Bugs found in production&lt;/td&gt;
&lt;td&gt;Always deploy to staging first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests only in CI, not in deployment&lt;/td&gt;
&lt;td&gt;Broken integration passes build&lt;/td&gt;
&lt;td&gt;Run integration tests post-deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual deployment to production&lt;/td&gt;
&lt;td&gt;Error-prone, unauditable&lt;/td&gt;
&lt;td&gt;Automate everything, gate with approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same pipeline for all environments&lt;/td&gt;
&lt;td&gt;No quality gates between stages&lt;/td&gt;
&lt;td&gt;Multi-stage with promotion (dev → staging → prod)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;:latest&lt;/code&gt; tag in production&lt;/td&gt;
&lt;td&gt;Can't tell which version is running&lt;/td&gt;
&lt;td&gt;Use git SHA or semantic version tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets in pipeline code&lt;/td&gt;
&lt;td&gt;Credential exposure&lt;/td&gt;
&lt;td&gt;Use OIDC, Secrets Manager, or Parameter Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No rollback plan&lt;/td&gt;
&lt;td&gt;Stuck with broken deployment&lt;/td&gt;
&lt;td&gt;Blue/green or canary with auto-rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;CI/CD on AWS comes down to three decisions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deployment strategy&lt;/strong&gt; — Rolling (simple), Blue/Green (zero-downtime), Canary (lowest risk), or Feature Flags (decouple deploy from release)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline tool&lt;/strong&gt; — CodePipeline (AWS-native, deep integration), GitHub Actions (flexible, multi-cloud), or GitLab CI (self-hosted, built-in security)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety mechanisms&lt;/strong&gt; — Approval gates, CloudWatch alarm-based rollback, immutable artifacts, shift-left security scanning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The 2026 default for containers:&lt;/strong&gt; ECS native blue/green with canary traffic shifting + configurable circuit breaker. No CodeDeploy needed for standard ECS workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 2026 default for pipeline:&lt;/strong&gt; GitHub Actions with OIDC auth for most teams. CodePipeline when you need native cross-account patterns or CodeDeploy's advanced strategies.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and DevOps practices. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cicd</category>
      <category>devops</category>
      <category>deployment</category>
    </item>
    <item>
      <title>AWS Database Selection Guide: RDS vs Aurora vs DynamoDB vs ElastiCache — Choosing the Right Database for Every Workload</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Mon, 17 Aug 2026 05:54:18 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-database-selection-guide-rds-vs-aurora-vs-dynamodb-vs-elasticache-choosing-the-right-13h0</link>
      <guid>https://dev.to/alpeshkumbhare/aws-database-selection-guide-rds-vs-aurora-vs-dynamodb-vs-elasticache-choosing-the-right-13h0</guid>
      <description>&lt;p&gt;AWS offers 15+ managed database services. Each is purpose-built for specific data models and access patterns. Choosing wrong means either fighting the database's design (performance problems) or over-engineering a simple workload (cost problems).&lt;/p&gt;

&lt;p&gt;The key insight: &lt;strong&gt;start with your access patterns, not the database.&lt;/strong&gt; How will data be read and written? What queries are critical? What's the read/write ratio? The answers point directly to the right service.&lt;/p&gt;

&lt;p&gt;This guide covers every AWS database service, organized by data model, with a decision framework that gets you to the right choice fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AWS Database Landscape
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────┐
│                       AWS DATABASE SERVICES                           │
├─────────────────────────────────────────────────────────────────────┤
│  RELATIONAL (SQL)                                                    │
│  RDS (MySQL, PostgreSQL, Oracle, SQL Server, MariaDB) | Aurora       │
├─────────────────────────────────────────────────────────────────────┤
│  KEY-VALUE / DOCUMENT (NoSQL)                                        │
│  DynamoDB                                                            │
├─────────────────────────────────────────────────────────────────────┤
│  IN-MEMORY (Caching / Real-Time)                                     │
│  ElastiCache (Redis/Valkey, Memcached) | MemoryDB for Redis          │
├─────────────────────────────────────────────────────────────────────┤
│  GRAPH                                                               │
│  Neptune                                                             │
├─────────────────────────────────────────────────────────────────────┤
│  TIME SERIES                                                         │
│  Timestream                                                          │
├─────────────────────────────────────────────────────────────────────┤
│  WIDE COLUMN                                                         │
│  Keyspaces (Cassandra-compatible)                                    │
├─────────────────────────────────────────────────────────────────────┤
│  SEARCH                                                              │
│  OpenSearch Service                                                  │
├─────────────────────────────────────────────────────────────────────┤
│  LEDGER                                                              │
│  QLDB (Quantum Ledger Database)                                      │
├─────────────────────────────────────────────────────────────────────┤
│  DATA WAREHOUSE                                                      │
│  Redshift                                                            │
├─────────────────────────────────────────────────────────────────────┤
│  VECTOR (AI/ML)                                                      │
│  Aurora (pgvector) | OpenSearch | MemoryDB | Neptune Analytics        │
└─────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Decision Flowchart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START
│
├── Need SQL, joins, transactions, complex queries?
│     ├── High performance, auto-scaling, global? → Aurora
│     └── Standard workload, specific engine (Oracle/SQL Server)? → RDS
│
├── Need key-value or simple document access at any scale?
│     └── DynamoDB
│
├── Need microsecond latency caching?
│     ├── Cache-aside pattern (volatile)? → ElastiCache
│     └── Need durability (primary datastore)? → MemoryDB
│
├── Need relationship traversal (social graph, fraud, recommendations)?
│     └── Neptune
│
├── Need time-series data (IoT, metrics, logs)?
│     └── Timestream
│
├── Need full-text search, log analytics?
│     └── OpenSearch
│
├── Need analytics on petabytes (BI, reporting)?
│     └── Redshift
│
├── Need vector similarity search (AI/RAG)?
│     └── Aurora pgvector / OpenSearch / MemoryDB
│
└── Need immutable, cryptographically verifiable ledger?
      └── QLDB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Relational Databases: RDS vs Aurora
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Amazon RDS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Managed relational database for MySQL, PostgreSQL, MariaDB, Oracle, SQL Server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS manages:&lt;/strong&gt; Patching, backups, Multi-AZ failover, monitoring.&lt;br&gt;
&lt;strong&gt;You manage:&lt;/strong&gt; Instance sizing, parameter tuning, schema design, query optimization.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Multi-AZ: synchronous standby for HA (automatic failover ~60 seconds)&lt;/li&gt;
&lt;li&gt;Read Replicas: up to 15 (async replication) for read scaling&lt;/li&gt;
&lt;li&gt;Automated backups: point-in-time recovery (35-day window)&lt;/li&gt;
&lt;li&gt;Storage auto-scaling: up to 64 TiB&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Amazon Aurora
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; AWS-rebuilt MySQL/PostgreSQL with cloud-native storage architecture. Compatible at the wire-protocol level (drop-in replacement).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Aurora over RDS:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RDS&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;1x (standard engine)&lt;/td&gt;
&lt;td&gt;3-5x MySQL, 3x PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;EBS (single AZ)&lt;/td&gt;
&lt;td&gt;Distributed across 3 AZs (6 copies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage limit&lt;/td&gt;
&lt;td&gt;64 TiB&lt;/td&gt;
&lt;td&gt;128 TiB (auto-grows)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failover&lt;/td&gt;
&lt;td&gt;~60 seconds&lt;/td&gt;
&lt;td&gt;~30 seconds (with Aurora Replicas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read replicas&lt;/td&gt;
&lt;td&gt;Up to 15 (async)&lt;/td&gt;
&lt;td&gt;Up to 15 (same storage, &amp;lt;10ms lag)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backtrack&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (rewind to point in time without restore)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Database&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (&amp;lt;1 second cross-region replication)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (Aurora Serverless v2 — scales to zero)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-master&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (Aurora DSQL — distributed SQL, new)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Choose RDS vs Aurora
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Choose RDS when...&lt;/th&gt;
&lt;th&gt;Choose Aurora when...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need Oracle or SQL Server&lt;/td&gt;
&lt;td&gt;MySQL or PostgreSQL workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget-constrained (RDS is cheaper for small instances)&lt;/td&gt;
&lt;td&gt;Need high availability (&amp;lt;30s failover)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple, low-traffic application&lt;/td&gt;
&lt;td&gt;Read-heavy workload (leverage replicas on shared storage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specific engine version required&lt;/td&gt;
&lt;td&gt;Need global database (cross-region DR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Need serverless (variable/unpredictable traffic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Need to scale storage beyond 64 TiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Aurora Serverless v2
&lt;/h3&gt;

&lt;p&gt;Scales compute automatically (0.5 to 256 ACUs) based on demand. You pay per ACU-hour consumed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Dev/test environments, variable workloads, new applications with unknown traffic patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not for:&lt;/strong&gt; Steady high-traffic production (provisioned instances are cheaper when utilization is consistently high).&lt;/p&gt;




&lt;h2&gt;
  
  
  DynamoDB: NoSQL at Any Scale
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Fully managed key-value and document database. Single-digit millisecond performance at any scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use DynamoDB
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Key-value or simple document access patterns&lt;/li&gt;
&lt;li&gt;Extreme scale (millions of requests/second)&lt;/li&gt;
&lt;li&gt;Predictable, consistent latency requirements&lt;/li&gt;
&lt;li&gt;Serverless architecture (scales to zero with on-demand mode)&lt;/li&gt;
&lt;li&gt;Global applications (Global Tables for multi-region active-active)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When NOT to Use DynamoDB
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complex queries with joins, aggregations, ad-hoc SQL&lt;/li&gt;
&lt;li&gt;Data model that requires normalization and relational integrity&lt;/li&gt;
&lt;li&gt;Analytics/reporting (use Redshift or Athena instead)&lt;/li&gt;
&lt;li&gt;Small dataset with complex query needs (Aurora is simpler)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DynamoDB Key Design Decisions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Capacity mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On-Demand (unpredictable traffic, pay per request) vs Provisioned (predictable, cheaper at scale)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partition key only (unique lookup) vs Partition + Sort key (range queries within partition)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global Tables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-region active-active replication (near-zero RPO)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DAX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-memory cache for DynamoDB (microsecond reads for hot data)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capture changes for event-driven processing (CDC)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  DynamoDB Pricing Reality
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On-Demand: $1.25 per million write requests, $0.25 per million reads
Provisioned: ~$0.00065 per WCU/hour, ~$0.00013 per RCU/hour

Storage: $0.25/GB/month

Example: 10M reads + 1M writes per day
On-Demand: ~$10/day = $300/month
Provisioned: ~$120/month (60% cheaper at consistent load)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ElastiCache vs MemoryDB: Caching and Real-Time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ElastiCache (Redis/Valkey or Memcached)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Caching layer in front of databases. Session storage. Leaderboards. Real-time analytics.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Redis/Valkey&lt;/th&gt;
&lt;th&gt;Memcached&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data structures&lt;/td&gt;
&lt;td&gt;Rich (strings, hashes, lists, sets, sorted sets)&lt;/td&gt;
&lt;td&gt;Simple key-value only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Optional (snapshot + AOF)&lt;/td&gt;
&lt;td&gt;None (volatile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication&lt;/td&gt;
&lt;td&gt;Yes (read replicas, Multi-AZ)&lt;/td&gt;
&lt;td&gt;No replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pub/Sub&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster mode&lt;/td&gt;
&lt;td&gt;Yes (horizontal sharding)&lt;/td&gt;
&lt;td&gt;Yes (simple sharding)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Primary cache + data structures&lt;/td&gt;
&lt;td&gt;Simple caching only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  MemoryDB for Redis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Redis-compatible, durable, in-memory database. Unlike ElastiCache (which is a cache), MemoryDB is a &lt;strong&gt;primary database&lt;/strong&gt; that happens to be in-memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key difference:&lt;/strong&gt; MemoryDB writes to a distributed transaction log before acknowledging — data survives node failures. ElastiCache can lose data on failover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use MemoryDB when:&lt;/strong&gt; You need microsecond reads AND durability (session store as source of truth, real-time user profiles, gaming state).&lt;/p&gt;




&lt;h2&gt;
  
  
  Purpose-Built Databases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Amazon Neptune (Graph)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Relationship-heavy data where traversals are the primary query pattern.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social networks (friend-of-friend queries)&lt;/li&gt;
&lt;li&gt;Fraud detection (link analysis)&lt;/li&gt;
&lt;li&gt;Recommendation engines (collaborative filtering)&lt;/li&gt;
&lt;li&gt;Knowledge graphs (entity relationships)&lt;/li&gt;
&lt;li&gt;Network topology (impact analysis)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOT for:&lt;/strong&gt; Simple lookups, transactional data, analytics. If you're not doing multi-hop traversals, you don't need a graph database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon Timestream (Time Series)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Time-stamped data that's primarily queried by time range.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IoT sensor data&lt;/li&gt;
&lt;li&gt;Application/infrastructure metrics&lt;/li&gt;
&lt;li&gt;Financial market data (ticks)&lt;/li&gt;
&lt;li&gt;Fleet/device telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why over DynamoDB:&lt;/strong&gt; Built-in time-based retention tiers (hot → cold → archive), time-series functions (interpolation, smoothing, aggregation), and automatic data lifecycle management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon Keyspaces (Cassandra)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Teams with existing Cassandra workloads wanting managed service. Wide-column data model for write-heavy workloads with predictable access patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon OpenSearch (Search + Analytics)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Full-text search, log analytics, application search, observability data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Powers CloudWatch Log Insights behind the scenes&lt;/li&gt;
&lt;li&gt;Kibana/OpenSearch Dashboards for visualization&lt;/li&gt;
&lt;li&gt;Vector search for AI/RAG applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Amazon QLDB (Ledger)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Immutable, cryptographically verifiable transaction history.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial transactions requiring audit trail&lt;/li&gt;
&lt;li&gt;Supply chain provenance tracking&lt;/li&gt;
&lt;li&gt;Regulatory compliance (tamper-proof records)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Amazon Redshift (Data Warehouse)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt; Analytical queries on large datasets (petabytes). BI reporting, data warehousing, complex aggregations across millions of rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOT for:&lt;/strong&gt; OLTP (transactional workloads) — use Aurora or DynamoDB instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vector Databases for AI/RAG
&lt;/h2&gt;

&lt;p&gt;With generative AI, vector similarity search is a new access pattern. AWS options:&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;Vector Capability&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Aurora PostgreSQL&lt;/strong&gt; (pgvector)&lt;/td&gt;
&lt;td&gt;Extension on existing Aurora&lt;/td&gt;
&lt;td&gt;Teams already on Aurora, moderate scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenSearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;k-NN plugin&lt;/td&gt;
&lt;td&gt;Large-scale similarity search + hybrid text/vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MemoryDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector search support&lt;/td&gt;
&lt;td&gt;Ultra-low latency vector retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neptune Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graph + vector&lt;/td&gt;
&lt;td&gt;Knowledge graph with semantic search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bedrock Knowledge Base&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed (any backend)&lt;/td&gt;
&lt;td&gt;Easiest path — managed vector storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Multi-Database Architecture Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: CQRS (Command Query Responsibility Segregation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Writes → Aurora (source of truth, transactions)
Reads → ElastiCache (cached hot data) + DynamoDB (materialized views)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 2: Event Sourcing + Materialized Views
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Events → DynamoDB (event store) → Streams → Lambda → 
  ├── OpenSearch (search index)
  ├── ElastiCache (real-time aggregations)
  └── Redshift (analytics)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 3: Polyglot Persistence
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Profiles → DynamoDB (key-value, high scale)
Product Catalog → Aurora (relational, complex queries)
Recommendations → Neptune (graph traversal)
Session State → ElastiCache (microsecond, volatile)
Search → OpenSearch (full-text)
Analytics → Redshift (OLAP, BI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB for ad-hoc SQL queries&lt;/td&gt;
&lt;td&gt;Expensive scans, poor performance&lt;/td&gt;
&lt;td&gt;Use Aurora or Athena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora for simple key-value access&lt;/td&gt;
&lt;td&gt;Over-engineered, slower than DynamoDB&lt;/td&gt;
&lt;td&gt;Use DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache as primary datastore&lt;/td&gt;
&lt;td&gt;Data loss on failover&lt;/td&gt;
&lt;td&gt;Use MemoryDB if durability needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single database for everything&lt;/td&gt;
&lt;td&gt;One size fits none&lt;/td&gt;
&lt;td&gt;Polyglot persistence (right DB per access pattern)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redshift for OLTP&lt;/td&gt;
&lt;td&gt;Terrible latency for single-row reads&lt;/td&gt;
&lt;td&gt;Use Aurora or DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring connection pooling (Aurora)&lt;/td&gt;
&lt;td&gt;Connection exhaustion under load&lt;/td&gt;
&lt;td&gt;Use RDS Proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB without understanding key design&lt;/td&gt;
&lt;td&gt;Hot partitions, throttling&lt;/td&gt;
&lt;td&gt;Design partition key for even distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cost Comparison (Typical Web App)
&lt;/h2&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;Starting Cost (dev)&lt;/th&gt;
&lt;th&gt;Production Estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS db.t4g.medium&lt;/td&gt;
&lt;td&gt;~$50/month&lt;/td&gt;
&lt;td&gt;~$200-500/month (Multi-AZ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Serverless v2 (min 0.5 ACU)&lt;/td&gt;
&lt;td&gt;~$45/month&lt;/td&gt;
&lt;td&gt;Scales with usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Provisioned (db.r6g.large)&lt;/td&gt;
&lt;td&gt;~$180/month&lt;/td&gt;
&lt;td&gt;~$400-800/month (Multi-AZ + replicas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB (On-Demand, light)&lt;/td&gt;
&lt;td&gt;~$5-25/month&lt;/td&gt;
&lt;td&gt;Scales per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache (cache.t4g.small)&lt;/td&gt;
&lt;td&gt;~$25/month&lt;/td&gt;
&lt;td&gt;~$100-300/month (Multi-AZ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenSearch (t3.small.search)&lt;/td&gt;
&lt;td&gt;~$35/month&lt;/td&gt;
&lt;td&gt;~$200-500/month (Multi-AZ)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AWS database selection is driven by &lt;strong&gt;access patterns&lt;/strong&gt;, not features:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Access Pattern&lt;/th&gt;
&lt;th&gt;Database&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQL, joins, transactions, complex queries&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Aurora&lt;/strong&gt; (or RDS for Oracle/SQL Server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key-value lookups at massive scale&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsecond caching (volatile)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ElastiCache&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsecond reads (durable)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MemoryDB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relationship traversal (graph)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Neptune&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-series data&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Timestream&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text search&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;OpenSearch&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytical queries (BI)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redshift&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector similarity (AI/RAG)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Aurora pgvector&lt;/strong&gt; or &lt;strong&gt;OpenSearch&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immutable audit ledger&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;QLDB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The guiding principle:&lt;/strong&gt; One database rarely fits all access patterns. Use purpose-built databases for each pattern (polyglot persistence), connected by event-driven synchronization.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS data architecture and cloud infrastructure automation. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>database</category>
      <category>architecture</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Event-Driven Architecture on AWS: SQS vs SNS vs EventBridge vs Kinesis — Patterns, Anti-Patterns, and When to Use What</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Fri, 14 Aug 2026 05:38:42 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/event-driven-architecture-on-aws-sqs-vs-sns-vs-eventbridge-vs-kinesis-patterns-anti-patterns-4l7l</link>
      <guid>https://dev.to/alpeshkumbhare/event-driven-architecture-on-aws-sqs-vs-sns-vs-eventbridge-vs-kinesis-patterns-anti-patterns-4l7l</guid>
      <description>&lt;p&gt;Event-driven architecture (EDA) is how modern distributed systems communicate at scale. Instead of services calling each other directly (tight coupling), services emit events ("this happened") and interested consumers react independently.&lt;/p&gt;

&lt;p&gt;On AWS, four messaging services form the EDA backbone — but they solve different problems. Choosing wrong means either over-engineering a simple notification into a Kinesis stream, or under-engineering a high-throughput data pipeline onto SQS.&lt;/p&gt;

&lt;p&gt;This guide maps each service to its sweet spot, covers the integration patterns that work in production, and highlights the anti-patterns that waste money and create operational pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Messaging Services
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────────┐
│                    AWS MESSAGING LANDSCAPE                             │
├──────────────┬──────────────┬───────────────────┬────────────────────┤
│     SQS      │     SNS      │   EventBridge     │     Kinesis        │
│              │              │                   │                    │
│  Queue       │  Pub/Sub     │  Event Bus        │  Stream            │
│  (1:1)       │  (1:many)    │  (content-route)  │  (ordered, replay) │
│              │              │                   │                    │
│  Decouple    │  Fan-out     │  Route + Filter   │  Real-time data    │
│  + buffer    │  broadcast   │  + transform      │  high throughput   │
└──────────────┴──────────────┴───────────────────┴────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you need...&lt;/th&gt;
&lt;th&gt;Use...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Decouple producer/consumer, buffer load&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send one event to many subscribers&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SNS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route events based on content/attributes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EventBridge&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Receive events from SaaS (Stripe, Auth0, Shopify)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EventBridge&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process ordered, replayable data stream&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Streams&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-throughput ingestion (100K+ events/sec)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fan-out + per-consumer buffering&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SNS → SQS&lt;/strong&gt; (combined)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transform/enrich events between services&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EventBridge Pipes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule future events (cron)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EventBridge Scheduler&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Amazon SQS: The Queue
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Point-to-point message queue. One producer puts messages, one consumer processes them. Messages are buffered until consumed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two Flavors
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard Queue&lt;/th&gt;
&lt;th&gt;FIFO Queue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ordering&lt;/td&gt;
&lt;td&gt;Best-effort (may reorder)&lt;/td&gt;
&lt;td&gt;Strict FIFO guaranteed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deduplication&lt;/td&gt;
&lt;td&gt;At-least-once (may duplicate)&lt;/td&gt;
&lt;td&gt;Exactly-once processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;3,000 msg/sec (with batching: 30,000)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;High throughput, order doesn't matter&lt;/td&gt;
&lt;td&gt;Financial transactions, command sequences&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use SQS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Load leveling&lt;/strong&gt; — smooth bursty traffic (e.g., API receives 10K requests/sec, worker processes at 1K/sec)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling&lt;/strong&gt; — producer doesn't need to know about consumer (or if it's running)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry/DLQ&lt;/strong&gt; — failed messages automatically route to Dead Letter Queue for investigation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing&lt;/strong&gt; — Lambda polls SQS, processes in batches of up to 10&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SQS Architecture Pattern: Work Queue
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────┐     ┌──────────┐     ┌──────────────┐
│  API GW  │────→│   SQS    │────→│ Lambda / ECS │
│  (burst) │     │  (buffer)│     │  (steady)    │
└──────────┘     └──────────┘     └──────────────┘
                       │
                       ▼ (after 3 failures)
                 ┌──────────┐
                 │   DLQ    │
                 └──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Amazon SNS: Pub/Sub Fan-Out
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Publish-subscribe messaging. One publisher sends to a topic, multiple subscribers receive copies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subscriber Types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SQS queues (most common — adds buffering per consumer)&lt;/li&gt;
&lt;li&gt;Lambda functions (direct invocation)&lt;/li&gt;
&lt;li&gt;HTTP/HTTPS endpoints (webhooks)&lt;/li&gt;
&lt;li&gt;Email / SMS (notifications)&lt;/li&gt;
&lt;li&gt;Kinesis Data Firehose (streaming delivery)&lt;/li&gt;
&lt;li&gt;Mobile push (iOS/Android)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Use SNS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fan-out&lt;/strong&gt; — one event needs to trigger multiple independent actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications&lt;/strong&gt; — email alerts, SMS, mobile push&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupled fan-out&lt;/strong&gt; — SNS → multiple SQS queues (each consumer has its own queue)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SNS + SQS: The Fan-Out Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         ┌──── SQS (Email Service) ──→ Lambda: send email
                         │
Producer ──→ SNS Topic ──┼──── SQS (Analytics) ──→ Lambda: track metrics
                         │
                         └──── SQS (Inventory) ──→ Lambda: update stock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each consumer gets its own SQS queue with independent retry and DLQ. One consumer's failure doesn't affect others.&lt;/p&gt;




&lt;h2&gt;
  
  
  Amazon EventBridge: The Event Router
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Serverless event bus with content-based routing. Events flow in, rules match patterns, and events route to targets — all without code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why EventBridge Over SNS
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SNS&lt;/th&gt;
&lt;th&gt;EventBridge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filtering&lt;/td&gt;
&lt;td&gt;Basic attribute filtering&lt;/td&gt;
&lt;td&gt;Rich content-based rules (any JSON field)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Schema registry + discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS integration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;30+ SaaS partners (Stripe, Auth0, Zendesk)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archive &amp;amp; replay&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (replay events from any point in time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;Complex&lt;/td&gt;
&lt;td&gt;Native (event bus sharing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transforms&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Input transformer (reshape events before delivery)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;EventBridge Pipes (filter → enrich → transform → deliver)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Per publish + delivery&lt;/td&gt;
&lt;td&gt;Per event ingested ($1/million)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use EventBridge
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content-based routing&lt;/strong&gt; — route events based on any field in the event body&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS events&lt;/strong&gt; — receive events from third-party services without polling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-account event sharing&lt;/strong&gt; — centralized event bus for multi-account architectures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event replay&lt;/strong&gt; — archive events and replay when debugging or reprocessing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema enforcement&lt;/strong&gt; — discover and validate event schemas automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EventBridge Rule Example
&lt;/h3&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;"source"&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="s2"&gt;"com.myapp.orders"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail-type"&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="s2"&gt;"OrderCreated"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail"&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;"amount"&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="nl"&gt;"numeric"&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="s2"&gt;"&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;]}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"region"&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="s2"&gt;"eu-west-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eu-central-1"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rule matches only: orders &amp;gt; $1000 from EU regions. Everything else is ignored. No code needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  EventBridge Architecture Pattern: Event Mesh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐        ┌─────────────────┐        ┌─────────────┐
│ Order Service│──emit──→│  EventBridge    │──rule──→│ Payment Svc │
└─────────────┘        │  (Central Bus)  │        └─────────────┘
                        │                 │
┌─────────────┐        │  Rules:         │        ┌─────────────┐
│ Auth0 (SaaS)│──emit──→│  • OrderCreated │──rule──→│Warehouse Svc│
└─────────────┘        │  • UserSignedUp │        └─────────────┘
                        │  • PaymentFailed│
┌─────────────┐        │                 │        ┌─────────────┐
│ Stripe(SaaS)│──emit──→│                 │──rule──→│ Notification│
└─────────────┘        └─────────────────┘        └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Amazon Kinesis: The Data Stream
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Real-time data streaming for high-throughput, ordered, replayable event processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kinesis Family
&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;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Streams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom real-time stream processing (you control consumers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Firehose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed delivery to S3, Redshift, OpenSearch (zero code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis Data Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL/Flink on streaming data (real-time analytics)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Kinesis Over SQS/EventBridge
&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;SQS/EventBridge&lt;/th&gt;
&lt;th&gt;Kinesis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ordering guarantee&lt;/td&gt;
&lt;td&gt;FIFO SQS (limited)&lt;/td&gt;
&lt;td&gt;Per-shard ordering (scalable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event replay&lt;/td&gt;
&lt;td&gt;EventBridge archive&lt;/td&gt;
&lt;td&gt;Native (24h-365d retention)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple consumers on same stream&lt;/td&gt;
&lt;td&gt;❌ (SNS fan-out)&lt;/td&gt;
&lt;td&gt;✅ (multiple consumers, each at own position)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Millions/sec (SQS)&lt;/td&gt;
&lt;td&gt;1MB/sec per shard (scale shards)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time analytics&lt;/td&gt;
&lt;td&gt;Not designed for&lt;/td&gt;
&lt;td&gt;Built for this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Application events, notifications&lt;/td&gt;
&lt;td&gt;IoT telemetry, clickstream, logs, financial ticks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Kinesis Architecture Pattern: Real-Time Analytics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────┐     ┌─────────────┐     ┌───────────────────┐
│ IoT Devices│────→│  Kinesis     │────→│ Lambda (real-time) │
│ Clickstream│     │  Data Stream │     │ Anomaly detection  │
│ App Logs   │     │  (ordered)   │     └───────────────────┘
└────────────┘     └──────┬──────┘
                          │
                          ├────→ Firehose → S3 (data lake)
                          └────→ Flink (windowed aggregations)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  EventBridge Pipes: Connect + Transform
&lt;/h2&gt;

&lt;p&gt;EventBridge Pipes (launched 2023) connects sources to targets with optional filtering, enrichment, and transformation — without writing Lambda glue code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source → Filter → Enrich → Transform → Target

Example:
SQS Queue → filter (only "critical") → Lambda (add metadata) → reshape JSON → EventBridge Bus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Supported Sources &amp;amp; Targets
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; SQS, Kinesis, DynamoDB Streams, Kafka (MSK), Self-Managed Kafka&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Targets:&lt;/strong&gt; Lambda, Step Functions, ECS Task, EventBridge Bus, API Gateway, SQS, SNS, Kinesis, and more&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use Pipes vs Lambda
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Pipes&lt;/th&gt;
&lt;th&gt;Lambda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filter + route (no business logic)&lt;/td&gt;
&lt;td&gt;✅ No code&lt;/td&gt;
&lt;td&gt;Overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple field transformation&lt;/td&gt;
&lt;td&gt;✅ Input transformer&lt;/td&gt;
&lt;td&gt;Overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex business logic&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enrich from external API&lt;/td&gt;
&lt;td&gt;✅ (enrichment step)&lt;/td&gt;
&lt;td&gt;Also works&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  EventBridge Scheduler
&lt;/h2&gt;

&lt;p&gt;For time-based events, EventBridge Scheduler replaces CloudWatch Events (cron):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-time schedules&lt;/strong&gt; — "send reminder email in 48 hours"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring schedules&lt;/strong&gt; — "run cleanup every day at 2 AM"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate-based&lt;/strong&gt; — "trigger every 5 minutes"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timezone-aware&lt;/strong&gt; — handles DST correctly (CloudWatch Events doesn't)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At-scale&lt;/strong&gt; — millions of individual schedules (one per user/order/entity)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Schedule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;one-time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;future&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&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;"ScheduleExpression"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"at(2026-08-20T14:00:00)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Target"&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;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:...:send-reminder"&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"&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="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;orderId&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;order-123&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;action&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;follow-up&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Integration Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: Command Queue (SQS)
&lt;/h3&gt;

&lt;p&gt;Use for: async task processing, work distribution&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API → SQS → Worker (Lambda/ECS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 2: Fan-Out (SNS → SQS)
&lt;/h3&gt;

&lt;p&gt;Use for: one event, multiple independent reactions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Service → SNS → SQS(A) → Consumer A
                → SQS(B) → Consumer B
                → SQS(C) → Consumer C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 3: Event Router (EventBridge)
&lt;/h3&gt;

&lt;p&gt;Use for: content-based routing, SaaS integration, cross-account&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Services → EventBridge Bus → Rules → Targets (Lambda, SQS, Step Functions)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 4: Streaming Pipeline (Kinesis)
&lt;/h3&gt;

&lt;p&gt;Use for: real-time ordered data, multiple consumers, replay&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Producers → Kinesis → Consumer A (real-time alerts)
                    → Consumer B (S3 archive via Firehose)
                    → Consumer C (analytics via Flink)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern 5: Choreography (EventBridge, cross-service)
&lt;/h3&gt;

&lt;p&gt;Use for: loosely coupled microservice workflows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Created → (event) → Payment Service reacts
Payment Succeeded → (event) → Shipping Service reacts
Shipping Completed → (event) → Notification Service reacts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No orchestrator. Each service reacts independently to relevant events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 6: Orchestration + Events (Step Functions + EventBridge)
&lt;/h3&gt;

&lt;p&gt;Use for: complex workflows with visibility + event-driven triggers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EventBridge detects event → triggers Step Function →
Step Function orchestrates multi-step workflow →
emits completion event back to EventBridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Anti-Patterns to Avoid
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Anti-Pattern&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Using Kinesis for simple notifications&lt;/td&gt;
&lt;td&gt;Expensive, complex for low throughput&lt;/td&gt;
&lt;td&gt;SQS or SNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS for fan-out (multiple consumers)&lt;/td&gt;
&lt;td&gt;Only one consumer per message&lt;/td&gt;
&lt;td&gt;SNS → SQS pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge for 100K+ events/sec&lt;/td&gt;
&lt;td&gt;Soft limits, cost adds up&lt;/td&gt;
&lt;td&gt;Kinesis for high throughput&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synchronous chains disguised as events&lt;/td&gt;
&lt;td&gt;Hidden coupling, hard to debug&lt;/td&gt;
&lt;td&gt;True async with DLQs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No Dead Letter Queue&lt;/td&gt;
&lt;td&gt;Lost messages on failure&lt;/td&gt;
&lt;td&gt;Always configure DLQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giant event payloads (&amp;gt;256KB)&lt;/td&gt;
&lt;td&gt;Exceeds size limits&lt;/td&gt;
&lt;td&gt;Store payload in S3, pass reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No event schema/contract&lt;/td&gt;
&lt;td&gt;Breaking consumers on format change&lt;/td&gt;
&lt;td&gt;EventBridge Schema Registry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring idempotency&lt;/td&gt;
&lt;td&gt;Duplicate processing causes data corruption&lt;/td&gt;
&lt;td&gt;Design consumers to be idempotent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cost Comparison
&lt;/h2&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;Pricing Model&lt;/th&gt;
&lt;th&gt;Cost at 10M events/month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQS Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.40/million requests&lt;/td&gt;
&lt;td&gt;~$4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQS FIFO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.50/million requests&lt;/td&gt;
&lt;td&gt;~$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.50/million publishes + delivery costs&lt;/td&gt;
&lt;td&gt;~$5-15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EventBridge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.00/million events&lt;/td&gt;
&lt;td&gt;~$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis (1 shard)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.015/hr + $0.014/million PUT&lt;/td&gt;
&lt;td&gt;~$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinesis (10 shards)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.15/hr + $0.014/million PUT&lt;/td&gt;
&lt;td&gt;~$110&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; SQS is cheapest for simple queuing. EventBridge costs 2.5x SQS but provides routing, filtering, schema, archive, and replay. Kinesis is the most expensive but provides ordering, replay, and real-time stream processing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Event-driven architecture on AWS comes down to four services with distinct strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQS&lt;/strong&gt; — queue + buffer. Decouple producer and consumer. Simple, cheap, reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SNS&lt;/strong&gt; — fan-out. One event to many subscribers. Combine with SQS for durability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge&lt;/strong&gt; — intelligent routing. Content-based filtering, SaaS integration, archive/replay, cross-account. The "default choice" for new EDA designs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kinesis&lt;/strong&gt; — ordered stream. High throughput, multiple consumers, real-time processing. Use for data pipelines, not application events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The default starting point in 2026:&lt;/strong&gt; EventBridge for routing + SQS for buffering. Add Kinesis only when you need ordering, replay at volume, or real-time analytics. Use SNS when you need mobile push or email notifications.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and event-driven cloud architecture. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>architecture</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>AWS Observability in 2026: The Complete Stack — CloudWatch, X-Ray, OpenTelemetry, and Application Signals</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Thu, 13 Aug 2026 09:11:41 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-observability-in-2026-the-complete-stack-cloudwatch-x-ray-opentelemetry-and-application-1ek</link>
      <guid>https://dev.to/alpeshkumbhare/aws-observability-in-2026-the-complete-stack-cloudwatch-x-ray-opentelemetry-and-application-1ek</guid>
      <description>&lt;p&gt;You can't fix what you can't see. As systems grow more distributed — microservices, serverless functions, event-driven flows — the gap between "deployed" and "observable" becomes the difference between resolving incidents in minutes versus hours.&lt;/p&gt;

&lt;p&gt;AWS's observability stack has evolved significantly. X-Ray SDK entered maintenance mode in February 2026, replaced by OpenTelemetry. Application Signals introduced SLO-based monitoring. CloudWatch absorbed capabilities that previously required third-party tools.&lt;/p&gt;

&lt;p&gt;This post covers the complete AWS observability architecture for modern applications — what to collect, where to send it, and how to build alerting that actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of Observability
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   METRICS   │    │    LOGS     │    │   TRACES    │
│             │    │             │    │             │
│ What's      │    │ What        │    │ Where in    │
│ happening?  │    │ happened?   │    │ the path?   │
│             │    │             │    │             │
│ CPU, memory │    │ Error msgs  │    │ Request     │
│ request rate│    │ debug info  │    │ flow across │
│ error count │    │ audit trail │    │ services    │
│ latency p99 │    │             │    │             │
└─────────────┘    └─────────────┘    └─────────────┘
      │                   │                   │
      └───────────────────┼───────────────────┘
                          │
                    ┌─────────────┐
                    │ CORRELATION │
                    │ Trace ID →  │
                    │ connects    │
                    │ all three   │
                    └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt; tell you WHAT is wrong (error rate spiked).&lt;br&gt;
&lt;strong&gt;Logs&lt;/strong&gt; tell you WHY it's wrong (NullPointerException at line 42).&lt;br&gt;
&lt;strong&gt;Traces&lt;/strong&gt; tell you WHERE in the request path it went wrong (payment-service → database timeout).&lt;/p&gt;

&lt;p&gt;All three need a common correlation key (trace ID) to be useful together.&lt;/p&gt;
&lt;h2&gt;
  
  
  The AWS Observability Stack
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  COLLECTION (Instrumentation)                                    │
│  ADOT (OpenTelemetry) | CloudWatch Agent | SDKs                  │
├─────────────────────────────────────────────────────────────────┤
│  PROCESSING &amp;amp; STORAGE                                            │
│  CloudWatch (Metrics + Logs) | X-Ray (Traces) | S3 (Archive)    │
├─────────────────────────────────────────────────────────────────┤
│  ANALYSIS                                                        │
│  Log Insights | Metrics Insights | Trace Analytics | ServiceLens │
├─────────────────────────────────────────────────────────────────┤
│  SLO &amp;amp; ALERTING                                                  │
│  Application Signals | CloudWatch Alarms | Composite Alarms      │
├─────────────────────────────────────────────────────────────────┤
│  VISUALIZATION                                                   │
│  CloudWatch Dashboards | ServiceLens Map | Managed Grafana        │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Metrics: CloudWatch Metrics + EMF
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Default Metrics (Free)
&lt;/h3&gt;

&lt;p&gt;AWS services automatically emit metrics to CloudWatch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2: CPU, network, disk, status checks&lt;/li&gt;
&lt;li&gt;ECS/Fargate: CPU, memory utilization per task&lt;/li&gt;
&lt;li&gt;Lambda: invocations, duration, errors, throttles, cold starts&lt;/li&gt;
&lt;li&gt;ALB: request count, latency, HTTP 4xx/5xx, healthy host count&lt;/li&gt;
&lt;li&gt;RDS: connections, IOPS, replication lag, free storage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Custom Metrics
&lt;/h3&gt;

&lt;p&gt;For application-specific metrics, use &lt;strong&gt;Embedded Metric Format (EMF)&lt;/strong&gt;:&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;"_aws"&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;"Timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1692286800000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CloudWatchMetrics"&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;"Namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MyApp/Orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Dimensions"&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="s2"&gt;"Service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Environment"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Metrics"&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="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OrdersProcessed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Count"&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="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ProcessingTime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Milliseconds"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order-service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"OrdersProcessed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ProcessingTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;230&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;p&gt;&lt;strong&gt;Why EMF over PutMetricData:&lt;/strong&gt; EMF lets you log structured JSON that CloudWatch automatically extracts as metrics AND preserves as log entries — one write, two outputs. No PutMetricData API calls (cheaper, lower latency).&lt;/p&gt;

&lt;h3&gt;
  
  
  Container Insights
&lt;/h3&gt;

&lt;p&gt;For ECS and EKS, Container Insights provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-container CPU and memory&lt;/li&gt;
&lt;li&gt;Per-pod/task network I/O&lt;/li&gt;
&lt;li&gt;Cluster-level resource utilization&lt;/li&gt;
&lt;li&gt;Kubernetes-aware dimensions (namespace, deployment, pod)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enable with: ADOT collector as DaemonSet (EKS) or sidecar (ECS).&lt;/p&gt;




&lt;h2&gt;
  
  
  Logs: CloudWatch Logs + Log Insights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Structured Logging (Essential)
&lt;/h3&gt;

&lt;p&gt;Unstructured logs are unsearchable at scale. Always log structured JSON:&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;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-13T10:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment-service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"traceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1-abc123-def456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"req-789"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TimeoutException"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cust-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;99.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5002&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;h3&gt;
  
  
  Log Insights Queries
&lt;/h3&gt;

&lt;p&gt;CloudWatch Log Insights provides SQL-like querying across log groups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Find&lt;/span&gt; &lt;span class="n"&gt;slowest&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;
&lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requestId&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;duration_ms&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="n"&gt;duration_ms&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;limit&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;
&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"ERROR"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="k"&gt;count&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="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Trace&lt;/span&gt; &lt;span class="k"&gt;specific&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="n"&gt;across&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;
&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;traceId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"1-abc123-def456"&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;asc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Log Architecture Patterns
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direct to CloudWatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda (automatic), ECS (awslogs driver), EKS (Fluent Bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudWatch → S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Long-term retention, compliance archives (subscription filter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudWatch → OpenSearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Need full-text search, complex aggregations, Kibana dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADOT → CloudWatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenTelemetry-based collection with CloudWatch backend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Retention and Cost
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set retention policies per log group (don't default to "never expire")&lt;/li&gt;
&lt;li&gt;Production: 30-90 days in CloudWatch, archive to S3 Glacier after&lt;/li&gt;
&lt;li&gt;Dev/staging: 7-14 days (no archival)&lt;/li&gt;
&lt;li&gt;Infrequent Access class: 50% cheaper for logs you rarely query&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Traces: X-Ray + OpenTelemetry (ADOT)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Migration: X-Ray SDK → OpenTelemetry
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; X-Ray SDK entered maintenance mode in February 2026. AWS now recommends OpenTelemetry for all new instrumentation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old Approach&lt;/th&gt;
&lt;th&gt;New Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X-Ray SDK (language-specific)&lt;/td&gt;
&lt;td&gt;AWS Distro for OpenTelemetry (ADOT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proprietary trace format&lt;/td&gt;
&lt;td&gt;OpenTelemetry (OTel) standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS-only export&lt;/td&gt;
&lt;td&gt;Export to X-Ray, Jaeger, Zipkin, Grafana Tempo, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-instrumentation (limited)&lt;/td&gt;
&lt;td&gt;Auto-instrumentation (comprehensive)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ADOT Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────┐     ┌──────────────┐     ┌─────────────┐
│Application │────→│ ADOT Collector│────→│  X-Ray      │
│(OTel SDK)  │     │ (sidecar or  │     │  CloudWatch │
│            │     │  DaemonSet)  │     │  Prometheus │
└────────────┘     └──────────────┘     └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ADOT Collector&lt;/strong&gt; receives traces/metrics via OTLP protocol and exports to one or more backends. You can send to X-Ray AND Grafana Tempo simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-Instrumentation (Zero Code Changes)
&lt;/h3&gt;

&lt;p&gt;For Java, Python, Node.js, and .NET — ADOT auto-instrumentation captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP requests (incoming and outgoing)&lt;/li&gt;
&lt;li&gt;Database queries (SQL, DynamoDB, Redis)&lt;/li&gt;
&lt;li&gt;AWS SDK calls (S3, SQS, SNS, Lambda invocations)&lt;/li&gt;
&lt;li&gt;gRPC calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EKS:&lt;/strong&gt; Deploy ADOT auto-instrumentation as a Kubernetes operator — injects instrumentation into pods automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lambda:&lt;/strong&gt; Enable Lambda X-Ray Active Tracing — one toggle, zero code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trace Anatomy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trace: 1-abc123-def456 (entire request lifecycle)
│
├── Span: API Gateway (12ms)
│     └── Span: Lambda: order-handler (450ms)
│           ├── Span: DynamoDB: GetItem (23ms)
│           ├── Span: HTTP: payment-service (380ms)
│           │     └── Span: RDS: INSERT (45ms)  ← SLOW?
│           └── Span: SQS: SendMessage (15ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each span shows: service name, duration, status, metadata. Find the bottleneck instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Application Signals: SLO-Based Monitoring
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Application Signals&lt;/strong&gt; (GA 2025) is CloudWatch's answer to "monitor what matters to users" — automatically tracks SLIs (Service Level Indicators) and lets you define SLOs (Service Level Objectives).&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Auto-Discovers
&lt;/h3&gt;

&lt;p&gt;Without any configuration, Application Signals detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Services and their dependencies (service map)&lt;/li&gt;
&lt;li&gt;Call volume between services&lt;/li&gt;
&lt;li&gt;Latency (p50, p90, p99)&lt;/li&gt;
&lt;li&gt;Error rate and fault rate&lt;/li&gt;
&lt;li&gt;Availability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Defining SLOs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SLO: "Payment Service Availability"
├── SLI: Success rate (HTTP 2xx / total requests)
├── Target: 99.9% over 30-day rolling window
├── Error budget: 0.1% (43 minutes/month of allowed errors)
└── Alert: When burn rate exceeds 10x normal → page on-call
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why SLOs &amp;gt; Threshold Alarms
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Alarm&lt;/th&gt;
&lt;th&gt;SLO-Based Alert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"CPU &amp;gt; 80%" → alert&lt;/td&gt;
&lt;td&gt;"Error budget burning too fast" → alert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Noisy, often false positive&lt;/td&gt;
&lt;td&gt;Only fires when users are impacted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measures infrastructure health&lt;/td&gt;
&lt;td&gt;Measures user experience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doesn't account for context&lt;/td&gt;
&lt;td&gt;Accounts for error budget remaining&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Alerting That Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Alarm Strategy
&lt;/h3&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;What to Alert On&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SLO breach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error budget burn rate &amp;gt; threshold&lt;/td&gt;
&lt;td&gt;Page on-call immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service health&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error rate &amp;gt; 5% for 5 minutes&lt;/td&gt;
&lt;td&gt;Page on-call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Saturation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU &amp;gt; 85%, memory &amp;gt; 90%, disk &amp;gt; 80%&lt;/td&gt;
&lt;td&gt;Auto-scale + notify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upstream latency &amp;gt; SLA&lt;/td&gt;
&lt;td&gt;Notify (not page)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orders/min drops &amp;gt; 50%&lt;/td&gt;
&lt;td&gt;Alert business + engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Composite Alarms
&lt;/h3&gt;

&lt;p&gt;Reduce noise by combining related alarms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CompositeAlarm: "Payment Service Degraded"
├── AND: Error rate &amp;gt; 5%
├── AND: Latency p99 &amp;gt; 2000ms
└── AND: NOT in maintenance window

→ Only fires when BOTH error rate AND latency are degraded
→ Eliminates false positives from single-metric spikes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alert Routing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch Alarm → SNS Topic → Multiple targets:
├── PagerDuty/Opsgenie (critical: pages on-call)
├── Slack channel (warning: notification only)
├── Lambda (auto-remediation for known issues)
└── ITSM (ServiceNow incident creation)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Dashboards: What to Show
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Per-Service Dashboard (Auto-Generated with Application Signals)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Request rate (rpm)&lt;/li&gt;
&lt;li&gt;Error rate (%)&lt;/li&gt;
&lt;li&gt;Latency (p50, p90, p99)&lt;/li&gt;
&lt;li&gt;Dependency health (downstream services)&lt;/li&gt;
&lt;li&gt;Recent deployments (correlate changes with metrics)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Platform Dashboard (SRE/Platform Team)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SLO status across all services (green/yellow/red)&lt;/li&gt;
&lt;li&gt;Error budget remaining per service&lt;/li&gt;
&lt;li&gt;Top 5 highest-latency services&lt;/li&gt;
&lt;li&gt;Recent alerts and resolution time&lt;/li&gt;
&lt;li&gt;Deployment frequency and failure rate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost Dashboard (FinOps)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Compute spend trend (CloudWatch billing metric)&lt;/li&gt;
&lt;li&gt;Data transfer costs by service&lt;/li&gt;
&lt;li&gt;Lambda invocations/cost correlation&lt;/li&gt;
&lt;li&gt;Over-provisioned resources (Compute Optimizer findings)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Observability for Different Architectures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serverless (Lambda + API Gateway + DynamoDB)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;CloudWatch (auto) + EMF for custom&lt;/td&gt;
&lt;td&gt;Lambda Powertools library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;CloudWatch Logs (auto)&lt;/td&gt;
&lt;td&gt;Structured JSON, set retention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces&lt;/td&gt;
&lt;td&gt;X-Ray Active Tracing (one toggle)&lt;/td&gt;
&lt;td&gt;Zero code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLOs&lt;/td&gt;
&lt;td&gt;Application Signals&lt;/td&gt;
&lt;td&gt;Auto-discovers Lambda services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Containers (ECS/EKS + ALB + RDS)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;Container Insights + EMF&lt;/td&gt;
&lt;td&gt;ADOT collector as sidecar/DaemonSet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;CloudWatch (awslogs/Fluent Bit)&lt;/td&gt;
&lt;td&gt;Structured JSON, per-container log groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces&lt;/td&gt;
&lt;td&gt;ADOT (OpenTelemetry)&lt;/td&gt;
&lt;td&gt;Auto-instrumentation operator (EKS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLOs&lt;/td&gt;
&lt;td&gt;Application Signals&lt;/td&gt;
&lt;td&gt;Service map auto-discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Hybrid (Containers + Lambda + Step Functions)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;Container Insights + Lambda metrics&lt;/td&gt;
&lt;td&gt;Unified CloudWatch namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;CloudWatch Logs (all services)&lt;/td&gt;
&lt;td&gt;Common trace ID in all log entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces&lt;/td&gt;
&lt;td&gt;ADOT + X-Ray Active Tracing&lt;/td&gt;
&lt;td&gt;Trace propagation across Lambda→ECS→SQS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLOs&lt;/td&gt;
&lt;td&gt;Application Signals&lt;/td&gt;
&lt;td&gt;End-to-end service map&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cost Optimization for Observability
&lt;/h2&gt;

&lt;p&gt;Observability itself can be expensive. Control costs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lever&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Log retention policies (don't keep forever)&lt;/td&gt;
&lt;td&gt;50-80% on log storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrequent Access log class&lt;/td&gt;
&lt;td&gt;50% for rarely-queried logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMF instead of PutMetricData API&lt;/td&gt;
&lt;td&gt;Avoid per-metric API charges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sampling traces (e.g., 10% of requests)&lt;/td&gt;
&lt;td&gt;90% trace storage savings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metric filters instead of full log queries&lt;/td&gt;
&lt;td&gt;Reduce Log Insights costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archive to S3 after 30 days&lt;/td&gt;
&lt;td&gt;CloudWatch → S3 Glacier (95% cheaper)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AWS observability in 2026 centers on three shifts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;X-Ray SDK → OpenTelemetry (ADOT)&lt;/strong&gt; — industry-standard instrumentation, multi-backend export, auto-instrumentation for zero code changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold alarms → SLO-based alerting&lt;/strong&gt; — Application Signals measures what users experience, not just infrastructure health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate tools → unified correlation&lt;/strong&gt; — trace IDs connect metrics, logs, and traces so you move from "something's wrong" to "here's the failing span" in seconds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The architecture:&lt;/strong&gt; Instrument with ADOT (OTel), store in CloudWatch + X-Ray, analyze with Log Insights + Trace Analytics, alert on SLOs via Application Signals, visualize in CloudWatch Dashboards or Managed Grafana.&lt;/p&gt;

&lt;p&gt;Start with auto-instrumentation and structured logs. Add custom metrics and SLOs as your services mature. Don't over-instrument day one — observability should grow with your system's complexity.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS observability, infrastructure automation, and cloud architecture. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>observability</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Terraform vs AWS CDK vs CloudFormation: The Definitive IaC Decision Guide for 2026</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Wed, 12 Aug 2026 07:35:58 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/terraform-vs-aws-cdk-vs-cloudformation-the-definitive-iac-decision-guide-for-2026-3one</link>
      <guid>https://dev.to/alpeshkumbhare/terraform-vs-aws-cdk-vs-cloudformation-the-definitive-iac-decision-guide-for-2026-3one</guid>
      <description>&lt;p&gt;Every AWS team eventually asks: "Should we use Terraform, CDK, or CloudFormation?" The answer isn't universal — it depends on your team's skills, organizational constraints, multi-cloud requirements, and how you want to manage infrastructure lifecycle.&lt;/p&gt;

&lt;p&gt;This guide compares all three across the dimensions that actually matter in production, with a decision framework to help you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Models at a Glance
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────────────────────────────────────────────┐
│                    INFRASTRUCTURE AS CODE                           │
├───────────────────┬───────────────────┬───────────────────────────┤
│   CloudFormation  │     AWS CDK       │       Terraform           │
│                   │                   │                           │
│   Declarative     │   Imperative      │   Declarative             │
│   JSON/YAML       │   TypeScript/     │   HCL                    │
│                   │   Python/Java/Go  │                           │
│   AWS-native      │   Synthesizes to  │   Multi-cloud             │
│                   │   CloudFormation   │   (4000+ providers)       │
│   No state file   │   No state file   │   State file required     │
│   (AWS manages)   │   (AWS manages)   │   (you manage)            │
└───────────────────┴───────────────────┴───────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  CloudFormation: The AWS Native
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; AWS's own IaC service. Declarative JSON/YAML templates that describe desired state. AWS handles provisioning, ordering, and rollback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup&lt;/strong&gt; — no tools to install, no state to manage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same-day AWS support&lt;/strong&gt; — new services/features available immediately in CloudFormation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift detection&lt;/strong&gt; — detects when resources deviate from template&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack operations&lt;/strong&gt; — create, update, delete as atomic operations with automatic rollback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StackSets&lt;/strong&gt; — deploy across multiple accounts and regions from one template&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change sets&lt;/strong&gt; — preview changes before applying&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No state file&lt;/strong&gt; — AWS tracks resource state internally (no S3 backend, no locking concerns)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Weaknesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verbose&lt;/strong&gt; — simple resources require many lines of YAML/JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No loops or conditionals&lt;/strong&gt; (limited) — &lt;code&gt;Conditions&lt;/code&gt; and &lt;code&gt;Fn::ForEach&lt;/code&gt; are awkward&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No abstraction&lt;/strong&gt; — can't create reusable "classes" of infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS-only&lt;/strong&gt; — cannot manage non-AWS resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow updates&lt;/strong&gt; — large stacks take 30+ minutes to update&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error messages&lt;/strong&gt; — often cryptic, debugging is painful&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Teams deeply committed to AWS with no multi-cloud plans&lt;/li&gt;
&lt;li&gt;Organizations using AWS Service Catalog (backed by CloudFormation)&lt;/li&gt;
&lt;li&gt;Landing Zone Accelerator (LZA) deployments&lt;/li&gt;
&lt;li&gt;Simple, single-account deployments with &amp;lt; 50 resources&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AWS CDK: Infrastructure in Real Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source framework that lets you define infrastructure using programming languages (TypeScript, Python, Java, Go, C#). CDK &lt;strong&gt;synthesizes&lt;/strong&gt; to CloudFormation — it's an abstraction layer on top.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real programming languages&lt;/strong&gt; — loops, conditionals, functions, classes, inheritance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constructs&lt;/strong&gt; — reusable, composable building blocks (L1, L2, L3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt; — IDE autocomplete, compile-time checks, refactoring support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstraction&lt;/strong&gt; — define a "SecureWebApp" construct once, reuse everywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt; — unit test infrastructure with standard testing frameworks (Jest, pytest)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same deployment model as CloudFormation&lt;/strong&gt; — benefits from AWS-managed state, rollback, drift detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Construct Hub&lt;/strong&gt; — community library of pre-built patterns (aws-solutions-constructs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Weaknesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Still limited by CloudFormation&lt;/strong&gt; — if CFN can't do it, CDK can't either&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthesis step&lt;/strong&gt; — adds complexity to CI/CD pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning curve&lt;/strong&gt; — must know both the programming language AND AWS resource model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack size limits&lt;/strong&gt; — inherits CloudFormation's 500-resource limit per stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breaking changes&lt;/strong&gt; — CDK library updates can break existing constructs (semver issues)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS-only&lt;/strong&gt; — synthesizes to CloudFormation, so no multi-cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CDK Construct Levels
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct CloudFormation mapping (CfnBucket)&lt;/td&gt;
&lt;td&gt;1:1 with CFN, verbose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-aware with sensible defaults (Bucket)&lt;/td&gt;
&lt;td&gt;Encryption enabled by default, fewer params&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opinionated patterns (ApplicationLoadBalancedFargateService)&lt;/td&gt;
&lt;td&gt;Full architecture in one construct&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developer-heavy teams familiar with TypeScript/Python&lt;/li&gt;
&lt;li&gt;Organizations wanting reusable infrastructure libraries (shared constructs)&lt;/li&gt;
&lt;li&gt;Complex deployments needing loops, conditionals, and dynamic generation&lt;/li&gt;
&lt;li&gt;Teams already using CloudFormation wanting better developer experience&lt;/li&gt;
&lt;li&gt;Projects requiring infrastructure unit testing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Terraform: The Multi-Cloud Standard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; HashiCorp's open-source IaC tool using HCL (HashiCorp Configuration Language). Declarative, provider-based architecture supporting 4,000+ providers across all major clouds and SaaS services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-cloud&lt;/strong&gt; — same workflow for AWS, Azure, GCP, Kubernetes, Datadog, PagerDuty, GitHub, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mature ecosystem&lt;/strong&gt; — Terraform Registry with 15,000+ modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HCL is purpose-built&lt;/strong&gt; — cleaner than YAML, simpler than full programming languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan before apply&lt;/strong&gt; — &lt;code&gt;terraform plan&lt;/code&gt; shows exactly what will change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module system&lt;/strong&gt; — reusable, versioned, composable modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import existing resources&lt;/strong&gt; — bring manually-created resources under management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast execution&lt;/strong&gt; — parallel resource creation, faster than CloudFormation for large deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community&lt;/strong&gt; — massive community, extensive documentation, Stack Overflow coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Weaknesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State management&lt;/strong&gt; — YOU manage the state file (S3 + DynamoDB locking is standard)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State drift&lt;/strong&gt; — if someone changes resources outside Terraform, state diverges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No built-in rollback&lt;/strong&gt; — failed applies can leave infrastructure in partial state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider lag&lt;/strong&gt; — new AWS features may take days/weeks to appear in the AWS provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License change&lt;/strong&gt; — BSL license since 2023 (OpenTofu is the open-source fork)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HCL limitations&lt;/strong&gt; — no full programming language features (workarounds needed for complex logic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive data in state&lt;/strong&gt; — state file contains secrets (must encrypt S3 backend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terraform vs OpenTofu
&lt;/h3&gt;

&lt;p&gt;Since HashiCorp's BSL license change in 2023, OpenTofu exists as a fully open-source fork:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Terraform&lt;/th&gt;
&lt;th&gt;OpenTofu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;BSL (Business Source License)&lt;/td&gt;
&lt;td&gt;MPL 2.0 (truly open source)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature parity&lt;/td&gt;
&lt;td&gt;Leading edge&lt;/td&gt;
&lt;td&gt;Follows (slight lag)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider support&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full (same providers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise support&lt;/td&gt;
&lt;td&gt;Terraform Cloud/Enterprise&lt;/td&gt;
&lt;td&gt;Community + vendors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When to choose&lt;/td&gt;
&lt;td&gt;Need Terraform Cloud features&lt;/td&gt;
&lt;td&gt;Need fully open-source&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-cloud or hybrid environments&lt;/li&gt;
&lt;li&gt;Platform teams managing infrastructure across multiple providers&lt;/li&gt;
&lt;li&gt;Organizations with existing Terraform expertise&lt;/li&gt;
&lt;li&gt;Projects needing to manage non-AWS resources (GitHub repos, DNS, monitoring, SaaS configs)&lt;/li&gt;
&lt;li&gt;Large-scale deployments where CloudFormation is too slow&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Head-to-Head Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;CloudFormation&lt;/th&gt;
&lt;th&gt;CDK&lt;/th&gt;
&lt;th&gt;Terraform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON/YAML&lt;/td&gt;
&lt;td&gt;TypeScript/Python/Java/Go&lt;/td&gt;
&lt;td&gt;HCL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paradigm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Declarative&lt;/td&gt;
&lt;td&gt;Imperative (synthesizes to declarative)&lt;/td&gt;
&lt;td&gt;Declarative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ AWS only&lt;/td&gt;
&lt;td&gt;❌ AWS only&lt;/td&gt;
&lt;td&gt;✅ 4000+ providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-managed&lt;/td&gt;
&lt;td&gt;AWS-managed (via CFN)&lt;/td&gt;
&lt;td&gt;Self-managed (S3 + DynamoDB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rollback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Automatic&lt;/td&gt;
&lt;td&gt;✅ Automatic (via CFN)&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;New AWS features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same-day&lt;/td&gt;
&lt;td&gt;Same-day (via L1)&lt;/td&gt;
&lt;td&gt;Days/weeks lag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reusability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nested stacks (limited)&lt;/td&gt;
&lt;td&gt;Constructs (excellent)&lt;/td&gt;
&lt;td&gt;Modules (excellent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No native support&lt;/td&gt;
&lt;td&gt;✅ Unit + integration&lt;/td&gt;
&lt;td&gt;✅ Terratest, plan assertions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (if you know YAML)&lt;/td&gt;
&lt;td&gt;Medium (language + AWS)&lt;/td&gt;
&lt;td&gt;Low-Medium (HCL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic YAML validation&lt;/td&gt;
&lt;td&gt;Full (autocomplete, types)&lt;/td&gt;
&lt;td&gt;Good (HCL extension)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Drift detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;✅ Built-in (via CFN)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;terraform plan&lt;/code&gt; (manual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Import existing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (limited)&lt;/td&gt;
&lt;td&gt;✅ (limited)&lt;/td&gt;
&lt;td&gt;✅ (excellent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community modules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Construct Hub (growing)&lt;/td&gt;
&lt;td&gt;Registry (massive, 15K+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI/CD integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-native (CodePipeline)&lt;/td&gt;
&lt;td&gt;CDK Pipelines&lt;/td&gt;
&lt;td&gt;Any CI tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free (OSS) / Paid (Cloud)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  State Management: The Critical Difference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CloudFormation / CDK: No State File Worries
&lt;/h3&gt;

&lt;p&gt;AWS tracks state internally. You never see a state file. Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No S3 backend to configure&lt;/li&gt;
&lt;li&gt;No locking mechanism needed&lt;/li&gt;
&lt;li&gt;No state corruption risk&lt;/li&gt;
&lt;li&gt;Drift detection built-in&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terraform: You Own the State
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;"s3"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-terraform-state"&lt;/span&gt;
    &lt;span class="nx"&gt;key&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod/network/terraform.tfstate"&lt;/span&gt;
    &lt;span class="nx"&gt;region&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1"&lt;/span&gt;
    &lt;span class="nx"&gt;dynamodb_table&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform-locks"&lt;/span&gt;
    &lt;span class="nx"&gt;encrypt&lt;/span&gt;        &lt;span class="p"&gt;=&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;p&gt;&lt;strong&gt;State risks you must manage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State file contains secrets (encrypt the S3 bucket, restrict access)&lt;/li&gt;
&lt;li&gt;Concurrent applies can corrupt state (DynamoDB locking solves this)&lt;/li&gt;
&lt;li&gt;Lost state = Terraform doesn't know what it manages (backup state files)&lt;/li&gt;
&lt;li&gt;State drift = someone changed resources outside Terraform (regular &lt;code&gt;terraform plan&lt;/code&gt; detects this)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Module / Construct Ecosystem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Terraform Registry
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"vpc"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform-aws-modules/vpc/aws"&lt;/span&gt;
  &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"5.0.0"&lt;/span&gt;

  &lt;span class="nx"&gt;cidr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
  &lt;span class="nx"&gt;azs&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"eu-west-1a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-1c"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;private_subnets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.2.0/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.3.0/24"&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;15,000+ community modules. The &lt;code&gt;terraform-aws-modules&lt;/code&gt; organization alone covers VPC, EKS, RDS, Lambda, and dozens more.&lt;/p&gt;

&lt;h3&gt;
  
  
  CDK Constructs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApplicationLoadBalancedFargateService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib/aws-ecs-patterns&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApplicationLoadBalancedFargateService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MyApp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;taskImageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ecs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ContainerImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromRegistry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app:latest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;desiredCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;memoryLimitMiB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// This single construct creates: ECS cluster, Fargate service, ALB, target group,&lt;/span&gt;
&lt;span class="c1"&gt;// security groups, IAM roles, CloudWatch log group — all with sensible defaults&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Team Workflow Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: Terraform for Platform, CDK for Applications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Platform Team → Terraform
  ├── VPCs, Transit Gateway, DNS
  ├── EKS clusters, RDS instances
  └── Shared infrastructure (S3, KMS, IAM boundaries)

Application Teams → CDK
  ├── ECS services, Lambda functions
  ├── Application-specific resources
  └── Deploy via CDK Pipelines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Platform team needs multi-provider support (AWS + GitHub + Datadog). App teams benefit from CDK's developer-friendly constructs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Terraform Everywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All Teams → Terraform
  ├── Shared modules in internal registry
  ├── Atlantis or Terraform Cloud for PR-based workflow
  └── One language, one workflow, one state backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Consistency. One tool to learn, one CI/CD pattern, one troubleshooting approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: CDK Everywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All Teams → CDK (TypeScript)
  ├── Shared construct library (internal npm package)
  ├── CDK Pipelines for deployment
  └── Jest for infrastructure testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Developer-first organization where infrastructure is code written by application developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Decision Flowchart
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START
  │
  ├── Do you need to manage non-AWS resources?
  │     └── YES → Terraform (multi-provider)
  │
  ├── Is your team primarily developers (TypeScript/Python)?
  │     ├── YES → CDK (familiar language, constructs, testing)
  │     └── NO → Continue ↓
  │
  ├── Do you need multi-cloud portability?
  │     └── YES → Terraform
  │
  ├── Is simplicity the priority (small team, few resources)?
  │     └── YES → CloudFormation (no tools to manage)
  │
  ├── Do you need reusable infrastructure libraries?
  │     ├── Developer org → CDK (constructs)
  │     └── Ops/platform org → Terraform (modules)
  │
  └── Already using one tool successfully?
        └── YES → Stay with it (switching cost &amp;gt; marginal benefit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Migration Considerations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;To&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;When It Makes Sense&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CloudFormation → CDK&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;CDK can import existing CFN stacks. Migrate incrementally.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFormation → Terraform&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;terraform import&lt;/code&gt;. Re-create templates in HCL.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform → CDK&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;No migration path. Must re-create and import.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDK → Terraform&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;No migration path. Must re-create and import.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key rule:&lt;/strong&gt; Don't migrate for marginal gains. Only migrate when the current tool is actively blocking you (e.g., multi-cloud requirement, team can't hire CloudFormation skills).&lt;/p&gt;




&lt;h2&gt;
  
  
  What About Pulumi / CDKTF / Crossplane?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Niche&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pulumi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Like CDK but multi-cloud. Real languages + any cloud provider. Consider if you want CDK-style + multi-cloud.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CDKTF&lt;/strong&gt; (CDK for Terraform)&lt;/td&gt;
&lt;td&gt;Write CDK-style code that synthesizes to Terraform HCL. Best of both worlds — but adds complexity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crossplane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes-native IaC. Manages cloud resources via K8s CRDs. For teams running everything on Kubernetes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Choose...&lt;/th&gt;
&lt;th&gt;When...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudFormation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-only, simple deployments, no state management overhead, same-day feature support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer teams, need reusable constructs, want type safety and testing, AWS-only is fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terraform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-cloud, platform teams, large module ecosystem, existing HCL expertise, non-AWS resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "wrong" choice isn't which tool you pick — it's switching tools every 6 months because someone read a blog post. Pick one, standardize, and build expertise. The best IaC tool is the one your team uses consistently.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and IaC best practices. Connect on &lt;a href="https://www.linkedin.com/in/alpesh-kumbhare-a638b51b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>devops</category>
      <category>infrastructure</category>
    </item>
  </channel>
</rss>
