<?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>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>
    <item>
      <title>AWS Compute Decision Guide: EC2 vs ECS vs EKS vs Fargate vs Lambda — When to Use What</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Tue, 11 Aug 2026 06:59:43 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-compute-decision-guide-ec2-vs-ecs-vs-eks-vs-fargate-vs-lambda-when-to-use-what-1ho7</link>
      <guid>https://dev.to/alpeshkumbhare/aws-compute-decision-guide-ec2-vs-ecs-vs-eks-vs-fargate-vs-lambda-when-to-use-what-1ho7</guid>
      <description>&lt;p&gt;The most expensive mistake in cloud isn't over-provisioning a server — it's choosing the wrong compute model for your workload. Running event-driven functions on EKS? Over-engineered. Running a 24/7 API with 10-second cold starts on Lambda? Under-engineered. Both cost you money, time, and pain.&lt;/p&gt;

&lt;p&gt;AWS offers six primary compute options, and they're not interchangeable. This guide provides a decision framework based on workload characteristics — not vendor hype.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compute Spectrum
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MORE CONTROL                                              LESS CONTROL
MORE RESPONSIBILITY                                       LESS RESPONSIBILITY

┌──────┐   ┌──────┐   ┌──────┐   ┌──────┐   ┌──────┐   ┌──────┐
│  EC2  │   │ECS on│   │EKS on│   │Fargate│   │App   │   │Lambda│
│       │   │ EC2  │   │ EC2  │   │      │   │Runner│   │      │
│You own│   │You   │   │You   │   │No    │   │Just  │   │Just  │
│every- │   │manage│   │manage│   │servers│   │deploy│   │code  │
│thing  │   │nodes │   │nodes │   │      │   │image │   │      │
└──────┘   └──────┘   └──────┘   └──────┘   └──────┘   └──────┘
&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 your workload is...&lt;/th&gt;
&lt;th&gt;Use...&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;Event-driven, &amp;lt; 15 min, bursty&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay per invocation, scales to zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP API, predictable traffic&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ECS + Fargate&lt;/strong&gt; or &lt;strong&gt;App Runner&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Simplest container path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microservices, 5-15 services&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ECS + Fargate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-native, simple, low ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microservices, 15+ services, CNCF ecosystem&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes portability + ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU workloads, ML training&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;EC2&lt;/strong&gt; (or SageMaker)&lt;/td&gt;
&lt;td&gt;GPU instance control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy apps, specific OS/kernel needs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;EC2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full machine control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch processing, parallel compute&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;AWS Batch&lt;/strong&gt; (on Fargate or EC2)&lt;/td&gt;
&lt;td&gt;Managed job scheduling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time data streaming&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ECS/EKS&lt;/strong&gt; with persistent connections&lt;/td&gt;
&lt;td&gt;Long-lived processes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  EC2: Full Control, Full Responsibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose EC2 when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need specific instance types (GPU, FPGA, bare-metal)&lt;/li&gt;
&lt;li&gt;Workload requires kernel customization or specific OS configurations&lt;/li&gt;
&lt;li&gt;Running licensed software tied to machine/CPU&lt;/li&gt;
&lt;li&gt;Need persistent local storage (instance store NVMe)&lt;/li&gt;
&lt;li&gt;Maximum performance with minimal abstraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't choose EC2 when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You just need to run containers (use Fargate instead)&lt;/li&gt;
&lt;li&gt;Workload is event-driven and bursty (Lambda is cheaper)&lt;/li&gt;
&lt;li&gt;You don't want to manage patching, AMIs, and Auto Scaling groups&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EC2 Cost Optimization
&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;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graviton (ARM) instances&lt;/td&gt;
&lt;td&gt;20-40% better price/performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spot Instances&lt;/td&gt;
&lt;td&gt;Up to 90% for fault-tolerant workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Savings Plans&lt;/td&gt;
&lt;td&gt;Up to 72% for steady-state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Right-sizing (Compute Optimizer)&lt;/td&gt;
&lt;td&gt;20-30% by eliminating over-provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled stop/start (dev/staging)&lt;/td&gt;
&lt;td&gt;~65% on non-production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ECS (Elastic Container Service): AWS-Native Containers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose ECS when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want the simplest container orchestration on AWS&lt;/li&gt;
&lt;li&gt;Your team doesn't know (or need) Kubernetes&lt;/li&gt;
&lt;li&gt;5-15 microservices, all on AWS&lt;/li&gt;
&lt;li&gt;You want deep AWS integration (IAM task roles, Service Connect, CloudMap)&lt;/li&gt;
&lt;li&gt;No multi-cloud requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ECS on Fargate vs ECS on EC2
&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;ECS + Fargate&lt;/th&gt;
&lt;th&gt;ECS + EC2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server management&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;You manage ASG + AMIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost at scale&lt;/td&gt;
&lt;td&gt;Higher per-vCPU&lt;/td&gt;
&lt;td&gt;Lower (especially with Spot/RIs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup time&lt;/td&gt;
&lt;td&gt;~30 seconds&lt;/td&gt;
&lt;td&gt;Instant (containers already on host)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU support&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full GPU instance access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bin packing&lt;/td&gt;
&lt;td&gt;AWS handles it&lt;/td&gt;
&lt;td&gt;You optimize placement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Variable workloads, small-medium scale&lt;/td&gt;
&lt;td&gt;High-scale, cost-sensitive, GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ECS Architecture Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌──────────────┐     ┌──────────────┐
│    ALB      │────→│  ECS Service │────→│    RDS       │
│             │     │  (Fargate)   │     │  (Aurora)    │
└─────────────┘     │  3 tasks     │     └──────────────┘
                    └──────────────┘
                           │
                    ┌──────────────┐
                    │  Service     │
                    │  Connect     │──→ Other ECS Services
                    └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  EKS (Elastic Kubernetes Service): The Kubernetes Path
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose EKS when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team already knows Kubernetes&lt;/li&gt;
&lt;li&gt;You need multi-cloud portability (same manifests on GKE/AKS)&lt;/li&gt;
&lt;li&gt;15+ microservices benefiting from the CNCF ecosystem&lt;/li&gt;
&lt;li&gt;Need advanced traffic management (Istio, Linkerd)&lt;/li&gt;
&lt;li&gt;Want Karpenter for intelligent auto-scaling&lt;/li&gt;
&lt;li&gt;Need custom operators or CRDs for your domain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't choose EKS when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your team doesn't know Kubernetes (learning curve is steep)&lt;/li&gt;
&lt;li&gt;&amp;lt; 10 services (ECS is simpler and cheaper)&lt;/li&gt;
&lt;li&gt;You're 100% AWS with no multi-cloud plans&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EKS Cost: The $73/Month Control Plane
&lt;/h3&gt;

&lt;p&gt;EKS charges $0.10/hour ($73/month) for the control plane. Add node compute on top. This makes EKS expensive for small workloads but negligible at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  EKS Compute Options
&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;Best For&lt;/th&gt;
&lt;th&gt;Cost Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed Node Groups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard workloads, simple ops&lt;/td&gt;
&lt;td&gt;EC2 instance pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Karpenter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic scaling, mixed instance types&lt;/td&gt;
&lt;td&gt;Right-sized EC2 + Spot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fargate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isolation-sensitive, no node management&lt;/td&gt;
&lt;td&gt;Per-pod vCPU/memory pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot + Karpenter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cost-optimized batch/stateless&lt;/td&gt;
&lt;td&gt;Up to 90% cheaper than On-Demand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  EKS Architecture Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────┐
│  EKS Cluster                                      │
│  ┌─────────────┐  ┌─────────────┐  ┌──────────┐ │
│  │ Namespace:  │  │ Namespace:  │  │Namespace:│ │
│  │ team-a      │  │ team-b      │  │ platform │ │
│  │ ┌─────────┐ │  │ ┌─────────┐ │  │ ArgoCD   │ │
│  │ │ pods    │ │  │ │ pods    │ │  │ Prometheus│ │
│  │ └─────────┘ │  │ └─────────┘ │  │ Grafana  │ │
│  └─────────────┘  └─────────────┘  └──────────┘ │
│                                                    │
│  Karpenter → Spot + On-Demand (Graviton)          │
└──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fargate: Serverless Containers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose Fargate when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want containers without managing servers&lt;/li&gt;
&lt;li&gt;Workloads are variable (scale up/down frequently)&lt;/li&gt;
&lt;li&gt;Security requires task-level isolation (each task gets its own kernel)&lt;/li&gt;
&lt;li&gt;Team doesn't want to manage EC2 instances, ASGs, or AMI patching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't choose Fargate when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost is the primary concern at high scale (EC2 is 30-50% cheaper)&lt;/li&gt;
&lt;li&gt;Need GPU instances&lt;/li&gt;
&lt;li&gt;Need &amp;gt; 4 vCPU / 30 GB memory per task (Fargate has size limits)&lt;/li&gt;
&lt;li&gt;Need daemonsets or host-level access (use EC2 nodes)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Fargate is ~3x more expensive per vCPU-hour than equivalent EC2 On-Demand. But you save on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No idle capacity (pay only for running tasks)&lt;/li&gt;
&lt;li&gt;No ops time managing nodes&lt;/li&gt;
&lt;li&gt;No AMI patching or security updates on hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Break-even:&lt;/strong&gt; If utilization stays above ~60-70%, EC2 is cheaper. Below that, Fargate wins because you're not paying for idle capacity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lambda: Serverless Functions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose Lambda when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event-driven processing (S3 events, SQS messages, API calls)&lt;/li&gt;
&lt;li&gt;Execution time &amp;lt; 15 minutes&lt;/li&gt;
&lt;li&gt;Bursty, unpredictable traffic patterns&lt;/li&gt;
&lt;li&gt;You want zero infrastructure management&lt;/li&gt;
&lt;li&gt;Cost must scale to zero when idle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't choose Lambda when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions run &amp;gt; 15 minutes&lt;/li&gt;
&lt;li&gt;Need persistent connections (WebSockets, gRPC streams)&lt;/li&gt;
&lt;li&gt;Cold starts are unacceptable (use provisioned concurrency or Fargate)&lt;/li&gt;
&lt;li&gt;Workload is high-throughput steady-state (EC2/Fargate is cheaper)&lt;/li&gt;
&lt;li&gt;Need &amp;gt; 10 GB memory&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lambda Cost Calculation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost = (Requests × $0.20/1M) + (GB-seconds × $0.0000166667)

Example: 1M requests/month, 256MB, 200ms average
= $0.20 + (1M × 0.256GB × 0.2s × $0.0000166667)
= $0.20 + $0.85
= $1.05/month

Same workload on Fargate (0.25 vCPU, 512MB, always running):
= $9.47/month (vCPU) + $1.04/month (memory) = $10.51/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lambda is 10x cheaper for bursty workloads. But at 10M+ steady requests, Fargate wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  App Runner: The Simplest Container Path
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose App Runner when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want the fastest path from container image to production URL&lt;/li&gt;
&lt;li&gt;Simple web applications or APIs&lt;/li&gt;
&lt;li&gt;Don't need VPC integration (or use VPC connector for private resources)&lt;/li&gt;
&lt;li&gt;Team has zero AWS infrastructure experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;App Runner vs Fargate:&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;App Runner&lt;/th&gt;
&lt;th&gt;ECS + Fargate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup complexity&lt;/td&gt;
&lt;td&gt;Push image → done&lt;/td&gt;
&lt;td&gt;Task def + service + ALB + target group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto scaling&lt;/td&gt;
&lt;td&gt;Built-in, automatic&lt;/td&gt;
&lt;td&gt;Configure scaling policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom domains + TLS&lt;/td&gt;
&lt;td&gt;One-click&lt;/td&gt;
&lt;td&gt;ACM + ALB configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC access&lt;/td&gt;
&lt;td&gt;Via connector&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancing&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;You configure ALB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Built-in (from ECR/GitHub)&lt;/td&gt;
&lt;td&gt;You configure pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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
  │
  ├── Is it event-driven, &amp;lt; 15 min execution?
  │     └── YES → Lambda
  │
  ├── Is it a simple web app/API needing fastest deployment?
  │     └── YES → App Runner
  │
  ├── Does your team know Kubernetes?
  │     ├── YES + need multi-cloud/CNCF ecosystem → EKS
  │     └── NO → ECS
  │
  ├── Want to manage servers?
  │     ├── NO → Fargate (with ECS or EKS)
  │     └── YES (cost/GPU/custom needs) → EC2 (with ECS or EKS)
  │
  └── Need GPU, bare-metal, or kernel access?
        └── YES → EC2 (raw or with ECS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cost Comparison: Same Workload, Different Compute
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Workload:&lt;/strong&gt; Web API, 2 vCPU, 4GB RAM, running 24/7, steady traffic&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 (m7g.large, On-Demand)&lt;/td&gt;
&lt;td&gt;~$60&lt;/td&gt;
&lt;td&gt;You manage everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 (m7g.large, 1yr Savings Plan)&lt;/td&gt;
&lt;td&gt;~$38&lt;/td&gt;
&lt;td&gt;37% savings, committed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS + Fargate (2 vCPU, 4GB)&lt;/td&gt;
&lt;td&gt;~$120&lt;/td&gt;
&lt;td&gt;No server management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS + Fargate (2 vCPU, 4GB)&lt;/td&gt;
&lt;td&gt;~$193&lt;/td&gt;
&lt;td&gt;$73 control plane + Fargate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS + EC2 (m7g.large)&lt;/td&gt;
&lt;td&gt;~$133&lt;/td&gt;
&lt;td&gt;$73 control plane + EC2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Runner (2 vCPU, 4GB)&lt;/td&gt;
&lt;td&gt;~$100&lt;/td&gt;
&lt;td&gt;Simplest path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (if 1M req/month)&lt;/td&gt;
&lt;td&gt;~$1&lt;/td&gt;
&lt;td&gt;Only if workload fits event model&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; Lambda is cheapest for bursty workloads. EC2 with Savings Plans is cheapest for steady-state. Fargate/App Runner trade cost for operational simplicity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration Paths
&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;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 → Fargate&lt;/td&gt;
&lt;td&gt;You're spending too much time on instance management and patching&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda → Fargate&lt;/td&gt;
&lt;td&gt;Functions hitting 15-min timeout or cold starts are unacceptable&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS → EKS&lt;/td&gt;
&lt;td&gt;Team growing, need CNCF tools, or multi-cloud is on the roadmap&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS → ECS&lt;/td&gt;
&lt;td&gt;Over-engineered; small team drowning in Kubernetes complexity&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fargate → EC2&lt;/td&gt;
&lt;td&gt;Scale reached where Fargate premium exceeds ops savings&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monolith EC2 → ECS/EKS&lt;/td&gt;
&lt;td&gt;Decomposing into microservices, need orchestration&lt;/td&gt;
&lt;td&gt;&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;There's no "best" AWS compute service — only the best fit for YOUR workload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt; — event-driven, bursty, &amp;lt; 15 min. Cheapest at low scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Runner&lt;/strong&gt; — simplest container deployment. Zero AWS knowledge needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECS + Fargate&lt;/strong&gt; — standard container workloads, AWS-native, low ops. Sweet spot for most teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS&lt;/strong&gt; — Kubernetes ecosystem, multi-cloud, 15+ services. Higher complexity, more power.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EC2&lt;/strong&gt; — full control, GPU, specialized instances. Cheapest at high steady-state utilization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose based on: team skills, workload characteristics, scale, and how much operational overhead you're willing to accept. When in doubt, start with Fargate — you can always move to EC2 underneath later without changing application code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and cloud architecture decisions. 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>containers</category>
      <category>serverless</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Platform Engineering on AWS: Building an Internal Developer Platform That Developers Actually Use</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Fri, 07 Aug 2026 07:06:23 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/platform-engineering-on-aws-building-an-internal-developer-platform-that-developers-actually-use-184h</link>
      <guid>https://dev.to/alpeshkumbhare/platform-engineering-on-aws-building-an-internal-developer-platform-that-developers-actually-use-184h</guid>
      <description>&lt;p&gt;Gartner predicted that by 2026, 80% of large software engineering organizations would establish platform engineering teams. That prediction landed. Platform engineering is no longer a trend — it's the default operating model for cloud-native organizations.&lt;/p&gt;

&lt;p&gt;But here's what most teams get wrong: they build a platform nobody uses. They create golden paths developers ignore, self-service portals that are harder than Terraform, and governance layers that slow teams down.&lt;/p&gt;

&lt;p&gt;This post covers how to build an Internal Developer Platform (IDP) on AWS that developers actually adopt — the architecture, the AWS services that power it, the golden path patterns, and the operating model that sustains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Platform Engineering?
&lt;/h2&gt;

&lt;p&gt;Platform engineering is the practice of building and maintaining an Internal Developer Platform — a self-service layer that abstracts infrastructure complexity while enforcing organizational standards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITHOUT PLATFORM                    WITH PLATFORM

Developer → learns Terraform        Developer → picks template
         → configures VPC                    → clicks deploy
         → sets up IAM                       → gets environment
         → creates pipeline                  → ships code
         → manages monitoring
         → handles security

Cognitive load: HIGH                 Cognitive load: LOW
Time to first deploy: Weeks          Time to first deploy: Minutes
Consistency: None                    Consistency: Enforced
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The goal:&lt;/strong&gt; Developers get self-service access to production-ready infrastructure without needing to become infrastructure experts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The IDP Architecture on AWS
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  DEVELOPER INTERFACE (Portal)                                    │
│  Backstage | Custom Portal | Service Catalog Console             │
├─────────────────────────────────────────────────────────────────┤
│  ORCHESTRATION (Provisioning Engine)                             │
│  Service Catalog | Proton | CDK Pipelines | Crossplane | ArgoCD │
├─────────────────────────────────────────────────────────────────┤
│  TEMPLATES (Golden Paths)                                        │
│  CloudFormation | Terraform | CDK | EKS Blueprints | Cookiecutter│
├─────────────────────────────────────────────────────────────────┤
│  PLATFORM SERVICES (Shared Capabilities)                         │
│  CI/CD | Observability | Security Scanning | Secrets | DNS       │
├─────────────────────────────────────────────────────────────────┤
│  INFRASTRUCTURE (Managed by Platform Team)                       │
│  EKS | ECS | Lambda | RDS | S3 | VPC | IAM | KMS               │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The 5 Capabilities Every IDP Needs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Self-Service Infrastructure Provisioning
&lt;/h3&gt;

&lt;p&gt;Developers should deploy environments without filing tickets or waiting for ops teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Options:&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;Service&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Developer Experience&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Service Catalog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Governed AWS resource provisioning&lt;/td&gt;
&lt;td&gt;Console/API, pre-approved products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Proton&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container and serverless environments&lt;/td&gt;
&lt;td&gt;Template-based, managed pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CDK Pipelines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom IaC with CI/CD&lt;/td&gt;
&lt;td&gt;Code-first, GitOps-style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS Blueprints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes cluster standardization&lt;/td&gt;
&lt;td&gt;Addons + configurations pre-packaged&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Service Catalog pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Platform Team creates "Products":
├── "Web Application" → VPC + ALB + ECS + RDS + CloudWatch
├── "Data Pipeline" → S3 + Glue + Step Functions + Athena
├── "API Backend" → API Gateway + Lambda + DynamoDB
└── "ML Workspace" → SageMaker Studio + S3 + IAM role

Developer: Launches product → fills 5 parameters → gets full stack in 10 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Golden Paths (Opinionated Templates)
&lt;/h3&gt;

&lt;p&gt;Golden paths are pre-built, production-ready templates that encode best practices. They're not mandatory — but they're so much easier than building from scratch that teams naturally adopt them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes a golden path "golden":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security pre-configured (IAM roles, encryption, network isolation)&lt;/li&gt;
&lt;li&gt;Observability built-in (CloudWatch dashboards, alarms, X-Ray tracing)&lt;/li&gt;
&lt;li&gt;CI/CD included (pipeline deploys on merge)&lt;/li&gt;
&lt;li&gt;Cost-optimized (right-sized, auto-scaling configured)&lt;/li&gt;
&lt;li&gt;Compliance-ready (tagging, logging, Config rules)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example golden path: "Microservice on ECS"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer runs: `platform create service --type=ecs-microservice --name=payment-api`

Platform creates:
├── ECR repository
├── ECS service + task definition (Fargate, Graviton)
├── ALB target group + listener rule
├── CodePipeline (source → build → deploy)
├── CloudWatch dashboard + alarms
├── IAM task role (least privilege)
├── Security group (ingress from ALB only)
├── X-Ray tracing enabled
└── Resource tags (team, cost-center, environment)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developer gets a working, production-grade service in minutes. No Terraform expertise required.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Built-In CI/CD
&lt;/h3&gt;

&lt;p&gt;Every golden path should include a deployment pipeline. Developers shouldn't configure CI/CD — it should come free with the platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern: CodePipeline per service (auto-provisioned)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Service creation triggers:
├── CodeCommit/GitHub repo created
├── CodeBuild project (build + test + scan)
├── CodeDeploy / ECS rolling update
├── Pipeline stages: Source → Build → Test → Deploy-Dev → Deploy-Staging → Deploy-Prod
└── Quality gates: unit tests, SAST scan, container scan, integration tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alternative: GitOps with ArgoCD (for EKS platforms)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer pushes code → CI builds image → updates manifest repo →
ArgoCD detects change → syncs to EKS cluster → progressive rollout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Observability as a Platform Service
&lt;/h3&gt;

&lt;p&gt;Don't make developers configure monitoring. Bake it into every golden path:&lt;/p&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;Auto-Configured&lt;/th&gt;
&lt;th&gt;Service&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;CPU, memory, request count, error rate, latency&lt;/td&gt;
&lt;td&gt;CloudWatch Container Insights / EMF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;Structured JSON, centralized, retention policies&lt;/td&gt;
&lt;td&gt;CloudWatch Logs + Log Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces&lt;/td&gt;
&lt;td&gt;Distributed tracing across services&lt;/td&gt;
&lt;td&gt;X-Ray / OpenTelemetry on ADOT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboards&lt;/td&gt;
&lt;td&gt;Per-service dashboard auto-generated&lt;/td&gt;
&lt;td&gt;CloudWatch Dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alerts&lt;/td&gt;
&lt;td&gt;SLO-based alerting (error rate &amp;gt; 1%, latency p99 &amp;gt; 500ms)&lt;/td&gt;
&lt;td&gt;CloudWatch Alarms → SNS → PagerDuty&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Developer experience:&lt;/strong&gt; Deploy a service → dashboard appears automatically → alerts fire if SLOs breach. Zero configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security and Compliance Guardrails
&lt;/h3&gt;

&lt;p&gt;The platform enforces security without developer intervention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAM boundaries&lt;/strong&gt; — permission boundaries on developer roles prevent privilege escalation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container scanning&lt;/strong&gt; — ECR image scan on push, block deployment if critical CVEs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SAST/SCA&lt;/strong&gt; — code scanning in pipeline (CodeGuru, Snyk, Checkov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network isolation&lt;/strong&gt; — services get private subnets by default, no public access unless explicitly approved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets management&lt;/strong&gt; — Secrets Manager integrated into task definitions, no hardcoded credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config rules&lt;/strong&gt; — continuous compliance checking (encryption enabled, public access blocked, tags present)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AWS Proton: The Managed Platform Engine
&lt;/h2&gt;

&lt;p&gt;AWS Proton is purpose-built for platform engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment templates&lt;/strong&gt; — define shared infrastructure (VPC, cluster, logging)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service templates&lt;/strong&gt; — define workload patterns (how services deploy INTO environments)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning&lt;/strong&gt; — templates are versioned; platform team upgrades without breaking existing services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-service&lt;/strong&gt; — developers create services from templates via console, CLI, or API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync from Git&lt;/strong&gt; — templates stored in Git, Proton syncs changes automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Proton Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Platform Team                          Developer
     │                                      │
     ▼                                      │
┌──────────────┐                            │
│ Environment  │  (VPC, EKS, RDS, shared)   │
│ Template v2  │                            │
└──────────────┘                            │
                                            ▼
┌──────────────┐                    ┌──────────────┐
│ Service      │  ────────────────→ │  My Service  │
│ Template v3  │  (developer picks) │  (deployed)  │
│ (ECS+ALB+CD)│                    └──────────────┘
└──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  EKS Blueprints: Platform for Kubernetes
&lt;/h2&gt;

&lt;p&gt;If your IDP is Kubernetes-based, EKS Blueprints (CDK or Terraform) provide standardized cluster provisioning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Blueprints package:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EKS cluster with managed node groups (Graviton, Spot)&lt;/li&gt;
&lt;li&gt;Core addons: CoreDNS, kube-proxy, VPC CNI, EBS CSI&lt;/li&gt;
&lt;li&gt;Platform addons: ArgoCD, Karpenter, Prometheus, Grafana, cert-manager, external-dns&lt;/li&gt;
&lt;li&gt;Team namespaces with RBAC and resource quotas&lt;/li&gt;
&lt;li&gt;GitOps pipeline for addon management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer experience:&lt;/strong&gt; Request a namespace → get isolated Kubernetes namespace with resource quota, network policy, service account, and ArgoCD project. Deploy via Git push.&lt;/p&gt;




&lt;h2&gt;
  
  
  Developer Portal: The Front Door
&lt;/h2&gt;

&lt;p&gt;A developer portal gives visibility into all platform services, documentation, and self-service actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backstage (Open Source, Popular Choice)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service catalog&lt;/strong&gt; — discover all services, their owners, and documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software templates&lt;/strong&gt; — create new services from golden paths via UI wizard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TechDocs&lt;/strong&gt; — documentation lives alongside code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins&lt;/strong&gt; — integrate AWS services, CI/CD status, cost dashboards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scorecards&lt;/strong&gt; — track adoption of best practices per team&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alternative: Custom Portal
&lt;/h3&gt;

&lt;p&gt;Some teams build a simpler portal with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React frontend&lt;/li&gt;
&lt;li&gt;API Gateway + Lambda backend&lt;/li&gt;
&lt;li&gt;Service Catalog / Proton API integration&lt;/li&gt;
&lt;li&gt;CloudFormation/Terraform execution via CodeBuild&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Platform Team Operating Model
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What the Platform Team Owns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Golden path templates (create, update, deprecate)&lt;/li&gt;
&lt;li&gt;Shared infrastructure (networking, clusters, CI/CD pipelines)&lt;/li&gt;
&lt;li&gt;Security baselines (scanning, guardrails, compliance)&lt;/li&gt;
&lt;li&gt;Observability stack (metrics, logs, traces, dashboards)&lt;/li&gt;
&lt;li&gt;Developer experience (portal, documentation, onboarding)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the Platform Team Does NOT Own
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Application code&lt;/li&gt;
&lt;li&gt;Business logic&lt;/li&gt;
&lt;li&gt;Feature decisions&lt;/li&gt;
&lt;li&gt;Application-level testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Size Guidance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Organization Size&lt;/th&gt;
&lt;th&gt;Platform Team&lt;/th&gt;
&lt;th&gt;Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50 developers&lt;/td&gt;
&lt;td&gt;3-5 platform engineers&lt;/td&gt;
&lt;td&gt;1:10-15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200 developers&lt;/td&gt;
&lt;td&gt;8-12 platform engineers&lt;/td&gt;
&lt;td&gt;1:15-20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500+ developers&lt;/td&gt;
&lt;td&gt;15-25 platform engineers&lt;/td&gt;
&lt;td&gt;1:20-30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Measuring Platform Success
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to first deploy&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 day&lt;/td&gt;
&lt;td&gt;Onboarding friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Golden path adoption&lt;/td&gt;
&lt;td&gt;&amp;gt; 80%&lt;/td&gt;
&lt;td&gt;Template quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead time for changes&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 hour&lt;/td&gt;
&lt;td&gt;CI/CD effectiveness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer satisfaction (NPS)&lt;/td&gt;
&lt;td&gt;&amp;gt; 40&lt;/td&gt;
&lt;td&gt;Overall experience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean time to recovery&lt;/td&gt;
&lt;td&gt;&amp;lt; 30 min&lt;/td&gt;
&lt;td&gt;Platform reliability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-service ratio&lt;/td&gt;
&lt;td&gt;&amp;gt; 90%&lt;/td&gt;
&lt;td&gt;Ticket reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common 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;"Build it and they will come"&lt;/td&gt;
&lt;td&gt;Developers ignore the platform&lt;/td&gt;
&lt;td&gt;Co-design with dev teams, solve THEIR pain points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too much abstraction&lt;/td&gt;
&lt;td&gt;Developers can't debug issues&lt;/td&gt;
&lt;td&gt;Provide escape hatches and visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mandatory everything&lt;/td&gt;
&lt;td&gt;Creates friction, teams route around&lt;/td&gt;
&lt;td&gt;Make golden paths easier than alternatives, not mandatory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform as ticket queue&lt;/td&gt;
&lt;td&gt;Defeats self-service purpose&lt;/td&gt;
&lt;td&gt;If devs still file tickets, the platform isn't done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over-engineering v1&lt;/td&gt;
&lt;td&gt;Launches too late, already outdated&lt;/td&gt;
&lt;td&gt;Start with 1-2 golden paths, iterate based on adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No documentation&lt;/td&gt;
&lt;td&gt;Developers can't onboard&lt;/td&gt;
&lt;td&gt;Treat docs as product feature, not afterthought&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting Started: The 90-Day Plan
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Days 1-30:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interview 5 dev teams about their biggest infrastructure pain points&lt;/li&gt;
&lt;li&gt;Identify the #1 most-deployed workload pattern (usually: web API or containerized service)&lt;/li&gt;
&lt;li&gt;Build the first golden path template for that pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Days 31-60:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy Service Catalog or Proton with the first template&lt;/li&gt;
&lt;li&gt;Onboard 2 teams as pilot users&lt;/li&gt;
&lt;li&gt;Iterate based on feedback (what's missing? what's confusing?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Days 61-90:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add CI/CD and observability to the golden path&lt;/li&gt;
&lt;li&gt;Build second template based on demand&lt;/li&gt;
&lt;li&gt;Launch developer portal (even basic) with documentation&lt;/li&gt;
&lt;li&gt;Measure: adoption rate, deploy frequency, support tickets avoided&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Platform engineering on AWS is about reducing developer cognitive load while maintaining governance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Self-service provisioning&lt;/strong&gt; — Service Catalog, Proton, or custom portal. No tickets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Golden paths&lt;/strong&gt; — opinionated templates with security, CI/CD, and observability built in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared platform services&lt;/strong&gt; — CI/CD, observability, security scanning as platform capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer portal&lt;/strong&gt; — Backstage or custom. Discoverability and documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating model&lt;/strong&gt; — platform team owns templates and shared infra, not application code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The best platforms aren't built by mandate. They're adopted because they're easier than the alternative. Start with one golden path that solves a real developer pain point, and grow from there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and platform engineering. 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>platformengineering</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>AWS Disaster Recovery Strategies: From Backup &amp; Restore to Multi-Region Active-Active</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Thu, 06 Aug 2026 09:34:10 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-disaster-recovery-strategies-from-backup-restore-to-multi-region-active-active-ljb</link>
      <guid>https://dev.to/alpeshkumbhare/aws-disaster-recovery-strategies-from-backup-restore-to-multi-region-active-active-ljb</guid>
      <description>&lt;p&gt;Every architecture eventually faces "what happens when this fails?" Disaster recovery (DR) isn't about preventing failures — it's about recovering from them within acceptable time and data loss thresholds.&lt;/p&gt;

&lt;p&gt;AWS provides four DR strategies with progressively lower RTO/RPO at progressively higher cost. The art is matching the right strategy to each workload's business criticality — not over-engineering (expensive) or under-investing (risky).&lt;/p&gt;

&lt;p&gt;This post covers all four strategies, when to use each, the AWS services that implement them, and practical automation patterns for reliable failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  RTO and RPO: The Two Numbers That Drive Everything
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Question It Answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;RTO&lt;/strong&gt; (Recovery Time Objective)&lt;/td&gt;
&lt;td&gt;Maximum acceptable downtime&lt;/td&gt;
&lt;td&gt;How long can we be down?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;RPO&lt;/strong&gt; (Recovery Point Objective)&lt;/td&gt;
&lt;td&gt;Maximum acceptable data loss&lt;/td&gt;
&lt;td&gt;How much data can we lose?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        Data Loss                    Downtime
   ◄──────────────────►     ◄──────────────────────►

   Last backup    Disaster    Recovery    Normal ops
       │              │           │            │
       ▼              ▼           ▼            ▼
   ────┼──────────────┼───────────┼────────────┼────
       │              │           │            │
       │◄── RPO ─────►│           │            │
                      │◄── RTO ──►│
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Four DR Strategies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Cost / Complexity →

   ┌────────────┐  ┌────────────┐  ┌────────────┐  ┌────────────┐
   │  Backup &amp;amp;  │  │   Pilot    │  │   Warm     │  │ Multi-Site │
   │  Restore   │  │   Light    │  │  Standby   │  │Active-Active│
   └────────────┘  └────────────┘  └────────────┘  └────────────┘

   RTO: Hours       RTO: 10s min    RTO: Minutes    RTO: Near-zero
   RPO: Hours       RPO: Minutes    RPO: Seconds    RPO: Near-zero
   Cost: $          Cost: $$        Cost: $$$       Cost: $$$$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Strategy 1: Backup and Restore
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RTO: 1-24 hours | RPO: 1-24 hours | Cost: Lowest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The simplest strategy: back up data and configurations to another region. When disaster strikes, restore from backups and rebuild infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&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;Backup Method&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2/EBS&lt;/td&gt;
&lt;td&gt;EBS Snapshots (cross-region copy)&lt;/td&gt;
&lt;td&gt;DR Region S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS&lt;/td&gt;
&lt;td&gt;Automated snapshots + cross-region replication&lt;/td&gt;
&lt;td&gt;DR Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;Cross-Region Replication (CRR)&lt;/td&gt;
&lt;td&gt;DR Region bucket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;Point-in-time recovery + on-demand backups&lt;/td&gt;
&lt;td&gt;DR Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFS&lt;/td&gt;
&lt;td&gt;AWS Backup with cross-region copy&lt;/td&gt;
&lt;td&gt;DR Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;CloudFormation/Terraform templates in S3&lt;/td&gt;
&lt;td&gt;DR Region&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  AWS Backup: Centralized Policy
&lt;/h3&gt;

&lt;p&gt;AWS Backup provides a single place to manage backup policies across services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backup Plan
├── Rule: Daily backups (retain 30 days)
├── Rule: Weekly backups (retain 90 days)
├── Rule: Monthly backups (retain 1 year)
└── Cross-region copy: All backups → DR region
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recovery Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Deploy infrastructure from IaC templates (CloudFormation/Terraform)&lt;/li&gt;
&lt;li&gt;Restore data from latest backups&lt;/li&gt;
&lt;li&gt;Update DNS to point to new resources&lt;/li&gt;
&lt;li&gt;Validate application health&lt;/li&gt;
&lt;li&gt;Redirect traffic&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Non-critical workloads where hours of downtime are acceptable&lt;/li&gt;
&lt;li&gt;Development/staging environments&lt;/li&gt;
&lt;li&gt;Compliance archives (data must exist in DR, but recovery speed isn't critical)&lt;/li&gt;
&lt;li&gt;Tightest budget constraints&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Strategy 2: Pilot Light
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RTO: 10 minutes - 1 hour | RPO: Minutes | Cost: Low-Medium&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keep the core infrastructure "lit" in the DR region — databases replicated, AMIs ready — but no compute running until needed. On failover, spin up compute and scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Always Running (the "pilot light")
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RDS read replica or Aurora Global Database (data continuously replicated)&lt;/li&gt;
&lt;li&gt;Core networking (VPC, subnets, security groups, Transit Gateway attachments)&lt;/li&gt;
&lt;li&gt;IAM roles and policies&lt;/li&gt;
&lt;li&gt;Route53 health checks monitoring primary region&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Starts on Failover
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;EC2 instances (launch from pre-configured AMIs or Auto Scaling Groups)&lt;/li&gt;
&lt;li&gt;ECS/EKS services (scale from 0 to required capacity)&lt;/li&gt;
&lt;li&gt;Load balancers (ALB/NLB with target groups)&lt;/li&gt;
&lt;li&gt;Caches (ElastiCache — cold start, data rebuilds from DB)&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PRIMARY REGION                          DR REGION (Pilot Light)
┌─────────────────┐                    ┌─────────────────┐
│  EC2 / ECS      │                    │  (Stopped/Zero) │
│  ALB            │                    │  (No ALB yet)   │
│  RDS Primary    │───replication────→ │  RDS Replica    │
│  ElastiCache    │                    │  (Not running)  │
│  S3 Bucket      │───CRR───────────→ │  S3 Bucket      │
└─────────────────┘                    └─────────────────┘
         │                                      │
    Route53 ─── health check fails ──→ trigger failover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Failover Automation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route53 health check fails
    │
    ▼
EventBridge rule triggers
    │
    ▼
Step Function: DR Failover
    ├── Promote RDS replica to primary
    ├── Launch EC2 / scale ECS to target capacity
    ├── Create ALB + register targets
    ├── Wait for health checks to pass
    └── Update Route53 to DR region endpoints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Strategy 3: Warm Standby
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RTO: Minutes | RPO: Seconds | Cost: Medium-High&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A scaled-down but fully functional copy of your production environment runs in the DR region at all times. On failover, scale up to full production capacity.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Always Running
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full application stack at reduced scale (e.g., 1 instance instead of 10)&lt;/li&gt;
&lt;li&gt;Database with synchronous or near-synchronous replication&lt;/li&gt;
&lt;li&gt;Load balancers actively health-checking&lt;/li&gt;
&lt;li&gt;Caches warm with subset of data&lt;/li&gt;
&lt;li&gt;Background workers at minimum capacity&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PRIMARY REGION (Full Scale)              DR REGION (Warm Standby)
┌──────────────────────┐                ┌──────────────────────┐
│  ALB (100% traffic)  │                │  ALB (0% traffic)    │
│  EC2: 10 instances   │                │  EC2: 2 instances    │
│  RDS Multi-AZ        │──async repl──→ │  RDS Read Replica    │
│  ElastiCache 3-node  │                │  ElastiCache 1-node  │
│  Workers: 5          │                │  Workers: 1          │
└──────────────────────┘                └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Failover Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Route53 weighted routing shifts traffic (or health check triggers automatic failover)&lt;/li&gt;
&lt;li&gt;Auto Scaling scales DR from warm (2 instances) to hot (10 instances)&lt;/li&gt;
&lt;li&gt;RDS replica promoted to primary (Aurora Global: ~1 minute)&lt;/li&gt;
&lt;li&gt;Caches warm up from database (transient latency spike)&lt;/li&gt;
&lt;li&gt;Full production capacity achieved in minutes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Key Services for Warm Standby
&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;DR Capability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora Global Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;1 second replication lag, ~1 minute failover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB Global Tables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-region active-active replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ElastiCache Global Datastore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-region Redis replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Cross-Region Replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Continuous object replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECS/EKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scale from minimum to target in DR region&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Strategy 4: Multi-Site Active-Active
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RTO: Near-zero | RPO: Near-zero | Cost: Highest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both regions serve production traffic simultaneously. No failover required — if one region fails, the other absorbs traffic automatically.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────┐
                    │   Route53    │
                    │ (Latency or  │
                    │  Weighted)   │
                    └──────┬───────┘
                           │
              ┌────────────┼────────────┐
              │                         │
              ▼                         ▼
    ┌──────────────────┐      ┌──────────────────┐
    │  REGION A (Active)│      │  REGION B (Active)│
    │  ALB + EC2/ECS   │      │  ALB + EC2/ECS   │
    │  Aurora Global    │◄────►│  Aurora Global    │
    │  DynamoDB Global  │◄────►│  DynamoDB Global  │
    │  ElastiCache     │◄────►│  ElastiCache     │
    └──────────────────┘      └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Design Challenges
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data conflicts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DynamoDB Global Tables (last-writer-wins) or application-level conflict resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session state&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateless applications + DynamoDB/ElastiCache for session store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database writes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aurora Global: single writer region with read replicas, or DynamoDB Global Tables for multi-writer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eventual consistency between regions (acceptable for most workloads)&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;2x infrastructure — only justified for business-critical, zero-downtime requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  AWS Elastic Disaster Recovery (DRS)
&lt;/h2&gt;

&lt;p&gt;For lift-and-shift DR of EC2 workloads and on-premises servers, AWS Elastic Disaster Recovery provides continuous block-level replication:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous replication&lt;/strong&gt; — sub-second RPO via block-level data sync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No impact on source&lt;/strong&gt; — lightweight agent, no snapshots needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time recovery&lt;/strong&gt; — recover to any point within retention window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated failover&lt;/strong&gt; — launch recovery instances with pre-configured settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DR drills&lt;/strong&gt; — test recovery without impacting production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports up to 3,000 servers&lt;/strong&gt; per target account&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DRS Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source Region/On-Prem              DR Region
┌─────────────────┐              ┌─────────────────┐
│  Source Server   │              │  Staging Area   │
│  (DRS Agent)     │──continuous─→│  (Low-cost EBS) │
│                  │  replication │                  │
└─────────────────┘              │  On failover:    │
                                 │  Launch recovery │
                                 │  instances with  │
                                 │  correct config  │
                                 └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use DRS vs Native DR
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Use DRS&lt;/th&gt;
&lt;th&gt;Use Native DR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Legacy EC2 apps (no IaC)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Hard to rebuild&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-premises servers&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS databases&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Cross-region replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containerized apps (ECS/EKS)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Redeploy from images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless (Lambda, Step Functions)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Multi-region deploy from IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  AWS Resilience Hub: Validate Your DR
&lt;/h2&gt;

&lt;p&gt;Resilience Hub continuously assesses whether your applications meet RTO/RPO targets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Define application&lt;/strong&gt; — map resources and their dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set targets&lt;/strong&gt; — specify RTO/RPO per application tier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assess&lt;/strong&gt; — Resilience Hub evaluates your architecture against targets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendations&lt;/strong&gt; — suggests improvements (add cross-region replication, implement multi-AZ, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift detection&lt;/strong&gt; — alerts when changes degrade resilience posture&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Service-Specific DR Patterns
&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;DR Pattern&lt;/th&gt;
&lt;th&gt;RPO&lt;/th&gt;
&lt;th&gt;RTO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aurora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global Database (read replicas in DR)&lt;/td&gt;
&lt;td&gt;~1 second&lt;/td&gt;
&lt;td&gt;~1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RDS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-region read replica + promotion&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global Tables (multi-region active)&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-Region Replication&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;&lt;strong&gt;EFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS Backup + cross-region restore&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ElastiCache Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global Datastore&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lambda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-region deploy from CI/CD&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;td&gt;Near-zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECS/EKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-region service with Route53&lt;/td&gt;
&lt;td&gt;Depends on DB&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQS/SNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recreate from IaC (stateless)&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  DR Strategy Selection Framework
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START
  │
  ├── Can you tolerate hours of downtime?
  │     └── YES → Backup &amp;amp; Restore ($)
  │
  ├── Need recovery in under 1 hour?
  │     └── YES → Pilot Light ($$)
  │
  ├── Need recovery in minutes?
  │     └── YES → Warm Standby ($$$)
  │
  └── Need zero downtime?
        └── YES → Active-Active ($$$$)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Per-workload approach:&lt;/strong&gt; Most organizations use different strategies for different tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 (revenue-generating):&lt;/strong&gt; Active-Active or Warm Standby&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 2 (business operations):&lt;/strong&gt; Pilot Light&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 3 (internal tools):&lt;/strong&gt; Backup &amp;amp; Restore&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DR Testing: The Part Everyone Skips
&lt;/h2&gt;

&lt;p&gt;A DR plan that hasn't been tested is a DR plan that doesn't work. Schedule regular drills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monthly:&lt;/strong&gt; Verify backups are restorable (pick random backup, restore, validate data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarterly:&lt;/strong&gt; Pilot Light / Warm Standby failover drill (trigger failover, measure RTO)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annually:&lt;/strong&gt; Full region failover exercise (for Active-Active workloads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use DRS non-disruptive drills&lt;/strong&gt; — launches recovery instances in isolation without affecting production or replication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate with Resilience Hub&lt;/strong&gt; — define test schedules, track results, alert on degradation.&lt;/p&gt;




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

&lt;p&gt;AWS DR isn't one-size-fits-all. Match strategy to business criticality:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Backup &amp;amp; Restore&lt;/strong&gt; — hours of RTO, lowest cost. Use for non-critical workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pilot Light&lt;/strong&gt; — database replicated, compute on-demand. 10 min - 1 hour RTO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm Standby&lt;/strong&gt; — scaled-down copy always running. Minutes RTO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active-Active&lt;/strong&gt; — both regions serve traffic. Near-zero RTO/RPO. 2x cost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The critical success factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automate failover&lt;/strong&gt; — manual runbooks at 3 AM don't work. Step Functions + Route53 health checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test regularly&lt;/strong&gt; — monthly backup validation, quarterly failover drills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Resilience Hub&lt;/strong&gt; — continuous validation that architecture meets RTO/RPO targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier your workloads&lt;/strong&gt; — not everything needs active-active. Spend where it matters.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and resilient 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>cloud</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Implementing Zero Trust Architecture on AWS: Verified Access, VPC Lattice, and Identity-Centric Security</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Wed, 05 Aug 2026 06:01:28 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/implementing-zero-trust-architecture-on-aws-verified-access-vpc-lattice-and-identity-centric-52fb</link>
      <guid>https://dev.to/alpeshkumbhare/implementing-zero-trust-architecture-on-aws-verified-access-vpc-lattice-and-identity-centric-52fb</guid>
      <description>&lt;p&gt;The traditional security model — "trust everything inside the network perimeter" — doesn't work in cloud. There is no perimeter. Resources span multiple accounts, regions, and connectivity paths. Developers deploy from home networks. APIs are called from everywhere.&lt;/p&gt;

&lt;p&gt;Zero Trust flips the model: &lt;strong&gt;never trust, always verify&lt;/strong&gt;. Every request is authenticated, authorized, and encrypted — regardless of where it comes from. On AWS, this isn't a single product. It's an architecture pattern built from multiple services working together.&lt;/p&gt;

&lt;p&gt;This post covers how to implement Zero Trust on AWS using the services available today, with practical patterns for user-to-application access, service-to-service communication, and data protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero Trust Principles on AWS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;AWS Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verify explicitly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authenticate and authorize every request based on identity, device, location, and context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Least privilege access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM policies, SCPs, resource policies scoped to minimum required permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Assume breach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Micro-segmentation, encryption everywhere, continuous monitoring, blast radius isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The AWS Zero Trust Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  USER-TO-APP ACCESS                                              │
│  AWS Verified Access | IAM Identity Center | Cognito             │
├─────────────────────────────────────────────────────────────────┤
│  SERVICE-TO-SERVICE                                              │
│  Amazon VPC Lattice | IAM Auth (SigV4) | PrivateLink            │
├─────────────────────────────────────────────────────────────────┤
│  NETWORK CONTROLS                                                │
│  Security Groups | NACLs | Network Firewall | VPC Endpoints     │
├─────────────────────────────────────────────────────────────────┤
│  DATA PROTECTION                                                 │
│  KMS Encryption | Macie | S3 Access Grants | Lake Formation     │
├─────────────────────────────────────────────────────────────────┤
│  CONTINUOUS VERIFICATION                                         │
│  GuardDuty | Security Hub | CloudTrail | IAM Access Analyzer    │
├─────────────────────────────────────────────────────────────────┤
│  GOVERNANCE                                                      │
│  SCPs | Config Rules | Resource Control Policies                 │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pillar 1: User-to-Application Access (Replace the VPN)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Verified Access
&lt;/h3&gt;

&lt;p&gt;Traditional pattern: User connects to VPN → gets network-level access to everything inside.&lt;/p&gt;

&lt;p&gt;Zero Trust pattern: User requests access to a specific application → identity and device posture are verified → access granted only to that application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Verified Access&lt;/strong&gt; implements this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No VPN required&lt;/strong&gt; — users access applications directly via browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request verification&lt;/strong&gt; — every HTTP request is evaluated against access policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity-aware&lt;/strong&gt; — integrates with IAM Identity Center, Okta, Azure AD, CrowdStrike, Jamf&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device posture&lt;/strong&gt; — check device compliance (managed device, antivirus active, OS updated)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application-level granularity&lt;/strong&gt; — access to App A doesn't imply access to App B&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Verified Access Works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (Browser)
    │
    ▼
┌──────────────────────┐
│  Verified Access      │
│  Endpoint             │
│  ┌────────────────┐  │
│  │ Trust Provider  │  │  ← Checks identity (IdP) + device (MDM)
│  │ (IdP + Device) │  │
│  └────────────────┘  │
│  ┌────────────────┐  │
│  │ Access Policy   │  │  ← Evaluates: user group + device trust + context
│  │ (Cedar)         │  │
│  └────────────────┘  │
└──────────┬───────────┘
           │ ✅ Allowed
           ▼
┌──────────────────────┐
│  Internal Application │
│  (ALB / NLB / ENI)   │
└──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access Policies with Cedar
&lt;/h3&gt;

&lt;p&gt;Verified Access uses Cedar policy language for fine-grained decisions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Allow access only for engineering team on managed devices
permit(principal, action, resource)
when {
    context.identity.groups.contains("engineering") &amp;amp;&amp;amp;
    context.device.status == "compliant" &amp;amp;&amp;amp;
    context.identity.email.endsWith("@company.com")
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use Verified Access vs VPN
&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;Verified Access&lt;/th&gt;
&lt;th&gt;VPN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web applications (HTTP/HTTPS)&lt;/td&gt;
&lt;td&gt;✅ Best fit&lt;/td&gt;
&lt;td&gt;Overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH/RDP to EC2&lt;/td&gt;
&lt;td&gt;Use SSM Session Manager instead&lt;/td&gt;
&lt;td&gt;Legacy option&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-HTTP protocols (database clients)&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Still needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party contractor access&lt;/td&gt;
&lt;td&gt;✅ Scoped, auditable&lt;/td&gt;
&lt;td&gt;Risky (broad access)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BYOD users&lt;/td&gt;
&lt;td&gt;✅ Device posture checks&lt;/td&gt;
&lt;td&gt;Hard to enforce&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Pillar 2: Service-to-Service Communication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Amazon VPC Lattice
&lt;/h3&gt;

&lt;p&gt;In microservices architectures, services call other services constantly. Without Zero Trust, any service in the VPC can call any other service — one compromised service exposes everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VPC Lattice&lt;/strong&gt; provides identity-based, service-to-service authorization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service network&lt;/strong&gt; — logical boundary grouping related services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth policies&lt;/strong&gt; — IAM-based (SigV4) authentication between services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request authorization&lt;/strong&gt; — every call verified against policy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-account&lt;/strong&gt; — services in different accounts can communicate securely without VPC peering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No networking changes&lt;/strong&gt; — works alongside existing VPCs, no route table modifications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VPC Lattice Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│               Service Network                         │
│                                                       │
│  ┌─────────┐        ┌─────────┐        ┌─────────┐ │
│  │Service A │──IAM──→│Service B │──IAM──→│Service C │ │
│  │(Account1)│  Auth  │(Account2)│  Auth  │(Account3)│ │
│  └─────────┘        └─────────┘        └─────────┘ │
│                                                       │
│  Auth Policy: Service A can call Service B            │
│  Auth Policy: Service B can call Service C            │
│  Deny all other combinations                          │
└─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VPC Lattice Auth Policy 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;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&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;"AWS"&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:iam::111111111111:role/ServiceA-Role"&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;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vpc-lattice-svcs:Invoke"&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:vpc-lattice:us-east-1:222222222222:service/svc-abc123/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&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;"StringEquals"&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;"vpc-lattice-svcs:RequestMethod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&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;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 policy: Service A (Account 1) can make GET requests to Service B (Account 2). Nothing else. No network path matters — even if networking allows it, IAM denies it.&lt;/p&gt;

&lt;h3&gt;
  
  
  VPC Lattice vs PrivateLink vs Service Mesh
&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;VPC Lattice&lt;/th&gt;
&lt;th&gt;PrivateLink&lt;/th&gt;
&lt;th&gt;Service Mesh (e.g., App Mesh)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Auth model&lt;/td&gt;
&lt;td&gt;IAM (native)&lt;/td&gt;
&lt;td&gt;Network-level only&lt;/td&gt;
&lt;td&gt;mTLS (self-managed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-account&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Complex (endpoint services)&lt;/td&gt;
&lt;td&gt;Requires mesh federation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol support&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, gRPC, TCP&lt;/td&gt;
&lt;td&gt;Any TCP&lt;/td&gt;
&lt;td&gt;HTTP, gRPC&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;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Sidecar-based (Envoy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Per request + data&lt;/td&gt;
&lt;td&gt;Per endpoint-hour + data&lt;/td&gt;
&lt;td&gt;Proxy instances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Pillar 3: Network Micro-Segmentation
&lt;/h2&gt;

&lt;p&gt;Zero Trust doesn't eliminate networks — it adds identity verification ON TOP of network controls:&lt;/p&gt;

&lt;h3&gt;
  
  
  Defense in Depth: Layered Network Controls
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer 1: VPC Isolation (account-per-workload)
  └── Layer 2: Subnet segmentation (public/private/isolated)
       └── Layer 3: Security Groups (instance-level, stateful)
            └── Layer 4: Network Firewall (domain filtering, IPS)
                 └── Layer 5: VPC Lattice / Verified Access (identity-based)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Network Zero Trust Patterns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: No public subnets for applications&lt;/strong&gt;&lt;br&gt;
All applications live in private subnets. Access only through Verified Access (users) or VPC Lattice (services). No direct internet exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: VPC endpoints for AWS services&lt;/strong&gt;&lt;br&gt;
Don't route AWS API calls through the internet. Use Interface VPC Endpoints — traffic stays on AWS backbone, accessible only from your VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 3: DNS-based network firewall&lt;/strong&gt;&lt;br&gt;
AWS Network Firewall with domain-based rules — allow only approved domains for egress. Block everything else by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 4: Eliminate broad security group rules&lt;/strong&gt;&lt;br&gt;
Replace &lt;code&gt;0.0.0.0/0&lt;/code&gt; ingress with prefix lists or security group references. Every rule should have a documented justification.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pillar 4: Data Protection
&lt;/h2&gt;

&lt;p&gt;Zero Trust for data means: even if someone has network access and authenticated identity, they only see data they're explicitly authorized for.&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;Zero Trust Capability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encryption keys with key policies — even admins can't decrypt without explicit grant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Access Grants&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Map identities (from Identity Center) to specific S3 prefixes — fine-grained data access&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;Column-level and row-level access control for analytics data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Macie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Continuously discover and alert on sensitive data in S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RDS IAM Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database access via IAM tokens instead of passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rotate credentials automatically — no long-lived database passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  S3 Access Grants: Identity-Based Data Access
&lt;/h3&gt;

&lt;p&gt;Instead of broad S3 bucket policies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User/Role → Identity Center Group → Access Grant → S3 Prefix

Marketing team → can read s3://data-lake/marketing/*
Engineering team → can read/write s3://data-lake/engineering/*
Finance team → can read s3://data-lake/finance/* (with Macie monitoring)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bucket policies to manage. Identity drives data access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 5: Continuous Verification and Monitoring
&lt;/h2&gt;

&lt;p&gt;Zero Trust isn't set-and-forget. Continuous verification detects drift and threats:&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;What It Monitors&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GuardDuty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Threat detection — compromised credentials, crypto mining, C&amp;amp;C communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM Access Analyzer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;External access — finds resources shared outside your organization&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;Compliance — CIS benchmarks, AWS Foundational Security Best Practices&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 — every API call, who did what, when, from where&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Drift — detects when resources deviate from compliant state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detective&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Investigation — visualize and investigate security findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Flow Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network — all traffic flows for forensic analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Automated Response Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GuardDuty Finding (e.g., compromised credentials)
    │
    ▼
EventBridge Rule
    │
    ▼
Lambda: Auto-remediate
    ├── Revoke active sessions
    ├── Attach deny-all SCP to affected account
    ├── Isolate EC2 (restrict security group)
    └── Create ITSM incident
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Implementation Roadmap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Foundation (Weeks 1-4)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable CloudTrail, GuardDuty, Security Hub across all accounts&lt;/li&gt;
&lt;li&gt;Implement mandatory tagging and Config rules&lt;/li&gt;
&lt;li&gt;Audit existing security group rules — remove &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable VPC endpoints for S3, DynamoDB, and frequently-used AWS APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Identity-Centric Access (Weeks 5-8)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy Verified Access for top 3 internal web applications&lt;/li&gt;
&lt;li&gt;Migrate users off VPN for those applications&lt;/li&gt;
&lt;li&gt;Implement IAM Identity Center with MFA and device trust&lt;/li&gt;
&lt;li&gt;Enable RDS IAM authentication (eliminate static database passwords)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Service-to-Service (Weeks 9-12)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy VPC Lattice for critical service-to-service paths&lt;/li&gt;
&lt;li&gt;Implement IAM auth policies (SigV4 signing)&lt;/li&gt;
&lt;li&gt;Remove overly broad security group rules between services&lt;/li&gt;
&lt;li&gt;Enable VPC Lattice access logs for audit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 4: Data and Continuous (Ongoing)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable S3 Access Grants for data lake&lt;/li&gt;
&lt;li&gt;Deploy Macie for sensitive data discovery&lt;/li&gt;
&lt;li&gt;Implement automated remediation (GuardDuty → Lambda)&lt;/li&gt;
&lt;li&gt;Regular access reviews with IAM Access Analyzer&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Objections (and Answers)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Objection&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"We already have a VPN"&lt;/td&gt;
&lt;td&gt;VPN gives network access. Zero Trust gives application access. Breach one VPN credential = access everything.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"It's too complex to implement"&lt;/td&gt;
&lt;td&gt;Phase it. Start with Verified Access for one app. Don't boil the ocean.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Performance overhead?"&lt;/td&gt;
&lt;td&gt;Verified Access adds &amp;lt;10ms latency. VPC Lattice is in-line networking (negligible).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We trust our internal services"&lt;/td&gt;
&lt;td&gt;Assume breach. One compromised container shouldn't access your payment service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Compliance requires VPN"&lt;/td&gt;
&lt;td&gt;Most compliance frameworks (SOC2, ISO27001) now accept Zero Trust as equivalent or superior to VPN.&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;Zero Trust on AWS is built from five pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User-to-app: Verified Access&lt;/strong&gt; — replace VPN with per-request identity + device verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service-to-service: VPC Lattice&lt;/strong&gt; — IAM-based authentication between services, even cross-account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network: Micro-segmentation&lt;/strong&gt; — security groups + Network Firewall + no public exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data: Identity-driven access&lt;/strong&gt; — KMS, S3 Access Grants, Lake Formation, RDS IAM auth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous: Monitor and respond&lt;/strong&gt; — GuardDuty, Security Hub, automated remediation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key shift: network location is no longer a trust signal. Identity is. Every request proves who it is, every service proves it's allowed, and every data access is scoped to exactly what's needed.&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>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Building Agentic AI on AWS: From Bedrock Agents to Multi-Agent Orchestration with AgentCore</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:00:45 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/building-agentic-ai-on-aws-from-bedrock-agents-to-multi-agent-orchestration-with-agentcore-3pnn</link>
      <guid>https://dev.to/alpeshkumbhare/building-agentic-ai-on-aws-from-bedrock-agents-to-multi-agent-orchestration-with-agentcore-3pnn</guid>
      <description>&lt;p&gt;2026 is the year AI moved from "answer questions" to "take actions." Agentic AI — systems that autonomously plan, reason, use tools, and execute multi-step tasks — has become the dominant pattern for building intelligent applications on AWS.&lt;/p&gt;

&lt;p&gt;This post covers the full agentic AI stack on AWS: from single-agent basics to multi-agent orchestration, the infrastructure that runs them, and the guardrails that keep them safe in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes AI "Agentic"?
&lt;/h2&gt;

&lt;p&gt;Traditional AI: User asks question → Model generates answer → Done.&lt;/p&gt;

&lt;p&gt;Agentic AI: User states goal → Agent plans steps → Agent calls tools → Agent evaluates results → Agent iterates → Goal achieved.&lt;/p&gt;

&lt;p&gt;The difference is &lt;strong&gt;autonomy&lt;/strong&gt;. An agent decides what to do, executes actions, and self-corrects — without human intervention at each step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    AGENTIC AI LOOP                            │
│                                                              │
│   User Goal → Plan → Act → Observe → Reason → Act → Done   │
│                  ↑                               │           │
│                  └───────── iterate ──────────────┘           │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The AWS Agentic AI Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  APPLICATION LAYER                                               │
│  Amazon Q (Business &amp;amp; Developer) | Custom agents via Bedrock    │
├─────────────────────────────────────────────────────────────────┤
│  AGENT FRAMEWORKS                                                │
│  Bedrock Agents | Strands Agents SDK | LangGraph on AgentCore   │
├─────────────────────────────────────────────────────────────────┤
│  AGENT INFRASTRUCTURE (AgentCore)                                │
│  Runtime | Memory | Identity | Observability | Code Interpreter │
├─────────────────────────────────────────────────────────────────┤
│  TOOLS &amp;amp; KNOWLEDGE                                               │
│  AgentCore Gateway (MCP) | Knowledge Bases (RAG) | Action Groups│
├─────────────────────────────────────────────────────────────────┤
│  SAFETY &amp;amp; GOVERNANCE                                             │
│  Guardrails | IAM | CloudTrail | Model Evaluation               │
├─────────────────────────────────────────────────────────────────┤
│  FOUNDATION MODELS                                               │
│  Claude | Nova | Llama | Mistral | DeepSeek (via Bedrock)       │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Amazon Bedrock Agents: The Managed Path
&lt;/h2&gt;

&lt;p&gt;Bedrock Agents is the fully managed way to build AI agents. You define the agent's instructions, connect tools and knowledge, and Bedrock handles the orchestration loop (ReAct-style reasoning).&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Concepts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&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;&lt;strong&gt;Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System prompt that defines agent's role, behavior, and boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Action Groups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tools the agent can call (Lambda functions, APIs, or return-of-control)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Knowledge Bases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RAG — grounds agent responses in your data (documents, databases)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guardrails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safety controls (content filters, PII masking, denied topics)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Session persistence — agent remembers context across turns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Interpreter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent can write and execute code to solve problems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How the Orchestration Loop Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User sends a message to the agent&lt;/li&gt;
&lt;li&gt;Agent's foundation model &lt;strong&gt;reasons&lt;/strong&gt; about what to do (using instructions + context)&lt;/li&gt;
&lt;li&gt;Agent decides to &lt;strong&gt;call a tool&lt;/strong&gt; (action group) or &lt;strong&gt;query knowledge&lt;/strong&gt; (RAG)&lt;/li&gt;
&lt;li&gt;Tool executes and returns results&lt;/li&gt;
&lt;li&gt;Agent &lt;strong&gt;evaluates&lt;/strong&gt; the results — decides if goal is met or needs more steps&lt;/li&gt;
&lt;li&gt;Repeat until goal is achieved or max iterations reached&lt;/li&gt;
&lt;li&gt;Agent returns final response to user&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Building an Agent: Key Design Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Choosing the model:&lt;/strong&gt; Claude Sonnet or Nova Pro for complex reasoning. Haiku or Nova Micro for simple routing agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instruction design:&lt;/strong&gt; Be specific about the agent's role, what it should NOT do, and how to handle ambiguity. Vague instructions lead to unpredictable behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool design:&lt;/strong&gt; Each tool should do ONE thing well. Name them clearly (the model uses the name and description to decide when to call them). Include input/output schemas.&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="c1"&gt;# Example: Defining an action group tool
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actionGroupName&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;OrderManagement&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;description&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;Manages customer orders - lookup, modify, cancel&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;apiSchema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payload&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;openapi-schema.json&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;actionGroupExecutor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lambda&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;arn:aws:lambda:us-east-1:123456789:function:order-api&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Multi-Agent Collaboration: Supervisor Pattern
&lt;/h2&gt;

&lt;p&gt;For complex problems, a single agent isn't enough. Multi-agent collaboration lets specialized agents work together:&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture: Supervisor + Collaborators
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────┐
                    │  Supervisor Agent │
     User ────────→│  (Routes tasks)  │
                    └────────┬─────────┘
                             │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
     ┌──────────────┐ ┌───────────┐ ┌──────────────┐
     │ Research Agent│ │ Code Agent│ │ Review Agent │
     │ (RAG + Web)  │ │ (CodeGen) │ │ (Validation) │
     └──────────────┘ └───────────┘ └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works on Bedrock
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Supervisor agent&lt;/strong&gt; — Receives user request, analyzes complexity, and routes to specialist agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborator agents&lt;/strong&gt; — Each has specific tools and knowledge. Execute their specialty and return results to supervisor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supervisor synthesizes&lt;/strong&gt; — Combines collaborator outputs into final response&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  When to Use Multi-Agent
&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;Single Agent&lt;/th&gt;
&lt;th&gt;Multi-Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FAQ chatbot&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code generation only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Unnecessary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research + summarize + format&lt;/td&gt;
&lt;td&gt;⚠️ Gets messy&lt;/td&gt;
&lt;td&gt;✅ Clean separation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer support (billing + tech + shipping)&lt;/td&gt;
&lt;td&gt;⚠️ Tool overload&lt;/td&gt;
&lt;td&gt;✅ Specialist routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex analysis with validation&lt;/td&gt;
&lt;td&gt;⚠️ Context window limits&lt;/td&gt;
&lt;td&gt;✅ Divide and conquer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; If one agent would need &amp;gt;10 tools or &amp;gt;3 distinct responsibilities, split into multiple agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Amazon Bedrock AgentCore: Production Infrastructure
&lt;/h2&gt;

&lt;p&gt;AgentCore is the runtime infrastructure for deploying agents at scale. It provides the "boring but critical" capabilities agents need in production:&lt;/p&gt;

&lt;h3&gt;
  
  
  AgentCore 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;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless execution environment for agents (auto-scaling, isolation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed long-term memory across sessions (agent remembers past interactions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authentication for agent-to-service and agent-to-agent communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Traces, metrics, and logs for debugging agent behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Interpreter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sandboxed code execution (Python/JS) for data analysis tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts APIs and Lambda functions into MCP-compatible tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  AgentCore Gateway: The Tool Layer
&lt;/h3&gt;

&lt;p&gt;The Gateway is particularly powerful — it transforms your existing APIs into tools that any agent can discover and use via the Model Context Protocol (MCP):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point Gateway at your OpenAPI spec or Lambda function&lt;/li&gt;
&lt;li&gt;Gateway auto-generates MCP-compatible tool definitions&lt;/li&gt;
&lt;li&gt;Agents discover tools at runtime (no hard-coding)&lt;/li&gt;
&lt;li&gt;Security: IAM-based access control per tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means agents don't need tools baked into their code. They discover capabilities dynamically — add a new API to Gateway, and all connected agents can immediately use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Strands Agents SDK: The Open-Source Path
&lt;/h2&gt;

&lt;p&gt;For teams wanting more control, AWS released &lt;strong&gt;Strands Agents SDK&lt;/strong&gt; — an open-source Python framework for building agents that runs on AgentCore:&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Strands?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model-agnostic&lt;/strong&gt; — works with any Bedrock model (or external models)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool-first&lt;/strong&gt; — tools are defined with &lt;code&gt;@tool&lt;/code&gt; decorator, auto-generating schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory built-in&lt;/strong&gt; — integrates with AgentCore Memory for persistence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP native&lt;/strong&gt; — discovers tools from MCP servers at runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observable&lt;/strong&gt; — built-in tracing compatible with AgentCore Observability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Agent Structure
&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;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.models.bedrock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get current weather for a city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Call weather API
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: 22°C, sunny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_ticket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Create a support ticket in the ticketing system.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Call ticketing API
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Created ticket: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (priority: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;BedrockModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_ticket&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant that can check weather and create tickets.&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="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check the weather in London and create a ticket if it&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s raining&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;h3&gt;
  
  
  Strands vs Bedrock Agents: When to Use Which
&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;Bedrock Agents (Managed)&lt;/th&gt;
&lt;th&gt;Strands SDK (Code-first)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup complexity&lt;/td&gt;
&lt;td&gt;Low (console/API)&lt;/td&gt;
&lt;td&gt;Medium (write code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customization&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Full control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration logic&lt;/td&gt;
&lt;td&gt;AWS-managed ReAct loop&lt;/td&gt;
&lt;td&gt;Custom (you define the loop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent&lt;/td&gt;
&lt;td&gt;Built-in supervisor pattern&lt;/td&gt;
&lt;td&gt;Build your own topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Fully managed&lt;/td&gt;
&lt;td&gt;AgentCore Runtime or self-hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Standard use cases, rapid prototyping&lt;/td&gt;
&lt;td&gt;Complex custom logic, advanced patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Knowledge Bases: Grounding Agents in Facts
&lt;/h2&gt;

&lt;p&gt;Without knowledge, agents hallucinate. Knowledge Bases provide RAG (Retrieval-Augmented Generation):&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingest&lt;/strong&gt; — Upload documents (PDF, HTML, Markdown, Word, CSV) to S3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk &amp;amp; Embed&lt;/strong&gt; — Knowledge Base splits documents into chunks, generates embeddings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt; — Embeddings stored in vector database (OpenSearch Serverless, Aurora, Pinecone, or Managed KB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve&lt;/strong&gt; — When agent needs information, relevant chunks are retrieved and injected into prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; — Model generates response grounded in retrieved facts&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Managed Knowledge Base (GA June 2026)
&lt;/h3&gt;

&lt;p&gt;The latest option — fully managed RAG without provisioning anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No vector database to manage&lt;/li&gt;
&lt;li&gt;Auto-scaling retrieval&lt;/li&gt;
&lt;li&gt;Multimodal ingestion (text, images, tables)&lt;/li&gt;
&lt;li&gt;Built-in re-ranking for relevance&lt;/li&gt;
&lt;li&gt;Agentic retrieval (multi-hop reasoning across documents)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Guardrails: Keeping Agents Safe
&lt;/h2&gt;

&lt;p&gt;Agents that take actions need safety boundaries. Bedrock Guardrails provides:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy Type&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;&lt;strong&gt;Content filters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block harmful content (hate, violence, sexual, misconduct) with configurable thresholds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Denied topics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevent agent from discussing specific topics (competitor info, legal advice, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Word filters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block specific words or phrases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sensitive information&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detect and mask PII (names, emails, credit cards, SSNs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grounding check&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detect hallucinations by comparing response against source documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contextual grounding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify response relevance to the user's query&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Applying Guardrails
&lt;/h3&gt;

&lt;p&gt;Guardrails attach to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent itself (all interactions filtered)&lt;/li&gt;
&lt;li&gt;Specific Knowledge Base queries&lt;/li&gt;
&lt;li&gt;Individual nodes in a Bedrock Flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Apply guardrails on BOTH input (what users send) AND output (what agents respond). Users can craft prompts to bypass instructions — guardrails are the defense layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Orchestration Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern 1: Supervisor-Worker (Hierarchical)
&lt;/h3&gt;

&lt;p&gt;Best for: Customer support, multi-domain queries.&lt;br&gt;
One supervisor routes to specialist workers. Workers don't talk to each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Pipeline (Sequential)
&lt;/h3&gt;

&lt;p&gt;Best for: Document processing, content creation.&lt;br&gt;
Agent A → Agent B → Agent C. Each stage enriches output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: Parallel Fan-Out
&lt;/h3&gt;

&lt;p&gt;Best for: Research, data gathering from multiple sources.&lt;br&gt;
Multiple agents work simultaneously, results aggregated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 4: Debate/Validation
&lt;/h3&gt;

&lt;p&gt;Best for: High-stakes decisions, code review.&lt;br&gt;
Generator agent produces output, critic agent evaluates quality, iterate until criteria met.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production Checklist for Agentic AI
&lt;/h2&gt;

&lt;p&gt;Before deploying agents to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Guardrails configured&lt;/strong&gt; — content filters, denied topics, PII masking&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;IAM scoped&lt;/strong&gt; — agent's execution role has minimum required permissions&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Tool permissions bounded&lt;/strong&gt; — each tool can only access specific resources&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Observability enabled&lt;/strong&gt; — traces for every agent invocation (debug failed reasoning)&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Cost controls&lt;/strong&gt; — max iterations per invocation, token budgets&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Fallback behavior defined&lt;/strong&gt; — what happens when agent can't solve the problem?&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Human-in-the-loop&lt;/strong&gt; — for high-impact actions (delete, purchase, deploy), require approval&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Testing&lt;/strong&gt; — evaluate against known good/bad inputs before production&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Rate limiting&lt;/strong&gt; — prevent runaway agents from flooding APIs&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Audit trail&lt;/strong&gt; — CloudTrail logging of all agent actions and tool invocations&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The agentic AI space on AWS is evolving rapidly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock Flows&lt;/strong&gt; — visual builder for chaining agents, prompts, and conditions without code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent-to-agent communication&lt;/strong&gt; — agents that discover and delegate to other agents autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-running agents&lt;/strong&gt; — agents that persist across hours/days (not just request-response)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AgentCore Memory improvements&lt;/strong&gt; — structured memory with entity relationships, not just conversation history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP ecosystem growth&lt;/strong&gt; — more pre-built tool servers for common services (databases, APIs, SaaS platforms)&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Building agentic AI on AWS in 2026:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with Bedrock Agents&lt;/strong&gt; for managed orchestration — fast to prototype, production-ready&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Strands SDK&lt;/strong&gt; when you need custom orchestration logic or advanced patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy on AgentCore&lt;/strong&gt; for production infrastructure (memory, identity, observability)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect tools via AgentCore Gateway&lt;/strong&gt; — MCP-based discovery, zero hard-coding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ground with Knowledge Bases&lt;/strong&gt; — RAG prevents hallucination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protect with Guardrails&lt;/strong&gt; — content filters, PII masking, grounding checks on every interaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale with multi-agent patterns&lt;/strong&gt; — supervisor-worker for complex domains, pipeline for sequential processing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The shift from "chatbot that answers" to "agent that acts" is the defining pattern of cloud AI in 2026. The infrastructure is ready — the question is what you build on it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and cloud AI solutions. 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>ai</category>
      <category>agents</category>
      <category>serverless</category>
    </item>
    <item>
      <title>AWS Cost Optimization Playbook: 20 Strategies That Actually Save Money in Production</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Mon, 03 Aug 2026 08:10:45 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/aws-cost-optimization-playbook-20-strategies-that-actually-save-money-in-production-33oo</link>
      <guid>https://dev.to/alpeshkumbhare/aws-cost-optimization-playbook-20-strategies-that-actually-save-money-in-production-33oo</guid>
      <description>&lt;p&gt;Industry data consistently shows 28-50% of cloud spend is avoidable. Not because teams are careless, but because cost optimization is a continuous discipline — not a one-time project. Resources get provisioned for peak load and never scaled down, default storage classes persist long after access patterns change, and commitment coverage drifts as workloads evolve.&lt;/p&gt;

&lt;p&gt;This playbook covers 20 cost optimization strategies organized by impact area, with specific AWS services and actionable implementation steps for each.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│  Layer 1: VISIBILITY (you can't optimize what you can't see)     │
│  Cost Explorer | CUR | Budgets | Tags | Cost Anomaly Detection  │
├─────────────────────────────────────────────────────────────────┤
│  Layer 2: PRICING MODELS (biggest single lever)                  │
│  Savings Plans | Reserved Instances | Spot | Graviton            │
├─────────────────────────────────────────────────────────────────┤
│  Layer 3: RIGHTSIZING (match resources to actual demand)          │
│  Compute Optimizer | Trusted Advisor | Auto Scaling              │
├─────────────────────────────────────────────────────────────────┤
│  Layer 4: ARCHITECTURE (design for cost efficiency)              │
│  Serverless | Storage tiering | Data transfer | Caching          │
├─────────────────────────────────────────────────────────────────┤
│  Layer 5: GOVERNANCE (sustain savings over time)                  │
│  FinOps practices | Automation | Accountability                  │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Layer 1: Visibility — Know Where the Money Goes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 1: Enforce Cost Allocation Tags
&lt;/h3&gt;

&lt;p&gt;Without tags, you can't attribute spend to teams, projects, or environments. This is the foundation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mandatory tags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Environment&lt;/code&gt; (prod/staging/dev)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Team&lt;/code&gt; or &lt;code&gt;CostCenter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Project&lt;/code&gt; or &lt;code&gt;Application&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Owner&lt;/code&gt; (email of responsible person)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enforce with:&lt;/strong&gt; AWS Config rule &lt;code&gt;required-tags&lt;/code&gt; + SCP that denies resource creation without mandatory tags.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 2: Enable Cost and Usage Reports (CUR)
&lt;/h3&gt;

&lt;p&gt;Cost Explorer gives you summaries. CUR gives you line-item detail (every API call, every hour, every resource). Export CUR to S3 and query with Athena for custom analysis.&lt;/p&gt;

&lt;p&gt;Key CUR insights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which resources have zero utilization?&lt;/li&gt;
&lt;li&gt;What percentage of spend is On-Demand vs committed?&lt;/li&gt;
&lt;li&gt;Where is data transfer cost concentrated?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy 3: Set Up Cost Anomaly Detection
&lt;/h3&gt;

&lt;p&gt;AWS Cost Anomaly Detection uses ML to identify unexpected spend spikes. Configure alerts per service, account, or cost allocation tag. Catches runaway resources before they become $10K problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 4: Per-Account AWS Budgets
&lt;/h3&gt;

&lt;p&gt;Set monthly budgets per account with alerts at 50%, 80%, and 100% thresholds. Optionally trigger automatic actions (stop EC2 instances, apply restrictive SCP) when budgets are exceeded in non-production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2: Pricing Models — The Biggest Lever
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 5: Compute Savings Plans
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Savings:&lt;/strong&gt; Up to 72% vs On-Demand.&lt;/p&gt;

&lt;p&gt;Compute Savings Plans are the most flexible commitment — they apply automatically to any EC2, Fargate, or Lambda usage regardless of instance family, size, OS, or region.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Analyze 30-day baseline in Cost Explorer → Savings Plans recommendations&lt;/li&gt;
&lt;li&gt;Commit to covering your steady-state floor (typically 60-70% of average usage)&lt;/li&gt;
&lt;li&gt;Let On-Demand cover the peaks above commitment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Never commit to more than your minimum usage floor. Over-commitment is waste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 6: EC2 Reserved Instances (for specific workloads)
&lt;/h3&gt;

&lt;p&gt;RIs give deeper discounts than Savings Plans (up to 75%) but lock you to specific instance family + region. Use for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RDS databases (fixed instance type, always running)&lt;/li&gt;
&lt;li&gt;ElastiCache clusters&lt;/li&gt;
&lt;li&gt;OpenSearch domains&lt;/li&gt;
&lt;li&gt;Redshift clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy 7: Spot Instances for Fault-Tolerant Workloads
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Savings:&lt;/strong&gt; Up to 90% vs On-Demand.&lt;/p&gt;

&lt;p&gt;Use Spot for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch processing, data pipelines, ETL jobs&lt;/li&gt;
&lt;li&gt;CI/CD build agents&lt;/li&gt;
&lt;li&gt;Stateless web tier (behind ALB with multiple instance types)&lt;/li&gt;
&lt;li&gt;EKS/ECS worker nodes (with mixed capacity strategy)&lt;/li&gt;
&lt;li&gt;SageMaker training jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key:&lt;/strong&gt; Use Spot Fleet or EC2 Auto Scaling with multiple instance types and AZs to reduce interruption risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 8: Graviton Migration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Savings:&lt;/strong&gt; 20-40% better price-performance vs x86.&lt;/p&gt;

&lt;p&gt;AWS Graviton (ARM-based) instances offer immediate savings with no code changes for most workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;m7g&lt;/code&gt; instead of &lt;code&gt;m7i&lt;/code&gt; (general purpose)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c7g&lt;/code&gt; instead of &lt;code&gt;c7i&lt;/code&gt; (compute-optimized)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r7g&lt;/code&gt; instead of &lt;code&gt;r7i&lt;/code&gt; (memory-optimized)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What works out of the box:&lt;/strong&gt; Java, Python, Node.js, .NET 6+, Go, containers, databases (RDS, ElastiCache, OpenSearch all support Graviton).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migration path:&lt;/strong&gt; Start with non-production → validate performance → switch production during next deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 3: Rightsizing — Match Resources to Demand
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 9: EC2 Rightsizing with Compute Optimizer
&lt;/h3&gt;

&lt;p&gt;AWS Compute Optimizer analyzes 14 days of CloudWatch metrics and recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Downsizing over-provisioned instances&lt;/li&gt;
&lt;li&gt;Upsizing under-performing instances&lt;/li&gt;
&lt;li&gt;Moving to Graviton&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reality check:&lt;/strong&gt; Most organizations have 30-40% of EC2 instances over-provisioned by at least one size. A &lt;code&gt;m5.xlarge&lt;/code&gt; running at 5% CPU should be an &lt;code&gt;m5.large&lt;/code&gt; or smaller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 10: Auto Scaling Everything
&lt;/h3&gt;

&lt;p&gt;If a workload doesn't run 24/7, it shouldn't pay 24/7:&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;Scaling Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2&lt;/td&gt;
&lt;td&gt;Target tracking on CPU/memory + scheduled scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS/Fargate&lt;/td&gt;
&lt;td&gt;Service auto scaling on request count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;Inherently auto-scales (pay per invocation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS&lt;/td&gt;
&lt;td&gt;Aurora Auto Scaling for read replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;On-demand mode or auto scaling for provisioned&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Strategy 11: Stop/Start Non-Production Resources
&lt;/h3&gt;

&lt;p&gt;Development and staging environments don't need to run nights and weekends. Schedule EC2, RDS, and EKS node groups to stop outside business hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Savings:&lt;/strong&gt; ~65% on dev/staging compute (running 10 hours/day × 5 days vs 24/7).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; AWS Instance Scheduler, EventBridge + Lambda, or Terraform with lifecycle schedules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 12: Identify and Terminate Zombie Resources
&lt;/h3&gt;

&lt;p&gt;Common zombies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unattached EBS volumes (charged even when not attached)&lt;/li&gt;
&lt;li&gt;Idle Elastic IPs ($3.65/month per unused EIP)&lt;/li&gt;
&lt;li&gt;Old EBS snapshots beyond retention policy&lt;/li&gt;
&lt;li&gt;Idle load balancers (no healthy targets)&lt;/li&gt;
&lt;li&gt;Unused NAT Gateways ($32/month + data processing)&lt;/li&gt;
&lt;li&gt;Orphaned RDS snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Detection:&lt;/strong&gt; Trusted Advisor + custom Config rules + Cost Explorer filtering for zero-traffic resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 4: Architecture — Design for Cost
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 13: Storage Tiering
&lt;/h3&gt;

&lt;p&gt;S3 storage classes offer massive savings for infrequently accessed data:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Savings vs Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 Standard&lt;/td&gt;
&lt;td&gt;Frequently accessed&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Intelligent-Tiering&lt;/td&gt;
&lt;td&gt;Unknown/changing access patterns&lt;/td&gt;
&lt;td&gt;Automatic, ~40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Standard-IA&lt;/td&gt;
&lt;td&gt;Accessed &amp;lt; 1x/month&lt;/td&gt;
&lt;td&gt;~45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Glacier Instant Retrieval&lt;/td&gt;
&lt;td&gt;Archives needing millisecond access&lt;/td&gt;
&lt;td&gt;~68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Glacier Flexible&lt;/td&gt;
&lt;td&gt;Archives (5-12 hour retrieval OK)&lt;/td&gt;
&lt;td&gt;~78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Glacier Deep Archive&lt;/td&gt;
&lt;td&gt;Compliance archives (12+ hour retrieval)&lt;/td&gt;
&lt;td&gt;~95%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; Enable S3 Lifecycle rules to automatically transition objects. Use Intelligent-Tiering as default if access patterns are unpredictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EBS:&lt;/strong&gt; Switch gp2 volumes to gp3 (20% cheaper, better baseline performance). Evaluate whether io2 is truly needed or if gp3 with provisioned IOPS suffices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 14: Reduce Data Transfer Costs
&lt;/h3&gt;

&lt;p&gt;Data transfer is the hidden AWS cost killer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-region transfer&lt;/td&gt;
&lt;td&gt;$0.02/GB&lt;/td&gt;
&lt;td&gt;Keep data and compute in same region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet egress&lt;/td&gt;
&lt;td&gt;$0.09/GB (first 10TB)&lt;/td&gt;
&lt;td&gt;CloudFront ($0.085/GB, cheaper at scale)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-AZ transfer&lt;/td&gt;
&lt;td&gt;$0.01/GB each direction&lt;/td&gt;
&lt;td&gt;Place tightly-coupled services in same AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT Gateway processing&lt;/td&gt;
&lt;td&gt;$0.045/GB&lt;/td&gt;
&lt;td&gt;Use VPC endpoints for AWS services ($0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Quick wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC endpoints for S3 and DynamoDB (Gateway endpoints are free)&lt;/li&gt;
&lt;li&gt;Interface endpoints for frequently-called AWS APIs (cheaper than NAT Gateway data processing)&lt;/li&gt;
&lt;li&gt;CloudFront for static content (cheaper than direct S3 egress)&lt;/li&gt;
&lt;li&gt;Same-AZ placement for chatty services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy 15: Serverless Where Appropriate
&lt;/h3&gt;

&lt;p&gt;For variable or low-throughput workloads, serverless eliminates idle capacity cost:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instead of...&lt;/th&gt;
&lt;th&gt;Use...&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;Always-on EC2 for APIs&lt;/td&gt;
&lt;td&gt;Lambda + API Gateway&lt;/td&gt;
&lt;td&gt;&amp;lt; 1M requests/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 for scheduled jobs&lt;/td&gt;
&lt;td&gt;Lambda + EventBridge&lt;/td&gt;
&lt;td&gt;Jobs under 15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-managed Kafka&lt;/td&gt;
&lt;td&gt;EventBridge or SQS&lt;/td&gt;
&lt;td&gt;Event routing without ordering guarantees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2 for containers&lt;/td&gt;
&lt;td&gt;Fargate&lt;/td&gt;
&lt;td&gt;Variable workloads, no cluster management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS for simple key-value&lt;/td&gt;
&lt;td&gt;DynamoDB On-Demand&lt;/td&gt;
&lt;td&gt;Unpredictable traffic patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Serverless isn't always cheaper at high scale. Above ~1M invocations/month, compare Lambda cost vs a small EC2 instance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 16: Caching to Reduce Downstream Costs
&lt;/h3&gt;

&lt;p&gt;Every cache hit avoids a database query, API call, or compute operation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudFront&lt;/strong&gt; — Cache static and dynamic content at edge (reduces origin compute + data transfer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElastiCache (Redis/Memcached)&lt;/strong&gt; — Cache database queries (reduces RDS cost/load)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX&lt;/strong&gt; — DynamoDB accelerator (reduces read cost for hot keys)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway caching&lt;/strong&gt; — Cache API responses (reduces Lambda invocations)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Layer 5: Governance — Sustain Savings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 17: FinOps Operating Model
&lt;/h3&gt;

&lt;p&gt;Cost optimization isn't a one-time project. Establish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekly cost review&lt;/strong&gt; — 15 minutes, engineering leads review team spend vs budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly optimization sprint&lt;/strong&gt; — Dedicated time for rightsizing, commitment review, zombie cleanup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarterly commitment planning&lt;/strong&gt; — Review Savings Plan/RI coverage and adjust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost ownership&lt;/strong&gt; — Teams own their account spend. No central team absorbs everyone's waste.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy 18: Automated Cleanup Policies
&lt;/h3&gt;

&lt;p&gt;Automate what humans forget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete EBS snapshots older than retention policy (Lambda + CloudWatch Events)&lt;/li&gt;
&lt;li&gt;Terminate dev instances running &amp;gt; 12 hours on weekends&lt;/li&gt;
&lt;li&gt;Remove unattached EBS volumes after 7 days&lt;/li&gt;
&lt;li&gt;Expire unused Elastic IPs after 48 hours&lt;/li&gt;
&lt;li&gt;Tag compliance enforcement (auto-tag with "Owner: unknown" → alert → terminate after 7 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy 19: Right-size Commitments Quarterly
&lt;/h3&gt;

&lt;p&gt;Savings Plan and RI coverage drifts as workloads change. Review quarterly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you under-committed? (too much On-Demand spend)&lt;/li&gt;
&lt;li&gt;Are you over-committed? (paying for unused commitment)&lt;/li&gt;
&lt;li&gt;Has instance family usage shifted? (Graviton migration changes commitment needs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Cost Explorer's Savings Plans utilization report to track coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 20: Implement Showback/Chargeback
&lt;/h3&gt;

&lt;p&gt;Make cost visible to decision-makers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Showback&lt;/strong&gt; — Show teams their spend (awareness, no billing impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chargeback&lt;/strong&gt; — Charge teams for their consumption (accountability)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tag-based cost allocation + CUR + Athena dashboards make this possible without third-party tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quick-Win Priority List
&lt;/h2&gt;

&lt;p&gt;If you can only do 5 things today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Buy Compute Savings Plans&lt;/strong&gt; for your usage floor (immediate 30-50% savings on covered compute)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch gp2 → gp3 volumes&lt;/strong&gt; (20% cheaper, zero downtime, no code change)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable S3 Lifecycle rules&lt;/strong&gt; (move old objects to cheaper tiers automatically)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add VPC endpoints for S3&lt;/strong&gt; (eliminates NAT Gateway data processing charges)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule non-prod stop/start&lt;/strong&gt; (65% savings on dev/staging compute)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These five typically yield 25-35% total savings with minimal effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS Native Cost Tools Summary
&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;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Explorer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual spend analysis, forecasting, and Savings Plan recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost and Usage Reports&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Line-item billing detail for custom analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Budgets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Set spending limits with alerts and automated actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Anomaly Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ML-based detection of unexpected spend spikes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compute Optimizer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rightsizing recommendations for EC2, EBS, Lambda, ECS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trusted Advisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identifies idle resources and optimization opportunities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Savings Plans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flexible commitment discounts for compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3 Storage Lens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3-specific cost and usage analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC IPAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tracks IP usage (relevant for NAT Gateway optimization)&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 cost optimization is a layered discipline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visibility first&lt;/strong&gt; — Tags, CUR, anomaly detection. You can't optimize what you can't see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing models&lt;/strong&gt; — Savings Plans and Spot cover 50-70% of compute savings potential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rightsizing&lt;/strong&gt; — Compute Optimizer + Auto Scaling + scheduled scaling for non-prod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt; — Storage tiering, VPC endpoints, caching, serverless for variable workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance&lt;/strong&gt; — FinOps operating model, automated cleanup, quarterly commitment reviews.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The teams that sustain savings long-term treat cost as an engineering metric — reviewed weekly, optimized continuously, and owned by the teams that provision resources.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and cloud cost optimization. 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>cloud</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>Designing a Secure AWS Multi-Account Landing Zone: Architecture Patterns for Enterprise Scale</title>
      <dc:creator>AlpeshKumbhare</dc:creator>
      <pubDate>Fri, 31 Jul 2026 07:28:03 +0000</pubDate>
      <link>https://dev.to/alpeshkumbhare/designing-a-secure-aws-multi-account-landing-zone-architecture-patterns-for-enterprise-scale-4f4o</link>
      <guid>https://dev.to/alpeshkumbhare/designing-a-secure-aws-multi-account-landing-zone-architecture-patterns-for-enterprise-scale-4f4o</guid>
      <description>&lt;p&gt;very enterprise AWS deployment eventually hits the same inflection point: a single account becomes ungovernable. Workloads from different teams share blast radius, IAM policies become unwieldy, cost attribution is impossible, and security boundaries blur.&lt;/p&gt;

&lt;p&gt;The answer is a multi-account strategy with a well-architected landing zone. This post covers the architecture patterns, OU structures, network topology, and security guardrails needed to build a production-grade AWS landing zone that scales from 10 accounts to 1,000+.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Landing Zone?
&lt;/h2&gt;

&lt;p&gt;A landing zone is your foundational multi-account AWS environment — the organizational structure, governance controls, networking, and security baseline that exists before any workload arrives. Think of it as the "operating system" for your AWS estate.&lt;/p&gt;

&lt;p&gt;Core components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Organizations&lt;/strong&gt; — Account hierarchy and policy management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Control Tower&lt;/strong&gt; — Automated landing zone setup and governance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landing Zone Accelerator (LZA)&lt;/strong&gt; — Opinionated, customizable IaC for enterprise landing zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Control Policies (SCPs)&lt;/strong&gt; — Preventive guardrails at the organization level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized networking&lt;/strong&gt; — Transit Gateway, shared VPCs, DNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security baseline&lt;/strong&gt; — GuardDuty, Security Hub, Config, CloudTrail across all accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Account Structure: The OU Design
&lt;/h2&gt;

&lt;p&gt;The organizational unit (OU) structure is the most critical design decision. It determines how you group accounts, apply policies, and manage access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended OU Hierarchy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Root
├── Security OU
│   ├── Log Archive Account (centralized logging)
│   ├── Audit Account (security tooling, read-only cross-account)
│   └── Security Tooling Account (GuardDuty, Security Hub delegated admin)
│
├── Infrastructure OU
│   ├── Network Account (Transit Gateway, DNS, shared connectivity)
│   ├── Shared Services Account (AD, CI/CD, artifact repos)
│   └── Backup Account (centralized backup vault)
│
├── Sandbox OU
│   └── Developer sandbox accounts (experimentation, auto-nuke)
│
├── Workloads OU
│   ├── Production OU
│   │   ├── App-A Prod Account
│   │   └── App-B Prod Account
│   ├── Staging OU
│   │   ├── App-A Staging Account
│   │   └── App-B Staging Account
│   └── Development OU
│       ├── App-A Dev Account
│       └── App-B Dev Account
│
├── Policy Staging OU (test SCPs before applying to workloads)
│
└── Suspended OU (quarantined/decommissioned accounts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Design Principles
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One workload, one account&lt;/strong&gt; — Blast radius isolation. A misconfigured security group affects only one workload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment separation via OUs&lt;/strong&gt; — Prod/Staging/Dev get different SCPs and guardrails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralize what's shared&lt;/strong&gt; — Networking, logging, security tooling live in dedicated accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never put workloads in the management account&lt;/strong&gt; — It's for Organizations management only.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  AWS Control Tower: Automated Governance
&lt;/h2&gt;

&lt;p&gt;Control Tower automates landing zone setup and provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Account Factory&lt;/strong&gt; — Self-service account provisioning with pre-configured baselines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails (Controls)&lt;/strong&gt; — Preventive (SCPs) and detective (Config rules) controls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; — Compliance visibility across all accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Region deny&lt;/strong&gt; — Restrict which AWS regions can be used&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Essential Guardrails to Enable
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Guardrail&lt;/th&gt;
&lt;th&gt;Type&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;Disallow public S3 buckets&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Prevent data exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Require MFA for root user&lt;/td&gt;
&lt;td&gt;Detective&lt;/td&gt;
&lt;td&gt;Account security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disallow internet gateways in specific OUs&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Network isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Require encryption on EBS volumes&lt;/td&gt;
&lt;td&gt;Detective&lt;/td&gt;
&lt;td&gt;Data protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deny access to unused regions&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Reduce attack surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Require tags on resources&lt;/td&gt;
&lt;td&gt;Detective&lt;/td&gt;
&lt;td&gt;Cost attribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disallow deletion of CloudTrail&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Audit integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deny root user access&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Force IAM usage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Landing Zone Accelerator (LZA): Enterprise-Grade IaC
&lt;/h2&gt;

&lt;p&gt;For organizations needing more customization than Control Tower alone provides, the Landing Zone Accelerator (LZA) is an AWS-maintained open-source solution that deploys a comprehensive landing zone via CloudFormation/CDK.&lt;/p&gt;

&lt;p&gt;LZA covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-account structure with Control Tower integration&lt;/li&gt;
&lt;li&gt;Centralized networking (Transit Gateway, route tables, DNS)&lt;/li&gt;
&lt;li&gt;Security services deployment across all accounts&lt;/li&gt;
&lt;li&gt;Logging and monitoring pipelines&lt;/li&gt;
&lt;li&gt;Budget alerts and cost management&lt;/li&gt;
&lt;li&gt;Custom CloudFormation stack deployment per account/OU&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LZA Configuration Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;├── accounts-config.yaml&lt;/span&gt;      &lt;span class="c1"&gt;# Account definitions and OU placement&lt;/span&gt;
&lt;span class="s"&gt;├── global-config.yaml&lt;/span&gt;        &lt;span class="c1"&gt;# Organization-wide settings, regions, tags&lt;/span&gt;
&lt;span class="s"&gt;├── iam-config.yaml&lt;/span&gt;           &lt;span class="c1"&gt;# IAM roles, policies, identity center&lt;/span&gt;
&lt;span class="s"&gt;├── network-config.yaml&lt;/span&gt;       &lt;span class="c1"&gt;# VPCs, TGW, route tables, DNS&lt;/span&gt;
&lt;span class="s"&gt;├── security-config.yaml&lt;/span&gt;      &lt;span class="c1"&gt;# GuardDuty, Security Hub, Config, CloudTrail&lt;/span&gt;
&lt;span class="s"&gt;├── customizations-config.yaml&lt;/span&gt; &lt;span class="c1"&gt;# Custom stacks deployed per account/OU&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This declarative approach means your entire landing zone is version-controlled, auditable, and reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Architecture: Hub-and-Spoke with Transit Gateway
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────┐
                    │   Network Account    │
                    │   (Transit Gateway)  │
                    └──────────┬───────────┘
                               │
        ┌──────────────────────┼──────────────────────┐
        │                      │                      │
        ▼                      ▼                      ▼
┌───────────────┐    ┌──────────────────┐    ┌──────────────────┐
│  Shared VPC   │    │  Workload VPC A  │    │  Workload VPC B  │
│  (Inspection) │    │  (Prod App A)    │    │  (Prod App B)    │
└───────────────┘    └──────────────────┘    └──────────────────┘
        │
        ▼
┌───────────────┐
│ Network       │
│ Firewall /    │
│ Inspection    │
└───────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Networking 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;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC per account or shared VPC?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC per workload account for isolation. Shared VPC only for tightly coupled services.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transit Gateway vs VPC Peering?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TGW for 5+ accounts. Peering for simple 2-3 account setups.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Centralized egress?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes — route internet traffic through a shared inspection VPC with Network Firewall.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS resolution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Route53 Resolver in network account with forwarding rules shared via RAM.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-premises connectivity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct Connect to network account TGW, propagate routes to workload VPCs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP address management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use IPAM (VPC IPAM) to prevent CIDR conflicts across accounts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Network Firewall for Centralized Inspection
&lt;/h3&gt;

&lt;p&gt;All egress traffic from workload accounts routes through a centralized inspection VPC:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Workload VPC → Transit Gateway (default route)&lt;/li&gt;
&lt;li&gt;Transit Gateway → Inspection VPC&lt;/li&gt;
&lt;li&gt;Network Firewall inspects traffic (domain filtering, IPS/IDS)&lt;/li&gt;
&lt;li&gt;Allowed traffic → NAT Gateway → Internet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives you a single point of visibility and policy enforcement for all outbound traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Baseline: Defense in Depth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Services to Enable Across All Accounts
&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;th&gt;Deployment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API audit logging&lt;/td&gt;
&lt;td&gt;Organization trail → Log Archive account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource compliance and change tracking&lt;/td&gt;
&lt;td&gt;Aggregator in Audit account&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;Threat detection&lt;/td&gt;
&lt;td&gt;Delegated admin in Security account&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;Unified security findings&lt;/td&gt;
&lt;td&gt;Aggregator with CIS/AWS Foundational benchmarks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM Access Analyzer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Find unintended resource sharing&lt;/td&gt;
&lt;td&gt;Per account + organization-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Macie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S3 sensitive data discovery&lt;/td&gt;
&lt;td&gt;Delegated admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Flow Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network traffic visibility&lt;/td&gt;
&lt;td&gt;All VPCs → centralized S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centralized backup policies&lt;/td&gt;
&lt;td&gt;Backup account with cross-account vaults&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Service Control Policies (SCPs): The Guardrail Layer
&lt;/h3&gt;

&lt;p&gt;SCPs are the most powerful governance tool — they set maximum permissions boundaries that even account administrators cannot exceed.&lt;/p&gt;

&lt;p&gt;Essential SCPs:&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Deny&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;leaving&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;organization&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&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;"organizations:LeaveOrganization"&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;"*"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Deny&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;disabling&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;security&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;services&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&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="s2"&gt;"guardduty:DeleteDetector"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"guardduty:DisableOrganizationAdminAccount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"securityhub:DisableSecurityHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"config:StopConfigurationRecorder"&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;"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;"*"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Deny&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;actions&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;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&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;"StringLike"&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;"aws:PrincipalArn"&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:iam::*:root"&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;h2&gt;
  
  
  Identity and Access: IAM Identity Center
&lt;/h2&gt;

&lt;p&gt;Centralized identity management via IAM Identity Center (formerly SSO):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single sign-on&lt;/strong&gt; across all accounts from one portal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission sets&lt;/strong&gt; — predefined access patterns (Admin, ReadOnly, Developer, Auditor)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt; with corporate IdP (Okta, Azure AD, Active Directory)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporary credentials&lt;/strong&gt; — no long-lived access keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribute-based access control (ABAC)&lt;/strong&gt; — permissions based on user tags&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Permission Set Design
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Permission Set&lt;/th&gt;
&lt;th&gt;Accounts&lt;/th&gt;
&lt;th&gt;Access Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PlatformAdmin&lt;/td&gt;
&lt;td&gt;Infrastructure OU&lt;/td&gt;
&lt;td&gt;Full admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SecurityAuditor&lt;/td&gt;
&lt;td&gt;All accounts&lt;/td&gt;
&lt;td&gt;Read-only security services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeveloperAccess&lt;/td&gt;
&lt;td&gt;Dev/Staging OUs&lt;/td&gt;
&lt;td&gt;Power user (no IAM changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProductionReadOnly&lt;/td&gt;
&lt;td&gt;Production OU&lt;/td&gt;
&lt;td&gt;Read-only (break-glass escalation for changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BillingViewer&lt;/td&gt;
&lt;td&gt;Management account&lt;/td&gt;
&lt;td&gt;Cost and billing only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cost Management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Organizations consolidated billing&lt;/strong&gt; — single payer, volume discounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost allocation tags&lt;/strong&gt; — mandatory tags enforced via SCP + Config rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Budgets&lt;/strong&gt; — per-account and per-OU budgets with alerts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account-level cost visibility&lt;/strong&gt; — each team owns their account's spend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Savings Plans and Reserved Instances&lt;/strong&gt; — purchased at organization level, shared&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&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;Workloads in management account&lt;/td&gt;
&lt;td&gt;Can't apply SCPs to management account&lt;/td&gt;
&lt;td&gt;Dedicated workload accounts only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flat OU structure&lt;/td&gt;
&lt;td&gt;Can't differentiate policies per environment&lt;/td&gt;
&lt;td&gt;Nest OUs (Workloads → Prod/Staging/Dev)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No network inspection&lt;/td&gt;
&lt;td&gt;Blind to outbound data exfiltration&lt;/td&gt;
&lt;td&gt;Centralized egress with Network Firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared VPCs everywhere&lt;/td&gt;
&lt;td&gt;Noisy neighbor, no blast radius isolation&lt;/td&gt;
&lt;td&gt;VPC per workload account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No SCP testing&lt;/td&gt;
&lt;td&gt;Breaking production with bad policies&lt;/td&gt;
&lt;td&gt;Policy Staging OU to test SCPs first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skipping IPAM&lt;/td&gt;
&lt;td&gt;CIDR conflicts between accounts&lt;/td&gt;
&lt;td&gt;VPC IPAM from day one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-lived access keys&lt;/td&gt;
&lt;td&gt;Credential exposure risk&lt;/td&gt;
&lt;td&gt;IAM Identity Center with temp credentials&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;A well-designed AWS landing zone is the foundation everything else builds on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OU structure&lt;/strong&gt; — Separate security, infrastructure, and workloads. Nest environments (prod/staging/dev) under workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control Tower + LZA&lt;/strong&gt; — Automated governance with guardrails. Version-controlled configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hub-and-spoke networking&lt;/strong&gt; — Transit Gateway in a dedicated network account. Centralized inspection for egress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security baseline everywhere&lt;/strong&gt; — CloudTrail, GuardDuty, Security Hub, Config in every account. SCPs as preventive guardrails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity Center&lt;/strong&gt; — Centralized SSO with permission sets. No long-lived credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost governance&lt;/strong&gt; — Mandatory tags, per-account budgets, organization-level purchasing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Get the landing zone right, and everything you build on top — workloads, automation, compliance — inherits the security and governance posture from day one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Alpesh Kumbhare is an AWS Architect at Atos, specializing in AWS infrastructure automation and enterprise 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>cloud</category>
      <category>security</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
