<?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: Deepanshu</title>
    <description>The latest articles on DEV Community by Deepanshu (@deepanshub09).</description>
    <link>https://dev.to/deepanshub09</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3384310%2Fc8d9a2d3-dcba-4014-bbf0-697e186a2996.jpg</url>
      <title>DEV Community: Deepanshu</title>
      <link>https://dev.to/deepanshub09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deepanshub09"/>
    <language>en</language>
    <item>
      <title>Building a Production-Grade E-Commerce Platform on GCP: A Complete DevOps Journey</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Thu, 08 Jan 2026 20:59:16 +0000</pubDate>
      <link>https://dev.to/deepanshub09/building-a-production-grade-e-commerce-platform-on-gcp-a-complete-devops-journey-4lj4</link>
      <guid>https://dev.to/deepanshub09/building-a-production-grade-e-commerce-platform-on-gcp-a-complete-devops-journey-4lj4</guid>
      <description>&lt;p&gt;Hey there, fellow developers!&lt;/p&gt;

&lt;p&gt;Have you ever wondered what it takes to build and deploy a &lt;strong&gt;real production-grade application&lt;/strong&gt; on the cloud? Not just a simple "Hello World" app, but a full-fledged microservices platform with proper CI/CD, monitoring, security, and all the bells and whistles that make it truly production-ready?&lt;/p&gt;

&lt;p&gt;Well, you're in the right place! In this comprehensive guide, I'll walk you through my journey of building and deploying a complete e-commerce platform on &lt;strong&gt;Google Cloud Platform (GCP)&lt;/strong&gt; using modern DevOps practices. Whether you're a beginner taking your first steps into cloud-native development or an experienced engineer looking to level up your skills, this guide has something for everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;By the end of this guide, you'll understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to architect a &lt;strong&gt;microservices-based application&lt;/strong&gt; from scratch&lt;/li&gt;
&lt;li&gt;Setting up &lt;strong&gt;Google Kubernetes Engine (GKE)&lt;/strong&gt; for production workloads&lt;/li&gt;
&lt;li&gt;Implementing &lt;strong&gt;GitOps&lt;/strong&gt; with ArgoCD for automated deployments&lt;/li&gt;
&lt;li&gt;Building a complete &lt;strong&gt;CI/CD pipeline&lt;/strong&gt; with GitHub Actions&lt;/li&gt;
&lt;li&gt;Adding &lt;strong&gt;full observability&lt;/strong&gt; with Datadog and SonarQube&lt;/li&gt;
&lt;li&gt;Managing &lt;strong&gt;infrastructure as code&lt;/strong&gt; with Terraform&lt;/li&gt;
&lt;li&gt;Implementing &lt;strong&gt;security best practices&lt;/strong&gt; (SSL/TLS, secrets management, vulnerability scanning)&lt;/li&gt;
&lt;li&gt;Setting up &lt;strong&gt;automated monitoring and alerting&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Project?
&lt;/h2&gt;

&lt;p&gt;I created this project to bridge the gap between simple tutorials and real-world production systems. Most tutorials show you how to deploy a single container, but they don't show you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to manage multiple microservices&lt;/li&gt;
&lt;li&gt;How to set up proper CI/CD pipelines&lt;/li&gt;
&lt;li&gt;How to monitor and debug issues in production&lt;/li&gt;
&lt;li&gt;How to handle secrets and security&lt;/li&gt;
&lt;li&gt;How to make your infrastructure reproducible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses all of these challenges and more!&lt;/p&gt;

&lt;p&gt;Application Souce Code: &lt;a href="https://github.com/deepanshub9/Microservice-Ecom-Store-K8s" rel="noopener noreferrer"&gt; Link &lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;cloud-native e-commerce platform&lt;/strong&gt; built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 microservices&lt;/strong&gt; written in Java, Go, and Node.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes (GKE)&lt;/strong&gt; for container orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArgoCD&lt;/strong&gt; for GitOps-based deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; for CI/CD automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datadog&lt;/strong&gt; for monitoring, logging, and APM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SonarQube&lt;/strong&gt; for code quality analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; for infrastructure provisioning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helm&lt;/strong&gt; for Kubernetes package management&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Let me show you the high-level architecture of what we're building:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    Internet Traffic (HTTPS)                  │
└────────────────────┬────────────────────────────────────────┘
                     │
            ┌────────▼────────┐
            │  GCP Load       │
            │  Balancer       │
            └────────┬────────┘
                     │
            ┌────────▼────────┐
            │  NGINX Ingress  │
            │  Controller     │
            │  (SSL/TLS)      │
            └────────┬────────┘
                     │
        ┌────────────┼────────────┐
        │            │            │
   ┌────▼───┐  ┌────▼───┐  ┌────▼───┐
   │   UI   │  │  Cart  │  │Checkout│
   │ Service│  │ Service│  │ Service│
   └────┬───┘  └────┬───┘  └────┬───┘
        │           │            │
        └───────┬───┴────────┬───┘
                │            │
           ┌────▼───┐   ┌───▼────┐
           │Catalog │   │ Orders │
           │ Service│   │ Service│
           └────┬───┘   └───┬────┘
                │           │
                └─────┬─────┘
                      │
                ┌─────▼─────┐
                │   MySQL   │
                │  Database │
                └───────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frontend (UI Service)&lt;/strong&gt;: Java-based web interface for customers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cart Service&lt;/strong&gt;: Manages shopping cart operations (Java)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catalog Service&lt;/strong&gt;: Product catalog and inventory (Go)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout Service&lt;/strong&gt;: Handles order processing (Node.js)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orders Service&lt;/strong&gt;: Order management and history (Java)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL Database&lt;/strong&gt;: Persistent data storage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All of this runs on &lt;strong&gt;Google Kubernetes Engine&lt;/strong&gt;, managed by &lt;strong&gt;ArgoCD&lt;/strong&gt;, monitored by &lt;strong&gt;Datadog&lt;/strong&gt;, and deployed automatically via &lt;strong&gt;GitHub Actions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DevOps Excellence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;** GitOps Workflow**: Every deployment is version-controlled and declarative&lt;/li&gt;
&lt;li&gt;** Automated CI/CD**: Push code → Build → Test → Scan → Deploy (all automatic!)&lt;/li&gt;
&lt;li&gt;** Full Observability**: See everything happening in your cluster in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security First&lt;/strong&gt;: Automated vulnerability scanning, secrets management, SSL/TLS&lt;/li&gt;
&lt;li&gt;** Infrastructure as Code**: Entire infrastructure defined in Terraform&lt;/li&gt;
&lt;li&gt;** Self-Healing**: Kubernetes automatically restarts failed containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Production-Ready Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scaling&lt;/strong&gt;: Automatically scales based on traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-downtime deployments&lt;/strong&gt;: Update without affecting users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-zone deployment&lt;/strong&gt;: High availability across multiple zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated SSL certificates&lt;/strong&gt;: Let's Encrypt integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized logging&lt;/strong&gt;: All logs in one place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed tracing&lt;/strong&gt;: Track requests across microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technology Stack
&lt;/h2&gt;

&lt;p&gt;Let me break down the technologies we'll be using:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud &amp;amp; Infrastructure
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Why We Use It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud provider&lt;/td&gt;
&lt;td&gt;Excellent Kubernetes support, competitive pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GKE (Google Kubernetes Engine)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container orchestration&lt;/td&gt;
&lt;td&gt;Managed Kubernetes, auto-updates, built-in monitoring&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;Infrastructure as Code&lt;/td&gt;
&lt;td&gt;Reproducible infrastructure, version control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Helm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes package manager&lt;/td&gt;
&lt;td&gt;Simplifies complex deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  CI/CD &amp;amp; GitOps
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Why We Use It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CI/CD pipeline&lt;/td&gt;
&lt;td&gt;Free for public repos, easy to configure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ArgoCD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitOps controller&lt;/td&gt;
&lt;td&gt;Automated deployments, easy rollbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GCP Artifact Registry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Container registry&lt;/td&gt;
&lt;td&gt;Native GCP integration, secure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Monitoring &amp;amp; Quality
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Why We Use It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Datadog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring &amp;amp; APM&lt;/td&gt;
&lt;td&gt;Best-in-class observability platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SonarQube&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code quality&lt;/td&gt;
&lt;td&gt;Catches bugs and security issues early&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trivy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security scanning&lt;/td&gt;
&lt;td&gt;Finds vulnerabilities in container images&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Networking &amp;amp; Security
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Why We Use It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NGINX Ingress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Traffic routing&lt;/td&gt;
&lt;td&gt;Industry standard, highly configurable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cert-Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSL/TLS automation&lt;/td&gt;
&lt;td&gt;Free SSL certificates from Let's Encrypt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kubernetes Secrets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secrets management&lt;/td&gt;
&lt;td&gt;Secure credential storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we dive in, make sure you have:&lt;/p&gt;

&lt;h3&gt;
  
  
  Required Tools
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Account&lt;/strong&gt; (with billing enabled)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/free" rel="noopener noreferrer"&gt;Sign up here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;You get $300 in free credits!&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;gcloud CLI&lt;/strong&gt; - Google Cloud command-line tool
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Install on Linux/macOS&lt;/span&gt;
   curl https://sdk.cloud.google.com | bash

   &lt;span class="c"&gt;# Or use package manager&lt;/span&gt;
   &lt;span class="c"&gt;# macOS: brew install google-cloud-sdk&lt;/span&gt;
   &lt;span class="c"&gt;# Windows: Download installer from cloud.google.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;kubectl&lt;/strong&gt; - Kubernetes command-line tool
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Install via gcloud&lt;/span&gt;
   gcloud components &lt;span class="nb"&gt;install &lt;/span&gt;kubectl

   &lt;span class="c"&gt;# Or standalone&lt;/span&gt;
   &lt;span class="c"&gt;# macOS: brew install kubectl&lt;/span&gt;
   &lt;span class="c"&gt;# Linux: snap install kubectl --classic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; - Infrastructure as Code tool
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# macOS&lt;/span&gt;
   brew &lt;span class="nb"&gt;install &lt;/span&gt;terraform

   &lt;span class="c"&gt;# Linux&lt;/span&gt;
   wget https://releases.hashicorp.com/terraform/1.6.0/terraform_1.6.0_linux_amd64.zip
   unzip terraform_1.6.0_linux_amd64.zip
   &lt;span class="nb"&gt;sudo mv &lt;/span&gt;terraform /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; - For building container images
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Install from docker.com/get-started&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Helm&lt;/strong&gt; - Kubernetes package manager
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# macOS&lt;/span&gt;
   brew &lt;span class="nb"&gt;install &lt;/span&gt;helm

   &lt;span class="c"&gt;# Linux&lt;/span&gt;
   curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; - Version control
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Most systems have this pre-installed&lt;/span&gt;
   git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Required Accounts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Account&lt;/strong&gt; (for code hosting and CI/CD)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datadog Account&lt;/strong&gt; (free trial available at datadoghq.com)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Name&lt;/strong&gt; (optional, but recommended for production)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Beginner-Friendly!&lt;/strong&gt; You should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic understanding of Docker containers&lt;/li&gt;
&lt;li&gt;Familiarity with command-line interfaces&lt;/li&gt;
&lt;li&gt;Basic Git knowledge (clone, commit, push)&lt;/li&gt;
&lt;li&gt;Willingness to learn!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nice to Have (but not required):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding of Kubernetes concepts&lt;/li&gt;
&lt;li&gt;Experience with cloud platforms&lt;/li&gt;
&lt;li&gt;Knowledge of CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't worry if you're missing some of these - I'll explain everything as we go!&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 1: Getting Started &amp;amp; Infrastructure Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1: Initial Setup &amp;amp; Authentication
&lt;/h2&gt;

&lt;p&gt;First, let's set up your local environment and authenticate with Google Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Clone the Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/YOUR_USERNAME/Ecommerce-K8s.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Ecommerce-K8s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 Authenticate with Google Cloud
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Login to Google Cloud&lt;/span&gt;
gcloud auth login

&lt;span class="c"&gt;# This will open a browser window - sign in with your Google account&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.3 Create a GCP Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a new project (replace PROJECT_ID with your desired ID)&lt;/span&gt;
gcloud projects create YOUR_PROJECT_ID &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"E-Commerce Platform"&lt;/span&gt;

&lt;span class="c"&gt;# Set as default project&lt;/span&gt;
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;project YOUR_PROJECT_ID

&lt;span class="c"&gt;# Enable billing (required for GKE)&lt;/span&gt;
&lt;span class="c"&gt;# You'll need to do this in the GCP Console: console.cloud.google.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.4 Enable Required APIs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable all necessary GCP APIs&lt;/span&gt;
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;container.googleapis.com
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;compute.googleapis.com
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;artifactregistry.googleapis.com
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;cloudresourcemanager.googleapis.com
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;iam.googleapis.com
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;dns.googleapis.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Pro Tip**: This step might take 2-3 minutes. Grab a coffee! ☕&lt;/p&gt;

&lt;h3&gt;
  
  
  1.5 Set Your Region and Zone
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Choose a region close to your users&lt;/span&gt;
&lt;span class="c"&gt;# Popular choices: us-central1, europe-west1, asia-southeast1&lt;/span&gt;
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;compute/region us-central1
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;compute/zone us-central1-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Infrastructure Provisioning with Terraform
&lt;/h2&gt;

&lt;p&gt;Now we'll use Terraform to create all the infrastructure we need.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Configure Terraform Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;terraform

&lt;span class="c"&gt;# Create a terraform.tfvars file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; terraform.tfvars &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
project_id = "YOUR_PROJECT_ID"
region     = "us-central1"
zone       = "us-central1-a"
cluster_name = "ecommerce-gke-cluster"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Initialize Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize Terraform (downloads required providers)&lt;/span&gt;
terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/google...
- Installing hashicorp/google v5.x.x...

Terraform has been successfully initialized!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Review the Infrastructure Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# See what Terraform will create&lt;/span&gt;
terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC network and subnets&lt;/li&gt;
&lt;li&gt;GKE cluster with node pools&lt;/li&gt;
&lt;li&gt;Artifact Registry for container images&lt;/li&gt;
&lt;li&gt;IAM roles and service accounts&lt;/li&gt;
&lt;li&gt;Firewall rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;** What's Being Created?**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC Network&lt;/strong&gt;: Isolated network for your resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GKE Cluster&lt;/strong&gt;: Kubernetes cluster with 3 nodes (auto-scaling enabled)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact Registry&lt;/strong&gt;: Private container registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Account&lt;/strong&gt;: For GitHub Actions to deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firewall Rules&lt;/strong&gt;: Security rules for your cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.4 Apply the Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the infrastructure (this takes 10-15 minutes)&lt;/span&gt;
terraform apply

&lt;span class="c"&gt;# Type 'yes' when prompted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Time for a break!** Creating a GKE cluster takes about 10-15 minutes. This is a good time to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read through the ArgoCD documentation&lt;/li&gt;
&lt;li&gt;Set up your Datadog account&lt;/li&gt;
&lt;li&gt;Grab another coffee ☕&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.5 Verify the Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configure kubectl to use your new cluster&lt;/span&gt;
gcloud container clusters get-credentials ecommerce-gke-cluster &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; us-central1

&lt;span class="c"&gt;# Verify connection&lt;/span&gt;
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                                          STATUS   ROLES    AGE   VERSION
gke-ecommerce-default-pool-xxxxx-xxxx        Ready    &amp;lt;none&amp;gt;   5m    v1.28.x
gke-ecommerce-default-pool-xxxxx-yyyy        Ready    &amp;lt;none&amp;gt;   5m    v1.28.x
gke-ecommerce-default-pool-xxxxx-zzzz        Ready    &amp;lt;none&amp;gt;   5m    v1.28.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; Your Kubernetes cluster is ready!&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;The GKE cluster running in Google Cloud Console, showing nodes and cluster configuration&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Step 3: Installing Core Components
&lt;/h2&gt;

&lt;p&gt;Now let's install the essential components: NGINX Ingress, Cert-Manager, and ArgoCD.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Install NGINX Ingress Controller
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Helm repository&lt;/span&gt;
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

&lt;span class="c"&gt;# Install NGINX Ingress&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;ingress-nginx ingress-nginx/ingress-nginx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; ingress-nginx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; controller.service.type&lt;span class="o"&gt;=&lt;/span&gt;LoadBalancer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wait for the Load Balancer to be ready:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This might take 2-3 minutes&lt;/span&gt;
kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; ingress-nginx &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;code&gt;Ctrl+C&lt;/code&gt; when you see an EXTERNAL-IP assigned.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Load balancers created for external traffic routing&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Install Cert-Manager (for SSL/TLS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Helm repository&lt;/span&gt;
helm repo add jetstack https://charts.jetstack.io
helm repo update

&lt;span class="c"&gt;# Install Cert-Manager&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;cert-manager jetstack/cert-manager &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; cert-manager &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;installCRDs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; cert-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All pods should be in &lt;code&gt;Running&lt;/code&gt; state.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Configure Let's Encrypt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create ClusterIssuer for SSL certificates&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@example.com  # Change this!
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Important**: Replace &lt;code&gt;your-email@example.com&lt;/code&gt; with your actual email!&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Install ArgoCD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create namespace&lt;/span&gt;
kubectl create namespace argocd

&lt;span class="c"&gt;# Install ArgoCD&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

&lt;span class="c"&gt;# Wait for pods to be ready&lt;/span&gt;
kubectl &lt;span class="nb"&gt;wait&lt;/span&gt; &lt;span class="nt"&gt;--for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Ready pods &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;300s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Get ArgoCD admin password:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Retrieve the initial admin password&lt;/span&gt;
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; argocd get secret argocd-initial-admin-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.data.password}"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Save this password!** You'll need it to login to ArgoCD.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access ArgoCD UI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Port-forward to access locally&lt;/span&gt;
kubectl port-forward svc/argocd-server &lt;span class="nt"&gt;-n&lt;/span&gt; argocd 8080:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open your browser to: &lt;code&gt;https://localhost:8080&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username: &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Password: (the password you just retrieved)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You now have ArgoCD running!&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;ArgoCD dashboard showing all microservices managed via GitOps&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Setting Up the Database
&lt;/h2&gt;

&lt;p&gt;Before deploying microservices, we need a database.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Create Namespace
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create namespace for our application&lt;/span&gt;
kubectl create namespace retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Create MySQL Secret
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create secret for MySQL password&lt;/span&gt;
kubectl create secret generic mysql-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql-root-password&lt;span class="o"&gt;=&lt;/span&gt;YOUR_SECURE_PASSWORD &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql-password&lt;span class="o"&gt;=&lt;/span&gt;YOUR_SECURE_PASSWORD &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Deploy MySQL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Deploy MySQL&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s/catalog-mysql.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s/catalog-mysql-service.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify MySQL is running:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait until the MySQL pod shows &lt;code&gt;Running&lt;/code&gt; status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize the database:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run database initialization job&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s/mysql-setup-job.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Setting Up Monitoring with Datadog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Get Your Datadog API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;datadoghq.com&lt;/a&gt; (free trial available)&lt;/li&gt;
&lt;li&gt;Go to: Organization Settings → API Keys&lt;/li&gt;
&lt;li&gt;Copy your API key&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.2 Create Datadog Secret
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create secret with your Datadog API key&lt;/span&gt;
kubectl create secret generic datadog-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api-key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_DATADOG_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 Deploy Datadog Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Deploy the Datadog agent&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s/datadog-agent.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify Datadog is collecting data:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;datadog-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within 5 minutes, you should see data in your Datadog dashboard!&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Real-time monitoring of Kubernetes pod restarts and alerts in Datadog&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Detailed view of all pods with resource usage and status&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Setting Up SonarQube for Code Quality
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Deploy SonarQube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Deploy SonarQube&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; terraform/sonarqube-production.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.2 Expose SonarQube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change service type to LoadBalancer&lt;/span&gt;
kubectl patch svc sonarqube &lt;span class="nt"&gt;-n&lt;/span&gt; default &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'{"spec": {"type": "LoadBalancer"}}'&lt;/span&gt;

&lt;span class="c"&gt;# Get the external IP&lt;/span&gt;
kubectl get svc sonarqube &lt;span class="nt"&gt;-n&lt;/span&gt; default &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 Access SonarQube
&lt;/h3&gt;

&lt;p&gt;Wait for the EXTERNAL-IP to be assigned, then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open browser to: &lt;code&gt;http://EXTERNAL-IP:9000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Default login: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change password when prompted&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  6.4 Create SonarQube Projects
&lt;/h3&gt;

&lt;p&gt;In the SonarQube UI, create 5 projects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;retail-store-cart&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retail-store-catalog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retail-store-checkout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retail-store-orders&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retail-store-ui&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click "Create Project" → "Manually"&lt;/li&gt;
&lt;li&gt;Enter project key and name&lt;/li&gt;
&lt;li&gt;Click "Set Up"&lt;/li&gt;
&lt;li&gt;Choose "With GitHub Actions"&lt;/li&gt;
&lt;li&gt;Copy the token generated&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;em&gt;SonarQube code quality metrics showing all microservices passing quality gates&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6.5 Configure GitHub Secrets
&lt;/h3&gt;

&lt;p&gt;Go to your GitHub repository → Settings → Secrets and variables → Actions&lt;/p&gt;

&lt;p&gt;Add these secrets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SONAR_TOKEN&lt;/code&gt;: Your SonarQube token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SONAR_HOST_URL&lt;/code&gt;: &lt;code&gt;http://YOUR_SONARQUBE_IP:9000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GCP_PROJECT_ID&lt;/code&gt;: Your GCP project ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GCP_REGION&lt;/code&gt;: &lt;code&gt;us-central1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ARTIFACT_REGISTRY&lt;/code&gt;: &lt;code&gt;us-central1-docker.pkg.dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GCP_SA_KEY&lt;/code&gt;: Service account JSON key (from Terraform output)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATADOG_API_KEY&lt;/code&gt;: Your Datadog API key&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Part 2: Deploying Microservices &amp;amp; CI/CD
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 7: Deploying Microservices with ArgoCD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Configure ArgoCD Applications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apply ArgoCD project definition&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/projects/retail-store-project.yaml

&lt;span class="c"&gt;# Apply all ArgoCD application definitions&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/applications/retail-store-cart.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/applications/retail-store-catalog.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/applications/retail-store-checkout.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/applications/retail-store-orders.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; argocd/applications/retail-store-ui.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2 Sync Applications
&lt;/h3&gt;

&lt;p&gt;In the ArgoCD UI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on each application&lt;/li&gt;
&lt;li&gt;Click "Sync" → "Synchronize"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install ArgoCD CLI&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;argocd  &lt;span class="c"&gt;# macOS&lt;/span&gt;
&lt;span class="c"&gt;# or download from: https://argo-cd.readthedocs.io/en/stable/cli_installation/&lt;/span&gt;

&lt;span class="c"&gt;# Login&lt;/span&gt;
argocd login localhost:8080

&lt;span class="c"&gt;# Sync all applications&lt;/span&gt;
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;retail-store-cart
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;retail-store-catalog
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;retail-store-checkout
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;retail-store-orders
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;retail-store-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 Monitor Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Watch pods being created&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see all services starting up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cart-xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;catalog-xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;checkout-xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orders-xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui-xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;em&gt;Visualized Kubernetes resource relationships for the deployed application&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;All running pods across namespaces including ArgoCD, cert-manager, and microservices&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Accessing Your Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 Create Ingress
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apply ingress configuration&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; terraform/retail-store-ingress.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.2 Get the Ingress IP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get the external IP&lt;/span&gt;
kubectl get ingress &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 Configure DNS (Optional)
&lt;/h3&gt;

&lt;p&gt;If you have a domain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an A record pointing to the Ingress IP&lt;/li&gt;
&lt;li&gt;Wait for DNS propagation (5-30 minutes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example DNS configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;store.example.com -&amp;gt; &amp;lt;INGRESS_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.4 Access the Application
&lt;/h3&gt;

&lt;p&gt;Open your browser to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;With domain&lt;/strong&gt;: &lt;code&gt;https://store.example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Without domain&lt;/strong&gt;: &lt;code&gt;http://&amp;lt;INGRESS_IP&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your e-commerce platform is live!&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Live e-commerce application accessible via the configured domain&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the CI/CD Pipeline
&lt;/h2&gt;

&lt;p&gt;Let's dive deep into how the automated CI/CD pipeline works!&lt;/p&gt;

&lt;h3&gt;
  
  
  Pipeline Overview
&lt;/h3&gt;

&lt;p&gt;Every time you push code to the &lt;code&gt;main&lt;/code&gt; branch, GitHub Actions automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detects Changes&lt;/strong&gt; - Identifies which microservices were modified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs SonarQube Analysis&lt;/strong&gt; - Checks code quality and security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds Docker Images&lt;/strong&gt; - Creates container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scans for Vulnerabilities&lt;/strong&gt; - Uses Trivy to find security issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pushes to Registry&lt;/strong&gt; - Uploads images to GCP Artifact Registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates Helm Values&lt;/strong&gt; - Modifies deployment configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArgoCD Deploys&lt;/strong&gt; - Automatically deploys to Kubernetes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pipeline Workflow Diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐
│   Git Push  │
└──────┬──────┘
       │
       ▼
┌─────────────────┐
│ Detect Changes  │ (Which services changed?)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│ SonarQube Scan  │ (Code quality check)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│  Build Image    │ (Docker build)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│  Security Scan  │ (Trivy)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│ Push to Registry│ (Artifact Registry)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│ Update Helm Vals│ (Git commit)
└──────┬──────────┘
       │
       ▼
┌─────────────────┐
│ ArgoCD Deploys  │ (Automatic)
└─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage 1: Detect Changes
&lt;/h3&gt;

&lt;p&gt;The pipeline only builds services that have changed:&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;detect-changes&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;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.filter.outputs.cart }}&lt;/span&gt;
    &lt;span class="na"&gt;catalog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.filter.outputs.catalog }}&lt;/span&gt;
    &lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.filter.outputs.checkout }}&lt;/span&gt;
    &lt;span class="na"&gt;orders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.filter.outputs.orders }}&lt;/span&gt;
    &lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.filter.outputs.ui }}&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;dorny/paths-filter@v2&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;filter&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;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cart: 'src/cart/**'&lt;/span&gt;
          &lt;span class="s"&gt;catalog: 'src/catalog/**'&lt;/span&gt;
          &lt;span class="s"&gt;checkout: 'src/checkout/**'&lt;/span&gt;
          &lt;span class="s"&gt;orders: 'src/orders/**'&lt;/span&gt;
          &lt;span class="s"&gt;ui: 'src/ui/**'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;: Only builds services that actually changed. Saves time and resources!&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Code Quality Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;sonarqube&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;detect-changes&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;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;cart&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;catalog&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;checkout&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;orders&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ui&lt;/span&gt;&lt;span class="pi"&gt;]&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run SonarQube Scan&lt;/span&gt;
      &lt;span class="c1"&gt;# Different scan methods for Java, Go, and Node.js&lt;/span&gt;
      &lt;span class="c1"&gt;# Checks for bugs, vulnerabilities, code smells&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyzes code for bugs and security issues&lt;/li&gt;
&lt;li&gt;Checks code coverage&lt;/li&gt;
&lt;li&gt;Enforces quality gates&lt;/li&gt;
&lt;li&gt;Fails the build if quality standards aren't met&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 3: Build and Deploy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;build-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;detect-changes&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;sonarqube&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;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;cart&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;catalog&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;checkout&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;orders&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ui&lt;/span&gt;&lt;span class="pi"&gt;]&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Docker 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 $IMAGE_NAME:$TAG .&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;Scan with Trivy&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;aquasecurity/trivy-action@master&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;image-ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$IMAGE_NAME:$TAG&lt;/span&gt;
        &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CRITICAL,HIGH"&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;Push to Artifact Registry&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker push $IMAGE_NAME:$TAG&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;Update Helm Values&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;# Updates image tag in Helm chart&lt;/span&gt;
        &lt;span class="s"&gt;# ArgoCD detects this change and deploys&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds optimized Docker images&lt;/li&gt;
&lt;li&gt;Scans for security vulnerabilities&lt;/li&gt;
&lt;li&gt;Pushes to private registry&lt;/li&gt;
&lt;li&gt;Triggers GitOps deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Trigger the Pipeline
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Method 1: Push Code Changes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Make changes to a service&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;src/cart
&lt;span class="c"&gt;# Edit some files...&lt;/span&gt;

&lt;span class="c"&gt;# Commit and push&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: add new cart feature"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline automatically runs!&lt;/p&gt;

&lt;h4&gt;
  
  
  Method 2: Manual Trigger
&lt;/h4&gt;

&lt;p&gt;In GitHub:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Actions tab&lt;/li&gt;
&lt;li&gt;Select "Build and Deploy"&lt;/li&gt;
&lt;li&gt;Click "Run workflow"&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Part 3: Monitoring, Security &amp;amp; Operations
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Monitoring and Observability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Datadog Dashboard Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Kubernetes Overview Dashboard
&lt;/h4&gt;

&lt;p&gt;In Datadog, go to Dashboards → New Dashboard&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Metrics to Monitor:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod CPU Usage&lt;/li&gt;
&lt;li&gt;Pod Memory Usage&lt;/li&gt;
&lt;li&gt;Pod Restart Count&lt;/li&gt;
&lt;li&gt;Container Status&lt;/li&gt;
&lt;li&gt;Network Traffic&lt;/li&gt;
&lt;li&gt;Disk I/O&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;em&gt;Overview of pod health, resource usage, and container states in the GKE cluster&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;GCP Console showing resource usage, container restarts, and namespace metrics&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Application Performance Monitoring (APM)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Enable APM in your services:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each microservice is already configured with Datadog APM environment variables:&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;env&lt;/span&gt;&lt;span class="pi"&gt;:&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;DD_AGENT_HOST&lt;/span&gt;
    &lt;span class="na"&gt;valueFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;fieldRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;fieldPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;status.hostIP&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;DD_SERVICE&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cart-service"&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;DD_ENV&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production"&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;DD_VERSION&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0"&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;DD_TRACE_ENABLED&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;View traces in Datadog:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to APM → Traces&lt;/li&gt;
&lt;li&gt;See request flow across microservices&lt;/li&gt;
&lt;li&gt;Identify slow queries and bottlenecks&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  3. Log Management
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;View logs:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Logs → Explorer&lt;/li&gt;
&lt;li&gt;Filter by service: &lt;code&gt;service:cart-service&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for errors: &lt;code&gt;status:error&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Create log alerts:&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;Alert when: Error count &amp;gt; 10 in 5 minutes
Notify: Your email or Slack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Container Security
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Image Scanning with Trivy
&lt;/h4&gt;

&lt;p&gt;Every image is scanned for vulnerabilities before deployment:&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="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;Run Trivy vulnerability scanner&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;aquasecurity/trivy-action@master&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;image-ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sarif"&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CRITICAL,HIGH"&lt;/span&gt;
    &lt;span class="na"&gt;exit-code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt; &lt;span class="c1"&gt;# Fail build if vulnerabilities found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use minimal base images (Alpine, Distroless)&lt;/li&gt;
&lt;li&gt;Regularly update dependencies&lt;/li&gt;
&lt;li&gt;Don't run containers as root&lt;/li&gt;
&lt;li&gt;Scan images in CI/CD pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Dockerfile Security
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Bad Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ubuntu:latest&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; python3
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /app&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python3", "app.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-alpine&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1000 appuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    adduser &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; 1000 &lt;span class="nt"&gt;-G&lt;/span&gt; appuser appuser
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=appuser:appuser requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=appuser:appuser . .&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "app.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Secrets Management
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Never Commit Secrets!
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&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;env&lt;/span&gt;&lt;span class="pi"&gt;:&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;DB_PASSWORD&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mypassword123"&lt;/span&gt; &lt;span class="c1"&gt;# Never do this!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&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;env&lt;/span&gt;&lt;span class="pi"&gt;:&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;DB_PASSWORD&lt;/span&gt;
    &lt;span class="na"&gt;valueFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;secretKeyRef&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;mysql-secret&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Creating Secrets
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From literal values&lt;/span&gt;
kubectl create secret generic mysql-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_PASSWORD &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# From files&lt;/span&gt;
kubectl create secret generic tls-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tls.crt&lt;span class="o"&gt;=&lt;/span&gt;cert.pem &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tls.key&lt;span class="o"&gt;=&lt;/span&gt;key.pem &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Network Security
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Network Policies
&lt;/h4&gt;

&lt;p&gt;Restrict traffic between pods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cart-network-policy&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retail-store&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cart&lt;/span&gt;
  &lt;span class="na"&gt;policyTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Egress&lt;/span&gt;
  &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ui&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
  &lt;span class="na"&gt;egress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues and Solutions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Issue 1: Pods Not Starting
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
NAME                    READY   STATUS             RESTARTS   AGE
cart-xxxxx              0/1     ImagePullBackOff   0          2m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod cart-xxxxx &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
kubectl logs cart-xxxxx &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common Causes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Image doesn't exist&lt;/strong&gt; - Check Artifact Registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication issues&lt;/strong&gt; - Verify image pull secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong image tag&lt;/strong&gt; - Check Helm values&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Issue 2: Service Not Accessible
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://INGRESS_IP
&lt;span class="c"&gt;# Connection refused or 404&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check ingress&lt;/span&gt;
kubectl get ingress &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Check service&lt;/span&gt;
kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Check endpoints&lt;/span&gt;
kubectl get endpoints &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;Verify ingress configuration&lt;/li&gt;
&lt;li&gt;Check service selector matches pod labels&lt;/li&gt;
&lt;li&gt;Ensure pods are ready&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Issue 3: Database Connection Errors
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&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;Error: Unable to connect to MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check MySQL pod&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store | &lt;span class="nb"&gt;grep &lt;/span&gt;mysql

&lt;span class="c"&gt;# Check MySQL logs&lt;/span&gt;
kubectl logs mysql-xxxxx &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Test connection&lt;/span&gt;
kubectl run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; debug &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql:8.0 &lt;span class="nt"&gt;--restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Never &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  mysql &lt;span class="nt"&gt;-h&lt;/span&gt; mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debugging Commands Cheat Sheet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View all resources&lt;/span&gt;
kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Describe a resource&lt;/span&gt;
kubectl describe pod POD_NAME &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# View logs&lt;/span&gt;
kubectl logs POD_NAME &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
kubectl logs POD_NAME &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store &lt;span class="nt"&gt;--previous&lt;/span&gt;

&lt;span class="c"&gt;# Follow logs in real-time&lt;/span&gt;
kubectl logs &lt;span class="nt"&gt;-f&lt;/span&gt; POD_NAME &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Execute commands in a pod&lt;/span&gt;
kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; POD_NAME &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store &lt;span class="nt"&gt;--&lt;/span&gt; /bin/bash

&lt;span class="c"&gt;# Port forward to a service&lt;/span&gt;
kubectl port-forward svc/cart 8080:80 &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# View events&lt;/span&gt;
kubectl get events &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.lastTimestamp'&lt;/span&gt;

&lt;span class="c"&gt;# Check resource usage&lt;/span&gt;
kubectl top nodes
kubectl top pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;h3&gt;
  
  
  1. Right-Size Your Resources
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Monitor Resource Usage
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check actual resource usage&lt;/span&gt;
kubectl top pods &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store

&lt;span class="c"&gt;# Compare with requested resources&lt;/span&gt;
kubectl describe deployment cart &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 5 Requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Adjust based on actual usage:&lt;/strong&gt;&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;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100m"&lt;/span&gt; &lt;span class="c1"&gt;# Start small&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt; &lt;span class="c1"&gt;# Set reasonable limits&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Use Preemptible/Spot Instances
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Create a preemptible node pool:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud container node-pools create preemptible-pool &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ecommerce-gke-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--preemptible&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--num-nodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--machine-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;e2-medium &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Implement Autoscaling
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Horizontal Pod Autoscaler (HPA)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create HPA&lt;/span&gt;
kubectl autoscale deployment cart &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cpu-percent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;70 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; retail-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cluster Autoscaler
&lt;/h4&gt;

&lt;p&gt;Already enabled in Terraform configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;autoscaling&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;min_node_count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nx"&gt;max_node_count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Estimated Monthly Costs
&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;Estimated Cost&lt;/th&gt;
&lt;th&gt;Optimization Tips&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GKE Cluster&lt;/td&gt;
&lt;td&gt;$150-300&lt;/td&gt;
&lt;td&gt;Use Preemptible nodes for dev/test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute Instances&lt;/td&gt;
&lt;td&gt;$200-500&lt;/td&gt;
&lt;td&gt;Right-size node pools, enable autoscaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifact Registry&lt;/td&gt;
&lt;td&gt;$10-30&lt;/td&gt;
&lt;td&gt;Implement image retention policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load Balancers&lt;/td&gt;
&lt;td&gt;$20-40&lt;/td&gt;
&lt;td&gt;Consolidate ingresses where possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud Storage&lt;/td&gt;
&lt;td&gt;$5-15&lt;/td&gt;
&lt;td&gt;Lifecycle policies for old backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;$0-100+&lt;/td&gt;
&lt;td&gt;Depends on plan/usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$385-985+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Learning Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Official Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/" rel="noopener noreferrer"&gt;Kubernetes Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs" rel="noopener noreferrer"&gt;Google Kubernetes Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argo-cd.readthedocs.io/" rel="noopener noreferrer"&gt;ArgoCD Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/google/latest/docs" rel="noopener noreferrer"&gt;Terraform GCP Provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.datadoghq.com/integrations/kubernetes/" rel="noopener noreferrer"&gt;Datadog Kubernetes Integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recommended Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"Kubernetes in Action" by Marko Lukša&lt;/li&gt;
&lt;li&gt;"The DevOps Handbook" by Gene Kim&lt;/li&gt;
&lt;li&gt;"Site Reliability Engineering" by Google&lt;/li&gt;
&lt;li&gt;"Terraform: Up &amp;amp; Running" by Yevgeniy Brikman&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Online Courses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cncf.io/certification/training/" rel="noopener noreferrer"&gt;Kubernetes Fundamentals (CNCF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudskillsboost.google/" rel="noopener noreferrer"&gt;Google Cloud Skills Boost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argo-cd.readthedocs.io/en/stable/getting_started/" rel="noopener noreferrer"&gt;ArgoCD Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Congratulations! 🎊 You've just learned how to build and deploy a production-grade microservices platform on Google Cloud Platform!&lt;/p&gt;

&lt;h3&gt;
  
  
  What We've Accomplished
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;: Set up a complete GKE cluster with Terraform&lt;br&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: Deployed 5 microservices in multiple languages&lt;br&gt;
&lt;strong&gt;GitOps&lt;/strong&gt;: Implemented automated deployments with ArgoCD&lt;br&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: Built a complete pipeline with GitHub Actions&lt;br&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Added full observability with Datadog&lt;br&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Implemented security best practices&lt;br&gt;
&lt;strong&gt;Quality&lt;/strong&gt;: Integrated code quality checks with SonarQube&lt;/p&gt;

&lt;h3&gt;
  
  
  Next Steps
&lt;/h3&gt;

&lt;p&gt;Now that you have a solid foundation, consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add More Features&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Implement caching with Redis&lt;/li&gt;
&lt;li&gt;Add message queuing with Pub/Sub&lt;/li&gt;
&lt;li&gt;Integrate with Cloud CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enhance Security&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Implement service mesh (Istio)&lt;/li&gt;
&lt;li&gt;Add OAuth2/OIDC authentication&lt;/li&gt;
&lt;li&gt;Enable Cloud Armor WAF&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Improve Observability&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Add custom business metrics&lt;/li&gt;
&lt;li&gt;Implement distributed tracing&lt;/li&gt;
&lt;li&gt;Create SLO/SLI dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scale Further&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Multi-region deployment&lt;/li&gt;
&lt;li&gt;Global load balancing&lt;/li&gt;
&lt;li&gt;Database sharding&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Building production systems is a journey, not a destination. This project gives you a solid foundation, but there's always more to learn and improve. Keep experimenting, keep learning, and most importantly, keep building!&lt;/p&gt;

&lt;p&gt;If you found this guide helpful, please:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the repository&lt;/li&gt;
&lt;li&gt;🔄 Share with your network&lt;/li&gt;
&lt;li&gt;💬 Leave a comment with your experience&lt;/li&gt;
&lt;li&gt;🐛 Report issues or suggest improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Connect With Me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: [&lt;a href="https://github.com/deepanshub9" rel="noopener noreferrer"&gt;https://github.com/deepanshub9&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;LinkedIn: [&lt;a href="https://www.linkedin.com/in/deepanshub/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/deepanshub/&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Twitter: [&lt;a href="https://x.com/realthetechguy" rel="noopener noreferrer"&gt;https://x.com/realthetechguy&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Blog: [&lt;a href="https://dev.to/deepanshub09"&gt;https://dev.to/deepanshub09&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the Apache License 2.0 - see the &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Original AWS Retail Store Sample App team&lt;/li&gt;
&lt;li&gt;Google Cloud Platform documentation&lt;/li&gt;
&lt;li&gt;Kubernetes community&lt;/li&gt;
&lt;li&gt;ArgoCD project&lt;/li&gt;
&lt;li&gt;All open-source contributors&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Did you deploy this successfully? I'd love to hear about your experience! Drop a comment below! 👇&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  kubernetes #gcp #devops #microservices #gitops #cloudnative #terraform #argocd #cicd #production
&lt;/h1&gt;

</description>
      <category>kubernetes</category>
      <category>gcp</category>
      <category>devops</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Building a Complete AWS VPC with Load Balancer: A Step-by-Step Journey</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Sat, 04 Oct 2025 21:01:35 +0000</pubDate>
      <link>https://dev.to/deepanshub09/building-a-complete-aws-vpc-with-load-balancer-a-step-by-step-journey-2oj8</link>
      <guid>https://dev.to/deepanshub09/building-a-complete-aws-vpc-with-load-balancer-a-step-by-step-journey-2oj8</guid>
      <description>&lt;p&gt;&lt;em&gt;A comprehensive guide to creating a production-ready AWS infrastructure including all the roadblocks I hit and how to solve them&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Introduction
&lt;/h4&gt;

&lt;p&gt;Hey there, fellow cloud explorer! Have you ever tried setting up an AWS infrastructure and found yourself scratching your head, wondering, “Why isn’t this working?!” I’ve been there too! In this down-to-earth guide, I’ll walk you through building a full AWS Virtual Private Cloud (VPC) with an Application Load Balancer (ALB), EC2 instances, and more while sharing every stumble I made along the way and how I fixed them.&lt;/p&gt;

&lt;p&gt;This isn’t your typical polished tutorial. It’s the real deal complete with those “uh-oh” moments and their practical solutions. By the end, you’ll have a production ready setup and the know how to troubleshoot like a pro. Let’s dive in!&lt;/p&gt;

&lt;h4&gt;
  
  
  What We’re Building
&lt;/h4&gt;

&lt;p&gt;Imagine we’re setting up “Dublin Delights,” a small online store selling Irish goodies. Our final architecture will include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A VPC with public and private subnets&lt;/li&gt;
&lt;li&gt;An Internet Gateway for public access&lt;/li&gt;
&lt;li&gt;A NAT Gateway for private subnet internet access&lt;/li&gt;
&lt;li&gt;An Application Load Balancer to distribute traffic&lt;/li&gt;
&lt;li&gt;3 EC2 instances (1 public, 2 private)&lt;/li&gt;
&lt;li&gt;Tight security groups and routing&lt;/li&gt;
&lt;li&gt;Working web servers behind the load balancer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready? Let’s get started!&lt;/p&gt;

&lt;h4&gt;
  
  
  Phase 1: Setting Up the VPC Foundation
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Creating the VPC
&lt;/h5&gt;

&lt;p&gt;First, let’s build the foundation our Virtual Private Cloud:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Head to the AWS Console &amp;gt; Search “VPC” &amp;gt; Click “VPC” &amp;gt; “Create VPC”.&lt;/li&gt;
&lt;li&gt;Choose “VPC and more” (this sets up everything in one go).&lt;/li&gt;
&lt;li&gt;Configuration:

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;dublin-delights-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;IPv4 CIDR: &lt;code&gt;10.0.0.0/16&lt;/code&gt; (gives us 65,536 IP addresses)&lt;/li&gt;
&lt;li&gt;Number of Availability Zones (AZs): 2 (e.g., US-east-1a, US-east-1b)&lt;/li&gt;
&lt;li&gt;Public subnets: 1 (e.g., &lt;code&gt;10.0.1.0/24&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Private subnets: 2 (e.g., &lt;code&gt;10.0.2.0/24&lt;/code&gt;, &lt;code&gt;10.0.3.0/24&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;NAT gateways: 1 (in the public subnet)&lt;/li&gt;
&lt;li&gt;VPC endpoints: None&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hit “Create VPC” and wait a minute for it to spin up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What This Creates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A VPC with the &lt;code&gt;10.0.0.0/16&lt;/code&gt; CIDR block&lt;/li&gt;
&lt;li&gt;1 public subnet (&lt;code&gt;10.0.1.0/24&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;2 private subnets (&lt;code&gt;10.0.2.0/24&lt;/code&gt;, &lt;code&gt;10.0.3.0/24&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;An Internet Gateway&lt;/li&gt;
&lt;li&gt;A NAT Gateway in the public subnet&lt;/li&gt;
&lt;li&gt;Route tables (we’ll tweak these later)&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  The First Problem: DNS Resolution Woes
&lt;/h5&gt;

&lt;p&gt;After creating the VPC, I launched instances but hit a snag DNS wasn’t working! Updates failed with “temporary failure resolving” errors. Here’s the fix:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VPC Console &amp;gt; “Your VPCs” &amp;gt; Select &lt;code&gt;dublin-delights-vpc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;“Actions” &amp;gt; “Edit VPC settings”.&lt;/li&gt;
&lt;li&gt;Enable “DNS hostnames” and “DNS resolution” (both checkboxes).&lt;/li&gt;
&lt;li&gt;Save changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters:&lt;/strong&gt; Without DNS hostnames, instances can’t resolve domain names (e.g., &lt;code&gt;sudo-apt-get update&lt;/code&gt; fails). This little toggle saved my day!&lt;/p&gt;

&lt;h4&gt;
  
  
  Phase 2: Launching EC2 Instances
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Creating the Instances
&lt;/h5&gt;

&lt;p&gt;Let’s launch our three servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Public Instance (public-web-1):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EC2 Console &amp;gt; “Launch Instance”.&lt;/li&gt;
&lt;li&gt;Configuration:

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;public-web-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AMI: Ubuntu Server 22.04 LTS&lt;/li&gt;
&lt;li&gt;Instance type: &lt;code&gt;t2.micro&lt;/code&gt; (Free Tier eligible)&lt;/li&gt;
&lt;li&gt;Key pair: Select or create &lt;code&gt;devops-key&lt;/code&gt; (download &lt;code&gt;.pem&lt;/code&gt; file)&lt;/li&gt;
&lt;li&gt;VPC: &lt;code&gt;dublin-delights-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subnet: &lt;code&gt;public-subnet-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auto-assign Public IP: Enable&lt;/li&gt;
&lt;li&gt;Security group: Create new “public-sg”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Launch and wait for “Running”.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Private Instances (private-web-2, private-web-3):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeat the process, but:&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;private-web-2&lt;/code&gt; and &lt;code&gt;private-web-3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subnet: &lt;code&gt;private-subnet-1&lt;/code&gt; and &lt;code&gt;private-subnet-2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auto-assign Public IP: Disable&lt;/li&gt;
&lt;li&gt;Security group: Create new “private-sg”&lt;/li&gt;
&lt;li&gt;Launch both.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h5&gt;
  
  
  The Second Problem: Connection Timeouts
&lt;/h5&gt;

&lt;p&gt;I couldn’t SSH to my instances got “ssh: connect to host 52.23.157.242 port 22: Connection timed out.” Ouch! The culprit? Security groups.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution - Fix Security Groups:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;public-sg:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Inbound: SSH (22) from “My IP”, HTTP (80) from &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outbound: All traffic to &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;private-sg:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Inbound: SSH (22) from &lt;code&gt;public-sg&lt;/code&gt;, HTTP (80) from ALB security group (later)&lt;/li&gt;
&lt;li&gt;Outbound: All traffic to &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Apply and test SSH: &lt;code&gt;ssh -i devops-key.pem ubuntu@public-ip&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h5&gt;
  
  
  The Third Problem: Session Manager Not Working
&lt;/h5&gt;

&lt;p&gt;Tried AWS Session Manager got “SSM Agent is not online.” The route table was the issue my “public” subnet wasn’t really public!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution - Fix Route Tables:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;VPC Console &amp;gt; “Route Tables” &amp;gt; Find the one for &lt;code&gt;public-subnet-1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;“Routes” tab &amp;gt; “Edit routes” &amp;gt; Add: Destination &lt;code&gt;0.0.0.0/0&lt;/code&gt;, Target “Internet Gateway” (&lt;code&gt;dublin-igw&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; SSH, Session Manager, and internet access worked!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Phase 3: Setting Up the Application Load Balancer
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Creating the ALB
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;EC2 Console &amp;gt; “Load Balancers” &amp;gt; “Create Load Balancer” &amp;gt; “Application Load Balancer”.&lt;/li&gt;
&lt;li&gt;Configuration:

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;dublin-alb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Scheme: Internet-facing&lt;/li&gt;
&lt;li&gt;IP address type: IPv4&lt;/li&gt;
&lt;li&gt;VPC: &lt;code&gt;dublin-delights-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Availability Zones: Select both AZs with &lt;code&gt;public-subnet-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Security group: Create new “alb-sg”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create and wait 5 minutes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  Creating the Target Group
&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;EC2 Console &amp;gt; “Target Groups” &amp;gt; “Create target group”.&lt;/li&gt;
&lt;li&gt;Configuration:

&lt;ul&gt;
&lt;li&gt;Target type: Instances&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;web-targets&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protocol: HTTP&lt;/li&gt;
&lt;li&gt;Port: 80&lt;/li&gt;
&lt;li&gt;VPC: &lt;code&gt;dublin-delights-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Health check path: &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Register targets: Add all 3 instances.&lt;/li&gt;
&lt;li&gt;Create.&lt;/li&gt;
&lt;/ol&gt;

&lt;h5&gt;
  
  
  The Fourth Problem: 504 Gateway Timeout
&lt;/h5&gt;

&lt;p&gt;Accessing the ALB gave “504 Gateway Time-out,” with targets “Unhealthy” (Target.Timeout).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Root Cause #1: No Web Servers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Install Apache on each instance:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Web Server - &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html
curl http://localhost
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Root Cause #2: ALB Security Group Outbound Rules Missing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even with web servers, 504 persisted. The ALB’s security group had no outbound rules!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical Fix:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;EC2 Console &amp;gt; “Security Groups” &amp;gt; &lt;code&gt;alb-sg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;“Outbound rules” &amp;gt; “Edit outbound rules” &amp;gt; Add: Type “All traffic”, Destination &lt;code&gt;0.0.0.0/0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Save.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Why This Matters:&lt;/strong&gt; ALB needs outbound rules to send health checks and traffic.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Phase 4: Fine-Tuning and Testing
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Proper Security Group Configuration
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;alb-sg:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Inbound: HTTP (80) from &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outbound: All traffic to &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;public-sg:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Inbound: SSH (22) from “My IP”, HTTP (80) from &lt;code&gt;alb-sg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outbound: All traffic to &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;private-sg:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Inbound: SSH (22) from &lt;code&gt;public-sg&lt;/code&gt;, HTTP (80) from &lt;code&gt;alb-sg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outbound: All traffic to &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h5&gt;
  
  
  Testing the Complete Setup
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test 1: Individual Instance Access&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;From public instance: &lt;code&gt;curl http://10.0.2.135&lt;/code&gt; and &lt;code&gt;curl http://10.0.3.150&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Test 2: Load Balancer&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl http://dublin-alb-689675767.eu-west-1.elb.amazonaws.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Loop: &lt;code&gt;for i in {1..5}; do curl http://dublin-alb-689675767.eu-west-1.elb.amazonaws.com; done&lt;/code&gt; (shows rotation).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Test 3: NAT Gateway Functionality&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;From private instances: &lt;code&gt;curl ifconfig.me&lt;/code&gt; (shows NAT IP), &lt;code&gt;sudo apt update&lt;/code&gt; (works).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Phase 5: Common Issues and Solutions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue 1: “Instance is not in public subnet”&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fix: Add &lt;code&gt;0.0.0.0/0&lt;/code&gt; → Internet Gateway in route table.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Issue 2: “Referenced group id for existing IPv4 CIDR rule”&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fix: Add new rules instead of editing existing ones.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Issue 3: Private instances can’t reach internet&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fix: Route &lt;code&gt;0.0.0.0/0&lt;/code&gt; → NAT Gateway in private route table.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Issue 4: Health checks failing with “Target.Timeout”&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fix: Install web server, fix security groups, ensure &lt;code&gt;/var/www/html/index.html&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Final Architecture Overview
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    🌐 INTERNET
                         |
                    ┌────▼────┐
                    │   IGW   │ dublin-igw
                    └────┬────┘
                         |
              ┌──────────▼──────────┐
              │  Application LB     │ dublin-alb
              │     (alb-sg)        │
              └──┬────────┬────────┬┘
                 |        |        |
    ┌────────────▼─┐  ┌───▼───┐  ┌─▼────────────┐
    │ AZ: us-east-1a│  │us-east│  │ AZ: us-east-1c│
    │               │  │  -1b  │  │               │
    │ ┌───────────┐ │  │┌─────┐│  │ ┌───────────┐ │
    │ │Public Sub │ │  ││Priv ││  │ │Private Sub│ │
    │ │10.0.1.0/24│ │  ││Sub 1││  │ │10.0.3.0/24│ │
    │ │           │ │  ││10.0.││  │ │           │ │
    │ │┌─────────┐│ │  ││2.0/ ││  │ │┌─────────┐│ │
    │ ││public-  ││ │  ││24  ││  │ ││private- ││ │
    │ ││web-1    ││ │  ││     ││  │ ││web-3    ││ │
    │ ││(public- ││ │  ││┌───┐││  │ ││(private-││ │
    │ ││sg)      ││ │  │││web│││  │ ││sg)      ││ │
    │ │└─────────┘│ │  │││-2 │││  │ │└─────────┘│ │
    │ │           │ │  ││└───┘││  │ │           │ │
    │ │┌─────────┐│ │  │└─────┘│  │ │           │ │
    │ ││NAT GW   ││ │  └───────┘  │ │           │ │
    │ │└─────────┘│ │             │ │           │ │
    │ └───────────┘ │             │ └───────────┘ │
    └───────────────┘             └───────────────┘
                |                         |
                └─────────┬─────────────────┘
                         |
                    ┌────▼────┐
                    │   IGW   │ (for NAT traffic)
                    └────┬────┘
                         |
                    🌐 INTERNET

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network Flow&lt;/strong&gt;: Inbound: Internet → IGW → ALB → Instances. Outbound: Public via IGW, Private via NAT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Public SSH from specific IP, private via public, ALB open on 80.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Security Groups Are Stateful&lt;/strong&gt;: Inbound allows return traffic, but outbound rules are needed for initiated connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Public” Subnet Needs Routing&lt;/strong&gt;: Name doesn’t matter route tables make it public.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ALB Needs Outbound Rules&lt;/strong&gt;: Missing rules cause 504 errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAT Gateway Placement&lt;/strong&gt;: Must be in a public subnet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health Checks Are Critical&lt;/strong&gt;: Unhealthy targets stop traffic.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Costs&lt;/strong&gt;: 3 t2.micro (~$25/month), NAT Gateway (~$32/month), ALB (~$16/month), data variable. Total ~$73/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Savings&lt;/strong&gt;: Use NAT Instance (~$0), Network Load Balancer, terminate unused instances, or Reserved Instances (30-60% off).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Restrict SSH, enable VPC Flow Logs, CloudTrail, IAM roles, encryption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: CloudWatch alarms, ALB logs, target health, SNS notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Availability&lt;/strong&gt;: Multi-AZ, Auto Scaling, health checks, disaster recovery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Right-size instances, ALB stickiness, CloudFront CDN.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Troubleshooting Commands Reference
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Connectivity Issues&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;telnet &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws ec2 describe-security-groups --group-ids sg-xxxxxxxxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nslookup google.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip route show&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Web Server Issues&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo systemctl status apache2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo netstat -tlnp | grep :80&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl http://localhost&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo tail -f /var/log/apache2/error.log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;ALB Issues&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl -I http://your-alb-dns-name.elb.amazonaws.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aws elbv2 describe-target-health --target-group-arn &amp;lt;arn&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Building AWS infrastructure is like assembling a puzzle every piece (VPC, subnets, security groups, ALB) must fit. My mistakes taught me to start with basics, test incrementally, and read error messages closely. Each “why isn’t this working?” turned into a “now I get it!” moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;br&gt;
Explore Auto Scaling Groups, RDS, CloudFront, Route 53, ACM, or Infrastructure as Code (CloudFormation/Terraform). Share your AWS adventures in the comments let’s learn together!&lt;/p&gt;




</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>The OSI Model Explained: Your Complete Guide to Network Communication 🌐</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Tue, 23 Sep 2025 11:18:12 +0000</pubDate>
      <link>https://dev.to/deepanshub09/the-osi-model-explained-your-complete-guide-to-network-communication-512a</link>
      <guid>https://dev.to/deepanshub09/the-osi-model-explained-your-complete-guide-to-network-communication-512a</guid>
      <description>&lt;p&gt;&lt;em&gt;Ever wondered how your message travels from your phone to your friend's computer across the globe? Let's dive into the fascinating world of network communication through the OSI model!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the OSI Model?
&lt;/h2&gt;

&lt;p&gt;Imagine you're sending a letter to a friend in another country. You write the message, put it in an envelope, add the address, take it to the post office, and it magically reaches your friend. The OSI (Open Systems Interconnection) model works similarly - it's like a postal system for digital communication.&lt;/p&gt;

&lt;p&gt;The OSI model is a &lt;strong&gt;conceptual framework&lt;/strong&gt; that standardizes how different network devices communicate. Think of it as a universal language that ensures your iPhone can talk to a Windows laptop, which can then communicate with a Linux server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do We Need the OSI Model?
&lt;/h2&gt;

&lt;p&gt;Before the OSI model, different manufacturers created networking equipment that couldn't talk to each other. It was like having people speaking different languages with no translator. The OSI model solved this by creating &lt;strong&gt;seven standardized layers&lt;/strong&gt; that work together seamlessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 Layers of the OSI Model
&lt;/h2&gt;

&lt;p&gt;Let's explore each layer from bottom to top, using real-world analogies that make sense:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Physical Layer - The Highway
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Handles the actual physical connection between devices.&lt;/p&gt;

&lt;p&gt;Think of this as the &lt;strong&gt;roads and highways&lt;/strong&gt; where data travels. Just like cars need roads to move from one place to another, data needs physical pathways.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Ethernet cables (the copper wires)&lt;/li&gt;
&lt;li&gt;Fiber optic cables (light signals)&lt;/li&gt;
&lt;li&gt;Wi-Fi radio waves&lt;/li&gt;
&lt;li&gt;Bluetooth signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you plug an Ethernet cable into your laptop, the Physical Layer ensures the electrical signals can flow through the copper wires.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physical Layer Components:
├── Cables (Ethernet, Fiber)
├── Hubs
├── Repeaters
└── Network Interface Cards (NICs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 2: Data Link Layer - The Traffic Rules
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Manages how data moves between directly connected devices and handles error detection.&lt;/p&gt;

&lt;p&gt;This layer is like &lt;strong&gt;traffic rules and road signs&lt;/strong&gt;. It ensures data doesn't crash into each other and reaches the right destination on the local network.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MAC Addresses:&lt;/strong&gt; Like license plates for network devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frames:&lt;/strong&gt; Data packets with addressing information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Detection:&lt;/strong&gt; Checking if data arrived correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When your laptop sends data to your router, the Data Link Layer adds your laptop's MAC address as the sender and your router's MAC address as the receiver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example MAC Address:&lt;/strong&gt; &lt;code&gt;00:1B:44:11:3A:B7&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: Network Layer - The GPS Navigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Determines the best path for data to travel across multiple networks.&lt;/p&gt;

&lt;p&gt;Think of this as your &lt;strong&gt;GPS navigation system&lt;/strong&gt;. It figures out the best route from your house to your destination, even if it involves multiple highways and cities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key player:&lt;/strong&gt; &lt;strong&gt;IP Addresses&lt;/strong&gt; (like postal addresses for the internet)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you visit &lt;code&gt;google.com&lt;/code&gt;, the Network Layer uses IP addresses to route your request through multiple routers across the internet to reach Google's servers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Computer (192.168.1.100) 
    ↓
Router 1 (ISP Gateway)
    ↓
Router 2 (Regional Hub)
    ↓
Router 3 (Google's Network)
    ↓
Google Server (172.217.164.110)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 4: Transport Layer - The Delivery Service
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Ensures reliable data delivery and manages data flow.&lt;/p&gt;

&lt;p&gt;This is like &lt;strong&gt;FedEx or UPS&lt;/strong&gt; - it makes sure your package (data) arrives complete, in the right order, and handles any delivery issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two main protocols:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TCP (Transmission Control Protocol):&lt;/strong&gt; Reliable delivery (like registered mail)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UDP (User Datagram Protocol):&lt;/strong&gt; Fast delivery (like regular mail)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you download a file, TCP ensures all pieces arrive correctly. If a piece is missing, it asks for it to be sent again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCP vs UDP Example:&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;TCP: "Did you get packet 1? Good. Did you get packet 2? Resending packet 3..."
UDP: "Here's packet 1, 2, 3, 4... Hope you got them all!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 5: Session Layer - The Phone Call Manager
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Manages connections between applications.&lt;/p&gt;

&lt;p&gt;Think of this as a &lt;strong&gt;phone call manager&lt;/strong&gt; that establishes, maintains, and terminates conversations between applications.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Starting conversations (sessions)&lt;/li&gt;
&lt;li&gt;Keeping track of who's talking&lt;/li&gt;
&lt;li&gt;Ending conversations properly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you log into your online banking, the Session Layer establishes a secure session, keeps it active while you browse, and properly closes it when you log out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 6: Presentation Layer - The Translator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Handles data formatting, encryption, and compression.&lt;/p&gt;

&lt;p&gt;This layer is like a &lt;strong&gt;universal translator&lt;/strong&gt; that ensures data is in the right format for the receiving application.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encryption/Decryption:&lt;/strong&gt; Scrambling data for security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression:&lt;/strong&gt; Making files smaller for faster transfer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format conversion:&lt;/strong&gt; Converting between different data formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you visit an HTTPS website, the Presentation Layer encrypts your data before sending it and decrypts incoming data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&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;Original: "Hello World"
Encrypted: "8b7df143d91c716ecfa5fc1730022f6b"
Compressed: "H3ll0 W0rld" (simplified example)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 7: Application Layer - The User Interface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Provides network services directly to end-users.&lt;/p&gt;

&lt;p&gt;This is the layer &lt;strong&gt;you actually see and interact with&lt;/strong&gt; - your web browser, email client, or messaging app.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Web browsers (HTTP/HTTPS)&lt;/li&gt;
&lt;li&gt;Email clients (SMTP, POP3, IMAP)&lt;/li&gt;
&lt;li&gt;File transfer (FTP)&lt;/li&gt;
&lt;li&gt;Remote access (SSH)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world scenario:&lt;/strong&gt; When you type &lt;code&gt;www.example.com&lt;/code&gt; in your browser, you're interacting with the Application Layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How All Layers Work Together
&lt;/h2&gt;

&lt;p&gt;Let's trace what happens when you send a message on WhatsApp:&lt;/p&gt;

&lt;h3&gt;
  
  
  Sending Data (Top to Bottom):
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Application Layer:&lt;/strong&gt; You type "Hello!" in WhatsApp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation Layer:&lt;/strong&gt; Encrypts and compresses your message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Layer:&lt;/strong&gt; Establishes connection with WhatsApp servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport Layer:&lt;/strong&gt; Breaks message into packets, adds sequence numbers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Layer:&lt;/strong&gt; Adds IP addresses (your phone → WhatsApp server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Link Layer:&lt;/strong&gt; Adds MAC addresses for local network routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical Layer:&lt;/strong&gt; Converts to electrical/radio signals and transmits&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Receiving Data (Bottom to Top):
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Physical Layer:&lt;/strong&gt; Receives electrical/radio signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Link Layer:&lt;/strong&gt; Checks MAC addresses, verifies data integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Layer:&lt;/strong&gt; Checks IP addresses, routes to correct device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport Layer:&lt;/strong&gt; Reassembles packets in correct order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Layer:&lt;/strong&gt; Manages the connection session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation Layer:&lt;/strong&gt; Decrypts and decompresses the message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application Layer:&lt;/strong&gt; WhatsApp displays "Hello!" on your friend's phone&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Memory Tricks to Remember the Layers
&lt;/h2&gt;

&lt;p&gt;Here are some popular mnemonics (from Layer 1 to 7):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Please Do Not Throw Sausage Pizza Away"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;hysical&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;ata Link&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N&lt;/strong&gt;etwork&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T&lt;/strong&gt;ransport&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt;ession&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;resentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt;pplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"All People Seem To Need Data Processing"&lt;/strong&gt; (Layer 7 to 1)&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Example 1: Watching Netflix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application Layer: Netflix app interface
Presentation Layer: Video compression (H.264), HTTPS encryption
Session Layer: Maintains streaming session
Transport Layer: TCP ensures all video packets arrive
Network Layer: Routes data from Netflix servers to your device
Data Link Layer: Wi-Fi manages local network communication
Physical Layer: Radio waves carry the data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 2: Sending an Email
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application Layer: Gmail interface
Presentation Layer: Email formatting, attachments encoding
Session Layer: SMTP session with email server
Transport Layer: TCP reliable delivery
Network Layer: IP routing across internet
Data Link Layer: Ethernet frame handling
Physical Layer: Fiber optic cables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Protocols by Layer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Common Protocols&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, FTP, SMTP, DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presentation&lt;/td&gt;
&lt;td&gt;SSL/TLS, JPEG, MPEG, ASCII&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;NetBIOS, RPC, SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;TCP, UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;IP, ICMP, OSPF, BGP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Link&lt;/td&gt;
&lt;td&gt;Ethernet, Wi-Fi, PPP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physical&lt;/td&gt;
&lt;td&gt;Ethernet cables, Fiber optic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Troubleshooting with the OSI Model
&lt;/h2&gt;

&lt;p&gt;When network issues occur, the OSI model helps you troubleshoot systematically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Can't access a website&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer-by-layer troubleshooting:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Physical:&lt;/strong&gt; Is the cable plugged in? Is Wi-Fi connected?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Link:&lt;/strong&gt; Can you see other devices on the local network?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network:&lt;/strong&gt; Can you ping the router? Can you ping external IPs?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport:&lt;/strong&gt; Are the right ports open?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session:&lt;/strong&gt; Is the connection being established?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation:&lt;/strong&gt; Are there encryption/certificate issues?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application:&lt;/strong&gt; Is the web browser working correctly?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  OSI vs TCP/IP Model
&lt;/h2&gt;

&lt;p&gt;While we've focused on the OSI model, it's worth noting that the internet actually uses the &lt;strong&gt;TCP/IP model&lt;/strong&gt;, which has 4 layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OSI Model&lt;/th&gt;
&lt;th&gt;TCP/IP Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application, Presentation, Session&lt;/td&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Link, Physical&lt;/td&gt;
&lt;td&gt;Network Access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The OSI model is more detailed and better for understanding concepts, while TCP/IP is what's actually implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Developers
&lt;/h2&gt;

&lt;p&gt;Understanding the OSI model helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debug network issues&lt;/strong&gt; more effectively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose the right protocols&lt;/strong&gt; for your applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize performance&lt;/strong&gt; by understanding where bottlenecks occur&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design better architectures&lt;/strong&gt; with proper separation of concerns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communicate effectively&lt;/strong&gt; with network administrators&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The OSI model might seem complex at first, but it's really just a logical way to organize how networks communicate. Each layer has a specific job, and they all work together like a well-orchestrated symphony.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Physical Layer:&lt;/strong&gt; The roads (cables, wireless)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Link Layer:&lt;/strong&gt; Traffic rules (local network management)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Layer:&lt;/strong&gt; GPS navigation (routing across networks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport Layer:&lt;/strong&gt; Delivery service (reliable data transfer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Layer:&lt;/strong&gt; Call manager (connection management)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation Layer:&lt;/strong&gt; Translator (data formatting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application Layer:&lt;/strong&gt; User interface (what you interact with)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next time you send a message, browse the web, or stream a video, you'll know the incredible journey your data takes through these seven layers!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this helpful? Give it a ❤️ and share your thoughts in the comments! What networking concept would you like me to explain next?&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  networking #osi #tcp #protocols #webdev #computerscience #tutorial
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
      <category>networking</category>
    </item>
    <item>
      <title>ThreeTierApplication: A Modern DevOps Todo Deployment using DevSecOps on AWS EKS</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Wed, 13 Aug 2025 13:33:00 +0000</pubDate>
      <link>https://dev.to/deepanshub09/quickstart-deep-dive-threetierappchallenge-a-modern-devops-todo-application-2lk2</link>
      <guid>https://dev.to/deepanshub09/quickstart-deep-dive-threetierappchallenge-a-modern-devops-todo-application-2lk2</guid>
      <description>&lt;p&gt;Welcome to the ultimate hands-on guide for deploying a production-ready three-tier web application! This comprehensive tutorial will walk you through the &lt;strong&gt;ThreeTierAppChallenge&lt;/strong&gt; - a modern todo application built with React, Node.js, and MongoDB, complete with Docker containerization, Kubernetes manifests, and CI/CD pipelines. Whether you're looking to learn modern DevOps practices or deploy a scalable web application, this guide has everything you need to get started and master the deployment pipeline.&lt;/p&gt;




&lt;p&gt;The &lt;strong&gt;ThreeTierAppChallenge&lt;/strong&gt; is a full-stack todo application featuring a React frontend, Node.js backend, and MongoDB database, designed for cloud-native deployment on AWS EKS. Clone the repo, run with Docker Compose in under 5 minutes, or dive deep into Kubernetes deployment with included manifests and Jenkins CI/CD pipelines. Perfect for learning modern DevOps practices including containerization, orchestration, and infrastructure as code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before diving in, make sure you have these tools installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; (for version control)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; (v18+ recommended) and &lt;strong&gt;npm&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; and &lt;strong&gt;Docker Compose&lt;/strong&gt; (for containerization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional but recommended:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;kubectl&lt;/a&gt; (for Kubernetes management)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt; (for cloud deployment)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.terraform.io/downloads" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; (for infrastructure provisioning)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Quick Local Setup
&lt;/h2&gt;

&lt;p&gt;Let's get the application running on your local machine in just a few minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/YOUR_USERNAME/TWSThreeTierAppChallenge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;TWSThreeTierAppChallenge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Run with Docker Compose (Fastest Method)
&lt;/h3&gt;

&lt;p&gt;The easiest way to get everything running is with Docker Compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sample Output:&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;[+] Building 45.2s (23/23) FINISHED
[+] Running 3/3
 ✔ Container mongodb    Started
 ✔ Container backend    Started  
 ✔ Container frontend   Started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a few minutes, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend API&lt;/strong&gt;: &lt;a href="http://localhost:3500" rel="noopener noreferrer"&gt;http://localhost:3500&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt;: localhost:27017&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Manual Setup (Development Mode)
&lt;/h3&gt;

&lt;p&gt;For development, you might want to run services individually:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend Setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Application-Code/backend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Frontend Setup (in a new terminal):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Application-Code/frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sample Output:&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;Compiled successfully!

You can now view client in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.100:3000

webpack compiled with 0 errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Run Tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backend tests&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;Application-Code/backend
npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Frontend tests  &lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;Application-Code/frontend
npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 Annotated Dockerfile Analysis
&lt;/h2&gt;

&lt;p&gt;Let's examine the frontend Dockerfile to understand the containerization strategy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build        # 1. Multi-stage build for optimization&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./               # 2. Copy package files first for layer caching&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;                     &lt;span class="c"&gt;# 3. Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .                            # 4. Copy application source code&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build                   &lt;span class="c"&gt;# 5. Build the React production bundle&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine                   # 6. Use lightweight Nginx for serving&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/build /usr/share/nginx/html  # 7. Copy built assets&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]  # 8. Start Nginx in foreground&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-stage build&lt;/strong&gt; reduces final image size by ~70%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer caching&lt;/strong&gt; speeds up subsequent builds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nginx&lt;/strong&gt; provides production-grade static file serving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alpine base&lt;/strong&gt; minimizes security attack surface&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Diagram Description:&lt;/strong&gt; &lt;br&gt;
Create a diagram showing three tiers connected vertically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐
│   Frontend      │ ← React.js (Port 3000)
│   (React)       │
└─────────┬───────┘
          │ HTTP/REST API
┌─────────▼───────┐
│   Backend       │ ← Node.js/Express (Port 3500)  
│   (Node.js)     │
└─────────┬───────┘
          │ MongoDB Connection
┌─────────▼───────┐
│   Database      │ ← MongoDB (Port 27017)
│   (MongoDB)     │
└─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Additional Infrastructure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Containers&lt;/strong&gt; around each tier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes Pods&lt;/strong&gt; for orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS EKS&lt;/strong&gt; for managed Kubernetes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jenkins&lt;/strong&gt; for CI/CD automation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Three Essential Code Snippets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Smart Database Connection with Fallback
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Application-Code/backend/db.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Skip MongoDB connection if not using MongoDB&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USE_MONGODB&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Using file-based storage (MongoDB disabled)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connectionParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;useNewUrlParser&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="na"&gt;useUnifiedTopology&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDBAuth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USE_DB_AUTH&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;useDBAuth&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="nx"&gt;connectionParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGO_USERNAME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;connectionParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGO_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGO_CONN_STR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;connectionParams&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Connected to MongoDB database.&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Could not connect to database. Falling back to file-based storage...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USE_MONGODB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;false&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Line-by-line breakdown:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lines 3-6&lt;/strong&gt;: Check environment variable to enable/disable MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 8-16&lt;/strong&gt;: Configure connection parameters with optional authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 18&lt;/strong&gt;: Attempt MongoDB connection using environment variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 21-23&lt;/strong&gt;: Graceful fallback to file-based storage on connection failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern ensures your application works in any environment!&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Frontend API Service with Error Handling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Application-Code/frontend/src/services/taskServices.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;taskService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;getTasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="na"&gt;addTask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;taskData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;taskData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Add task error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's happening:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lines 3-9&lt;/strong&gt;: Dynamic query parameter building for flexible filtering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 11-12&lt;/strong&gt;: Clean GET request with constructed parameters
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 15-22&lt;/strong&gt;: POST request with comprehensive error handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 19-20&lt;/strong&gt;: Proper error logging and re-throwing for upstream handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Production-Ready Kubernetes Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Kubernetes-Manifests-file/Backend/deployment.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;three-tier&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;                        &lt;span class="c1"&gt;# High availability with 2 instances&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RollingUpdate&lt;/span&gt;
    &lt;span class="na"&gt;rollingUpdate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;maxSurge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;                    &lt;span class="c1"&gt;# Allow 1 extra pod during updates&lt;/span&gt;
      &lt;span class="na"&gt;maxUnavailable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;25%&lt;/span&gt;            &lt;span class="c1"&gt;# Maximum 25% downtime during updates&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&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;MONGO_CONN_STR&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb://mongodb-svc:27017/todo?directConnection=true&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3500&lt;/span&gt;
        &lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;               &lt;span class="c1"&gt;# Health check configuration&lt;/span&gt;
          &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/ok&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3500&lt;/span&gt;
          &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
          &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Deployment highlights:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Line 8&lt;/strong&gt;: Two replicas ensure high availability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 10-13&lt;/strong&gt;: Rolling updates with zero downtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 18-19&lt;/strong&gt;: Service discovery using Kubernetes DNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 22-27&lt;/strong&gt;: Health checks for automatic recovery&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚨 Common Issues &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue 1: Backend Using File Storage Instead of MongoDB
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; API works but data doesn't persist between container restarts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check backend logs&lt;/span&gt;
docker logs backend

&lt;span class="c"&gt;# Set environment variable&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"USE_MONGODB=true"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; Application-Code/backend/.env
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"MONGO_CONN_STR=mongodb://mongodb:27017/todo"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; Application-Code/backend/.env

&lt;span class="c"&gt;# Restart containers&lt;/span&gt;
docker-compose restart backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 2: Frontend Can't Connect to Backend
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Frontend loads but no tasks appear, network errors in browser console&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if backend is running&lt;/span&gt;
curl http://localhost:3500/health

&lt;span class="c"&gt;# Verify environment variable&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"REACT_APP_BACKEND_URL=http://localhost:3500/api/tasks"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; Application-Code/frontend/.env

&lt;span class="c"&gt;# Rebuild frontend&lt;/span&gt;
docker-compose build frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 3: Port Conflicts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; &lt;code&gt;docker-compose up&lt;/code&gt; fails with "port already in use"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check what's using the ports&lt;/span&gt;
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :3000,3500,27017

&lt;span class="c"&gt;# Kill conflicting processes or change ports in docker-compose.yml&lt;/span&gt;
&lt;span class="c"&gt;# Example: Change frontend port to 3001&lt;/span&gt;
ports:
  - &lt;span class="s2"&gt;"3001:3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 CI/CD Pipeline Overview
&lt;/h2&gt;

&lt;p&gt;The project includes comprehensive Jenkins pipelines for both frontend and backend:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Quality&lt;/strong&gt;: SonarQube analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: OWASP dependency checks and Trivy scanning
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerization&lt;/strong&gt;: Docker image building and ECR pushing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps&lt;/strong&gt;: Automatic deployment manifest updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;To set up CI/CD:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy Jenkins using the provided Terraform scripts&lt;/li&gt;
&lt;li&gt;Configure the provided Jenkinsfile pipelines&lt;/li&gt;
&lt;li&gt;Set up AWS ECR repositories for image storage&lt;/li&gt;
&lt;li&gt;Watch automated deployments to EKS!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ☸️ Kubernetes Deployment
&lt;/h2&gt;

&lt;p&gt;Ready to go production? Deploy to Kubernetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create namespace&lt;/span&gt;
kubectl create namespace three-tier

&lt;span class="c"&gt;# Deploy database&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; Kubernetes-Manifests-file/Database/

&lt;span class="c"&gt;# Create MongoDB credentials&lt;/span&gt;
kubectl create secret generic mongo-sec &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password123 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; three-tier

&lt;span class="c"&gt;# Deploy backend and frontend&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; Kubernetes-Manifests-file/Backend/
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; Kubernetes-Manifests-file/Frontend/

&lt;span class="c"&gt;# Set up ingress (requires AWS Load Balancer Controller)&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; Kubernetes-Manifests-file/ingress.yaml

&lt;span class="c"&gt;# Check deployment status&lt;/span&gt;
kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; three-tier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Congratulations! You've successfully deployed a modern three-tier application. Here are your next steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 &lt;strong&gt;Immediate Next Steps:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explore the Code&lt;/strong&gt;: Dive deeper into the Application-Code directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try Kubernetes&lt;/strong&gt;: Use the manifests in Kubernetes-Manifests-file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set Up CI/CD&lt;/strong&gt;: Implement the Jenkins pipelines from Jenkins-Pipeline-Code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 &lt;strong&gt;Learning Opportunities:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code&lt;/strong&gt;: Study the Terraform scripts in Jenkins-Server-TF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Implement the security best practices shown in the code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Add Prometheus and Grafana (hint: it's in the challenge levels!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤝 &lt;strong&gt;Community &amp;amp; Contributing:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Report Issues&lt;/strong&gt;: Found a bug? Open an issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribute&lt;/strong&gt;: Check the contribution guidelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share Your Experience&lt;/strong&gt;: Write about your deployment journey!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏆 &lt;strong&gt;Challenge Yourself:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bronze&lt;/strong&gt;: Get the basic deployment working ✅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silver&lt;/strong&gt;: Add SSL/TLS and monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gold&lt;/strong&gt;: Implement GitOps with ArgoCD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platinum&lt;/strong&gt;: Add your own innovative features!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📋 Quick Reference Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Development&lt;/span&gt;
npm start                          &lt;span class="c"&gt;# Start local development&lt;/span&gt;
docker-compose up                  &lt;span class="c"&gt;# Run full stack locally&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; three-tier     &lt;span class="c"&gt;# Check Kubernetes status&lt;/span&gt;

&lt;span class="c"&gt;# Troubleshooting  &lt;/span&gt;
docker logs container_name         &lt;span class="c"&gt;# Check container logs&lt;/span&gt;
kubectl describe pod pod_name      &lt;span class="c"&gt;# Debug Kubernetes issues&lt;/span&gt;
curl localhost:3500/health         &lt;span class="c"&gt;# Test backend health&lt;/span&gt;

&lt;span class="c"&gt;# Cleanup&lt;/span&gt;
docker-compose down               &lt;span class="c"&gt;# Stop local environment&lt;/span&gt;
kubectl delete namespace three-tier  &lt;span class="c"&gt;# Remove Kubernetes deployment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Recommended dev.to tags&lt;/strong&gt;: &lt;code&gt;tutorial&lt;/code&gt;, &lt;code&gt;javascript&lt;/code&gt;, &lt;code&gt;react&lt;/code&gt;, &lt;code&gt;nodejs&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;kubernetes&lt;/code&gt;, &lt;code&gt;devops&lt;/code&gt;, &lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;ci-cd&lt;/code&gt;, &lt;code&gt;mongodb&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Ready to build something amazing? Clone the repo and start your DevOps journey today! 🚀&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions or run into issues? Drop a comment below or reach out to the community. Happy coding!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>aws</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Spring Boot Banking Application Deployment using DevSecOps on AWS EKS</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Sat, 09 Aug 2025 11:14:33 +0000</pubDate>
      <link>https://dev.to/deepanshub09/spring-boot-banking-application-deployment-using-devsecops-on-aws-eks-27ff</link>
      <guid>https://dev.to/deepanshub09/spring-boot-banking-application-deployment-using-devsecops-on-aws-eks-27ff</guid>
      <description>&lt;p&gt;A comprehensive, secure banking web application built with Spring Boot, featuring modern web technologies and enterprise-grade security. This application provides essential banking operations with a user-friendly interface and robust backend architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a multi-tier bank an application written in Java (Springboot).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcb9444jdn64t0ai995o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcb9444jdn64t0ai995o.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaqwewo6mg22s9pkjewt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaqwewo6mg22s9pkjewt.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Tech stack used in this project:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub (Code)&lt;/li&gt;
&lt;li&gt;Docker (Containerization)&lt;/li&gt;
&lt;li&gt;Jenkins (CI)&lt;/li&gt;
&lt;li&gt;OWASP (Dependency check)&lt;/li&gt;
&lt;li&gt;SonarQube (Quality)&lt;/li&gt;
&lt;li&gt;Snyk (AI vulnerability)&lt;/li&gt;
&lt;li&gt;ArgoCD (CD)&lt;/li&gt;
&lt;li&gt;AWS EKS (Kubernetes)&lt;/li&gt;
&lt;li&gt;Helm (Monitoring using grafana and prometheus)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Steps to deploy:
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Pre-requisites:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;root user access
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;[!Note]&lt;br&gt;
This project will be implemented on North Virginia region (us-east-1).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Create 1 Master machine on AWS (t3.large) and 25 GB of storage.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Open the below ports in security group&lt;/b&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fltgt8fjeseza7gujnnww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fltgt8fjeseza7gujnnww.png" alt="image" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b id="EKS"&gt;Create EKS Cluster on AWS&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IAM user with &lt;strong&gt;access keys and secret access keys&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWSCLI should be configured&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  curl &lt;span class="s2"&gt;"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"awscliv2.zip"&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;unzip
  unzip awscliv2.zip
  &lt;span class="nb"&gt;sudo&lt;/span&gt; ./aws/install
  aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Install &lt;strong&gt;kubectl&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  curl &lt;span class="nt"&gt;-o&lt;/span&gt; kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
  &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./kubectl
  &lt;span class="nb"&gt;sudo mv&lt;/span&gt; ./kubectl /usr/local/bin
  kubectl version &lt;span class="nt"&gt;--short&lt;/span&gt; &lt;span class="nt"&gt;--client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Install &lt;strong&gt;eksctl&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;_amd64.tar.gz"&lt;/span&gt; | &lt;span class="nb"&gt;tar &lt;/span&gt;xz &lt;span class="nt"&gt;-C&lt;/span&gt; /tmp
  &lt;span class="nb"&gt;sudo mv&lt;/span&gt; /tmp/eksctl /usr/local/bin
  eksctl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Create EKS Cluster&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  eksctl create cluster &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bankapp &lt;span class="se"&gt;\&lt;/span&gt;
                      &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-west-1 &lt;span class="se"&gt;\&lt;/span&gt;
                      &lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.30 &lt;span class="se"&gt;\&lt;/span&gt;
                      &lt;span class="nt"&gt;--without-nodegroup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Associate IAM OIDC Provider&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  eksctl utils associate-iam-oidc-provider &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; us-west-1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt; bankapp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--approve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Create Nodegroup&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  eksctl create nodegroup &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bankapp &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bankapp &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--node-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;t3.medium &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes-min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes-max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--node-volume-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;25 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--ssh-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--ssh-public-key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eks-nodegroup-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;[!Note]&lt;br&gt;
Make sure the ssh-public-key "eks-nodegroup-key is available in your aws account"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Install Jenkins&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fontconfig openjdk-17-jre &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; /usr/share/keyrings/jenkins-keyring.asc &lt;span class="se"&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable binary/ | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;jenkins &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After installing Jenkins, change the default port of jenkins from 8080 to 8081. Because our bankapp application will be running on 8080.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open /usr/lib/systemd/system/jenkins.service file and change JENKINS_PORT environment variable
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6v4tq4o2542k7dkylv6.png" alt="image" width="800" height="117"&gt;
&lt;/li&gt;
&lt;li&gt;Reload daemon
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Restart Jenkins
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b id="docker"&gt;Install docker&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker ubuntu &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; newgrp docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b id="Sonar"&gt;Install and configure SonarQube&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull sonarqube

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; sonarqube &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;SONAR_ES_BOOTSTRAP_CHECKS_DISABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 9000:9000 sonarqube:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b id="OWASP"&gt;Install OWASP&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull owasp/dependency-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;blockquote&gt;
&lt;p&gt;[!Note]&lt;br&gt;
OWASP setup take around 10-20min first its download all the vulnerability from there database into you system. With API key your process becomes quit faster. "&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can request you OWASP API key (FREE) &lt;a href="https://nvd.nist.gov/developers/request-an-api-key" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b id="Argo"&gt;Install and Configure ArgoCD&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Create argocd namespace&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl create namespace argocd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Apply argocd manifest&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl apply &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Make sure all pods are running in argocd namespace&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  watch kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; argocd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Install argocd CLI&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v2.4.7/argocd-linux-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Provide executable permission&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/argocd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Check argocd services&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; argocd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Change argocd server's service from ClusterIP to NodePort&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl patch svc argocd-server &lt;span class="nt"&gt;-n&lt;/span&gt; argocd &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'{"spec": {"type": "NodePort"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Confirm service is patched or not&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; argocd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt; Check the port where ArgoCD server is running and expose it on security groups of a k8s worker node&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Access it on browser, click on advance and proceed with&lt;/b&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &amp;lt;public-ip-worker&amp;gt;:&amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Fetch the initial password of argocd server&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; argocd get secret argocd-initial-admin-secret &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.data.password}"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Username: admin&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; Now, go to User Info and update your argocd password&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Go to Jenkins and click on  Manage Jenkins --&amp;gt; Plugins --&amp;gt; Available plugins install the below plugins:&lt;/b&gt;

&lt;ul&gt;
&lt;li&gt;OWASP&lt;/li&gt;
&lt;li&gt;SonarQube Scanner&lt;/li&gt;
&lt;li&gt;Synk&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Pipeline: Stage View&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b id="Owasp"&gt;Configure OWASP, move to Manage Jenkins --&amp;gt; Plugins --&amp;gt; Available pluginsb&amp;gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0kf3bvgiq9d7yjfo47y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0kf3bvgiq9d7yjfo47y.png" alt="image" width="800" height="378"&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b id="Sonar"&gt;After OWASP plugin is installed, Now move to Manage jenkins --&amp;gt; Tools and configure it.&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b id="Sonar"&gt;After Synk plugin is installed, Now move to Manage --&amp;gt; Tools and configure it.&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Login to SonarQube server and create the credentials for jenkins to integrate with SonarQube&lt;/b&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to Administration --&amp;gt; Security --&amp;gt; Users --&amp;gt; Token and paste into inside your jenkins credentials 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Now, go to  Manage Jenkins --&amp;gt; credentials and add Sonarqube credentials:&lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2k51sdq1xrr5cdt59hbe.png" alt="image" width="800" height="372"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Go to  Manage Jenkins --&amp;gt; Tools and search for SonarQube Scanner installations:&lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2xzadkdxrvqtv7iup9i.png" alt="image" width="800" height="374"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Go to  Manage Jenkins --&amp;gt; credentials and add Docker credentials to push updated the updated docker image to dockerhub.&lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbkbvt9dya809dwza251.png" alt="image" width="800" height="377"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Go to  Manage Jenkins --&amp;gt; System and search for SonarQube installations:&lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3r3or3jt686lkpg4eo45.png" alt="image" width="800" height="340"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Login to SonarQube server, go to Administration --&amp;gt; Webhook and click on create &lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8nvp633ca4a0t52x1f1.png" alt="image" width="800" height="370"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e0yka0mk9fff7lotv43.png" alt="image" width="497" height="544"&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt; Go to Master Machine and add our own eks cluster to argocd for application deployment using cli&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Login to argoCD from CLI&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   argocd login 52.53.156.187:32738 &lt;span class="nt"&gt;--username&lt;/span&gt; admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;[!Tip]&lt;br&gt;
52.53.156.187:32738 --&amp;gt; This should be your argocd url&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Check how many clusters are available in argocd &lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  argocd cluster list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Get your cluster name&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl config get-contexts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Add your cluster to argocd&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  argocd cluster add bankapp-cluster.us-east-1.eksctl.io &lt;span class="nt"&gt;--name&lt;/span&gt; bankapp-eks-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;[!Tip] &amp;gt; bankapp-cluster.us-east-1.eksctl.io --&amp;gt; This should be your EKS Cluster Name.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt; Once your cluster is added to argocd, go to argocd console Settings --&amp;gt; Clusters and verify it&lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxv9ur00q366am5wyrjf.png" alt="image" width="800" height="132"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Go to Settings --&amp;gt; Repositories and click on Connect repo &lt;/b&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabggbucu1bc4ef9d2vfj.png" alt="image" width="800" height="361"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!Note]&lt;br&gt;
Connection should be successful&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Create BankApp-CI job
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsu9qb1shgavyt0386ym3.png" alt="image" width="800" height="381"&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Create BankApp-CD job, same as CI job.&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Provide permission to docker socket so that docker build and push command do not fail&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;777 /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Now, go to Applications and click on New App&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;[!Important]&lt;br&gt;
Make sure to click on the Auto-Create Namespace option while creating argocd application&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Congratulations, your application is deployed on AWS EKS Cluster&lt;/b&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi9ozuwksqrlzoekpfur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi9ozuwksqrlzoekpfur.png" alt="image" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;b&gt;Open port 30080 on worker node and Access it on browser&lt;/b&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;worker-public-ip&amp;gt;:30080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  How to monitor EKS cluster, kubernetes components and workloads using prometheus and grafana via HELM (On Master machine)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p id="Monitor"&gt;Install Helm Chart&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;700 get_helm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./get_helm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Add Helm Stable Charts for Your Local Client
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add stable https://charts.helm.sh/stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Add Prometheus Helm Repository
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Create Prometheus Namespace
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get ns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Install Prometheus using Helm
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;stable prometheus-community/kube-prometheus-stack &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Verify prometheus installation
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Check the services file (svc) of the Prometheus
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Expose Prometheus and Grafana to the external world through Node Port
&amp;gt; [!Important]
&amp;gt; change it from Cluster IP to NodePort after changing make sure you save the file and open the assigned nodeport to the service.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl edit svc stable-kube-prometheus-sta-prometheus &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Verify service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Now,let’s change the SVC file of the Grafana and expose it to the outer world
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl edit svc stable-grafana &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Check grafana service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get a password for grafana
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get secret &lt;span class="nt"&gt;--namespace&lt;/span&gt; prometheus stable-grafana &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.data.admin-password}"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;--decode&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;[!Note]&lt;br&gt;
Username: admin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Now, view the Dashboard in Grafana&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Clean Up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b id="Clean"&gt;Delete eks cluster&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eksctl delete cluster &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bankapp &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spring.io/projects/spring-boot" rel="noopener noreferrer"&gt;Spring Boot Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spring.io/projects/spring-security" rel="noopener noreferrer"&gt;Spring Security Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/" rel="noopener noreferrer"&gt;MySQL Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/" rel="noopener noreferrer"&gt;Docker Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maven.apache.org/users/index.html" rel="noopener noreferrer"&gt;Maven User Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Coding! 🏦💳&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>terraform</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Terraform Modules: Your Infrastructure's Building Blocks (The Complete Guide)</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Thu, 31 Jul 2025 19:25:07 +0000</pubDate>
      <link>https://dev.to/deepanshub09/terraform-modules-your-infrastructures-building-blocks-the-complete-guide-25c5</link>
      <guid>https://dev.to/deepanshub09/terraform-modules-your-infrastructures-building-blocks-the-complete-guide-25c5</guid>
      <description>&lt;p&gt;&lt;em&gt;Imagine if every time you wanted to build a house, you had to start from scratch - making your own bricks, mixing cement, crafting doors. Sounds exhausting, right? That's exactly what writing Terraform without modules feels like. Let me show you how modules can change your infrastructure game forever.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 What Are Terraform Modules?
&lt;/h2&gt;

&lt;p&gt;Think of Terraform modules as &lt;strong&gt;LEGO blocks for your infrastructure&lt;/strong&gt;. Just like how you can build a castle, spaceship, or car using the same LEGO pieces, modules let you create reusable infrastructure components that you can use across different projects.&lt;/p&gt;

&lt;p&gt;In simple terms: &lt;strong&gt;A module is a collection of Terraform files that create a specific piece of infrastructure.&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;🏗️ Traditional Way (Without Modules):
Every project = Build everything from scratch

🧱 With Modules:
Every project = Assemble pre-built, tested components
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  😫 The Pain Without Modules
&lt;/h2&gt;

&lt;p&gt;Let me paint you a picture of life before modules:&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 1: The Copy-Paste Nightmare
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Developer A: &lt;span class="s2"&gt;"I need to create a VPC for the new project"&lt;/span&gt;
Developer B: &lt;span class="s2"&gt;"Just copy the VPC code from the last project"&lt;/span&gt;
Developer A: &lt;span class="s2"&gt;"Which version? The one from 3 months ago or the updated one?"&lt;/span&gt;
Developer B: &lt;span class="s2"&gt;"Ummm... good question 🤷‍♂️"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 2: The "Find and Replace" Horror
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Project 1&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web_server_project_alpha"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# 50 lines of configuration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Project 2 (copy-pasted and modified)&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web_server_project_beta"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# Same 50 lines, but with different names&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Project 3... Project 4... Project N...&lt;/span&gt;
&lt;span class="c1"&gt;# 😱 Now you have to maintain the same logic in 20 different places!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 3: The "Oops, I Broke Everything" Story
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;DevOps Engineer: &lt;span class="s2"&gt;"I found a security bug in our EC2 configuration"&lt;/span&gt;
Team Lead: &lt;span class="s2"&gt;"Great! How many projects do we need to update?"&lt;/span&gt;
DevOps Engineer: &lt;span class="s2"&gt;"Only... 15 different repositories... 😰"&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;2 weeks later, still updating projects&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 What Problems Do Modules Solve?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;DRY Principle (Don't Repeat Yourself)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of copying the same configuration everywhere, write it once and reuse it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Consistency Across Projects&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everyone uses the same, tested infrastructure patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Easier Maintenance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fix a bug once, and it's fixed everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Team Collaboration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Share infrastructure patterns across teams and organizations.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Testing and Quality&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Test your modules once, trust them everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Module Architecture
&lt;/h2&gt;

&lt;p&gt;Here's how modules work in the real world:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📁 Your Organization
├── 🏢 Projects
│   ├── Project A (uses modules)
│   ├── Project B (uses modules)
│   └── Project C (uses modules)
│
└── 📦 Module Library
    ├── 🌐 VPC Module
    ├── 🖥️ EC2 Module
    ├── 🗄️ RDS Module
    └── 🔒 Security Group Module

Instead of each project building everything from scratch,
they all use the same tested, standardized modules!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Creating Your First Module
&lt;/h2&gt;

&lt;p&gt;Let's build a real module together! We'll create a "Web Server" module that you can reuse across projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Module Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modules/
└── web-server/
    ├── main.tf        # Main resources
    ├── variables.tf   # Input variables
    ├── outputs.tf     # Output values
    └── README.md      # Documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Define the Module
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;modules/web-server/main.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Security group for web server&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"web_sg"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name_prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.name_prefix}-web-sg"&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc_id&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"HTTP"&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"HTTPS"&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SSH"&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ssh_cidr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;egress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"-1"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.name_prefix}-web-sg"&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# EC2 instance for web server&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web_server"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_count&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ami_id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key_name&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_sg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subnet_id&lt;/span&gt;

  &lt;span class="nx"&gt;user_data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_data_script&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.name_prefix}-web-${count.index + 1}"&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Application Load Balancer (optional)&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb"&lt;/span&gt; &lt;span class="s2"&gt;"web_lb"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create_load_balancer&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.name_prefix}-web-lb"&lt;/span&gt;
  &lt;span class="nx"&gt;internal&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="nx"&gt;load_balancer_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application"&lt;/span&gt;
  &lt;span class="nx"&gt;security_groups&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_sg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;subnets&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lb_subnets&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&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;File: &lt;code&gt;modules/web-server/variables.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"name_prefix"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Prefix for all resource names"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"vpc_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"VPC ID where resources will be created"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"subnet_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Subnet ID for EC2 instances"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ami_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AMI ID for EC2 instances"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c02fb55956c7d316"&lt;/span&gt; &lt;span class="c1"&gt;# Amazon Linux 2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_type"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"EC2 instance type"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_count"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Number of EC2 instances to create"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"key_name"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AWS Key Pair name for SSH access"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ssh_cidr"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"CIDR block allowed for SSH access"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/8"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"user_data_script"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"User data script for EC2 initialization"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
    #!/bin/bash
    yum update -y
    yum install -y httpd
    systemctl start httpd
    systemctl enable httpd
    echo "&amp;lt;h1&amp;gt;Hello from Terraform Module!&amp;lt;/h1&amp;gt;" &amp;gt; /var/www/html/index.html
&lt;/span&gt;&lt;span class="no"&gt;  EOF
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"create_load_balancer"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Whether to create an Application Load Balancer"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bool&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"lb_subnets"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Subnet IDs for Load Balancer (required if create_load_balancer is true)"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"tags"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Tags to apply to all resources"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;modules/web-server/outputs.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"instance_ids"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"IDs of the created EC2 instances"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_server&lt;/span&gt;&lt;span class="p"&gt;[*].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"instance_public_ips"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Public IP addresses of the instances"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_server&lt;/span&gt;&lt;span class="p"&gt;[*].&lt;/span&gt;&lt;span class="nx"&gt;public_ip&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"instance_private_ips"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Private IP addresses of the instances"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_server&lt;/span&gt;&lt;span class="p"&gt;[*].&lt;/span&gt;&lt;span class="nx"&gt;private_ip&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"security_group_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ID of the created security group"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_sg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"load_balancer_dns"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"DNS name of the load balancer (if created)"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create_load_balancer&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;aws_lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_lb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;dns_name&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"load_balancer_arn"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ARN of the load balancer (if created)"&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create_load_balancer&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;aws_lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_lb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Using Your Module
&lt;/h2&gt;

&lt;p&gt;Now that we've created our module, let's use it in different projects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 1: Simple Web Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;projects/simple-web/main.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Call our web-server module&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"simple_web"&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;"../../modules/web-server"&lt;/span&gt;

  &lt;span class="nx"&gt;name_prefix&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"simple-web"&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc-12345678"&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"subnet-12345678"&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-key-pair"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"development"&lt;/span&gt;
    &lt;span class="nx"&gt;Project&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"simple-web"&lt;/span&gt;
    &lt;span class="nx"&gt;Owner&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dev-team"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Use module outputs&lt;/span&gt;
&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"web_server_ip"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;simple_web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_public_ips&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project 2: High-Availability Web Application
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;projects/ha-web-app/main.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Call the same module with different configuration&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"ha_web_app"&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;"../../modules/web-server"&lt;/span&gt;

  &lt;span class="nx"&gt;name_prefix&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ha-web-app"&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc-87654321"&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"subnet-87654321"&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-key-pair"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.small"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_count&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="nx"&gt;create_load_balancer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;lb_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;"subnet-11111111"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"subnet-22222222"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;user_data_script&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
    #!/bin/bash
    yum update -y
    yum install -y httpd
    systemctl start httpd
    systemctl enable httpd
    echo "&amp;lt;h1&amp;gt;Production Web App - Server $(hostname)&amp;lt;/h1&amp;gt;" &amp;gt; /var/www/html/index.html
&lt;/span&gt;&lt;span class="no"&gt;  EOF

&lt;/span&gt;  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
    &lt;span class="nx"&gt;Project&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ha-web-app"&lt;/span&gt;
    &lt;span class="nx"&gt;Owner&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ops-team"&lt;/span&gt;
    &lt;span class="nx"&gt;Backup&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"load_balancer_url"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://${module.ha_web_app.load_balancer_dns}"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 Real-World Module Examples
&lt;/h2&gt;

&lt;p&gt;Here are some modules you'll commonly see in organizations:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;VPC Module&lt;/strong&gt;
&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;"./modules/vpc"&lt;/span&gt;

  &lt;span class="nx"&gt;cidr_block&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;availability_zones&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us-east-1a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1b"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;public_subnet_cidrs&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="nx"&gt;private_subnet_cidrs&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.10.0/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.20.0/24"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;enable_nat_gateway&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;enable_vpn_gateway&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;RDS Database Module&lt;/strong&gt;
&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;"database"&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;"./modules/rds"&lt;/span&gt;

  &lt;span class="nx"&gt;identifier&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"myapp-db"&lt;/span&gt;
  &lt;span class="nx"&gt;engine&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"postgres"&lt;/span&gt;
  &lt;span class="nx"&gt;engine_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"13.7"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.t3.micro"&lt;/span&gt;

  &lt;span class="nx"&gt;allocated_storage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
  &lt;span class="nx"&gt;storage_encrypted&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="nx"&gt;db_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"myapp"&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt;
  &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db_password&lt;/span&gt;

  &lt;span class="nx"&gt;vpc_security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;database_security_group_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_group_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;database_subnet_group_name&lt;/span&gt;

  &lt;span class="nx"&gt;backup_retention_period&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
  &lt;span class="nx"&gt;backup_window&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"03:00-04:00"&lt;/span&gt;
  &lt;span class="nx"&gt;maintenance_window&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sun:04:00-sun:05:00"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;S3 Bucket Module&lt;/strong&gt;
&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;"app_storage"&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;"./modules/s3-bucket"&lt;/span&gt;

  &lt;span class="nx"&gt;bucket_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"myapp-storage-${random_string.bucket_suffix.result}"&lt;/span&gt;

  &lt;span class="nx"&gt;enable_versioning&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;enable_encryption&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="nx"&gt;lifecycle_rules&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"transition_to_ia"&lt;/span&gt;
      &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Enabled"&lt;/span&gt;

      &lt;span class="nx"&gt;transition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;days&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
        &lt;span class="nx"&gt;storage_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"STANDARD_IA"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
    &lt;span class="nx"&gt;Purpose&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application-storage"&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;
  
  
  🌟 Advanced Module Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Conditional Resources&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create resources only when needed&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb"&lt;/span&gt; &lt;span class="s2"&gt;"this"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create_load_balancer&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="c1"&gt;# ... configuration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Dynamic Blocks&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create multiple similar blocks dynamically&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"this"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;

  &lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="s2"&gt;"ingress"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;for_each&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ingress_rules&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;from_port&lt;/span&gt;
      &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to_port&lt;/span&gt;
      &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt;
      &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cidr_blocks&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Module Composition&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use multiple modules together&lt;/span&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;"./modules/vpc"&lt;/span&gt;
  &lt;span class="c1"&gt;# ... configuration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"web_servers"&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;"./modules/web-server"&lt;/span&gt;

  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc_id&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_subnet_ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other configuration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"database"&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;"./modules/rds"&lt;/span&gt;

  &lt;span class="nx"&gt;vpc_security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;database_security_group_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_group_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;database_subnet_group_name&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other configuration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 Module Sources and Versioning
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Local Modules&lt;/strong&gt;
&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;"web_server"&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;"./modules/web-server"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Git Repository Modules&lt;/strong&gt;
&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;"web_server"&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;"git::https://github.com/your-org/terraform-modules.git//web-server?ref=v1.2.0"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Terraform Registry Modules&lt;/strong&gt;
&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;"~&amp;gt; 3.0"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;Private Registry Modules&lt;/strong&gt;
&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;"internal_module"&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;"company.registry.io/team/module-name/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;"1.0.0"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔧 Best Practices for Module Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Follow Naming Conventions&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Good:
- terraform-aws-vpc
- terraform-azure-storage
- terraform-gcp-compute

❌ Bad:
- my-module
- stuff
- vpc-thing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Use Semantic Versioning&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v1.0.0 - Initial release
v1.1.0 - Added new feature
v1.1.1 - Bug fix
v2.0.0 - Breaking change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Provide Good Documentation&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Web Server Module&lt;/span&gt;

&lt;span class="gu"&gt;## Usage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
hcl&lt;br&gt;
module "web_server" {&lt;br&gt;
  source = "./modules/web-server"&lt;/p&gt;

&lt;p&gt;name_prefix = "my-app"&lt;br&gt;
  vpc_id      = "vpc-12345"&lt;br&gt;
  # ...&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Requirements
- Terraform &amp;gt;= 1.0
- AWS Provider &amp;gt;= 4.0

## Inputs
| Name | Description | Type | Default | Required |
|------|-------------|------|---------|----------|
| name_prefix | Prefix for resource names | string | n/a | yes |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;Include Examples&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modules/
└── web-server/
    ├── main.tf
    ├── variables.tf
    ├── outputs.tf
    ├── README.md
    └── examples/
        ├── simple/
        │   └── main.tf
        └── advanced/
            └── main.tf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚨 Common Pitfalls and How to Avoid Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Overly Complex Modules&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ❌ Bad: One module that does everything&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"everything"&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;"./modules/entire-infrastructure"&lt;/span&gt;
  &lt;span class="c1"&gt;# 50+ variables&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Good: Focused, single-purpose modules&lt;/span&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;"./modules/vpc"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"web_servers"&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;"./modules/web-server"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Hard-coded Values&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ❌ Bad: Hard-coded values&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-12345678"&lt;/span&gt;  &lt;span class="c1"&gt;# This will break in other regions!&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t2.micro"&lt;/span&gt;     &lt;span class="c1"&gt;# No flexibility&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Good: Use variables and data sources&lt;/span&gt;
&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_ami"&lt;/span&gt; &lt;span class="s2"&gt;"amazon_linux"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"amazon"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;
    &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"amzn2-ami-hvm-*-x86_64-gp2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_ami&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amazon_linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Not Planning for Outputs&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ✅ Always think about what consumers might need&lt;/span&gt;
&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"instance_ids"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;[*].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"security_group_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"load_balancer_dns"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dns_name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Real-World Success Story
&lt;/h2&gt;

&lt;p&gt;Here's how a 100-person engineering organization transformed their infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Modules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 6 hours to set up a new environment&lt;/li&gt;
&lt;li&gt;😓 Configuration drift across 20+ projects&lt;/li&gt;
&lt;li&gt;🐛 Same bugs appearing in multiple places&lt;/li&gt;
&lt;li&gt;📧 "Can you share your VPC configuration?" messages daily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After Modules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ 30 minutes to set up a new environment&lt;/li&gt;
&lt;li&gt;🎯 100% consistent configurations&lt;/li&gt;
&lt;li&gt;🔒 Security fixes deployed everywhere instantly&lt;/li&gt;
&lt;li&gt;🤝 Self-service infrastructure for all teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Numbers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development Speed&lt;/strong&gt;: 10x faster environment setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug Reduction&lt;/strong&gt;: 85% fewer infrastructure-related bugs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Productivity&lt;/strong&gt;: 3 hours/week saved per developer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Compliance&lt;/strong&gt;: 100% consistent security posture&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Module Development Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Plan Your Module&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What problem does this solve?
Who will use this module?
What should be configurable?
What are the outputs?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Start Simple&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Version 1.0: Basic functionality&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ami_id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Iterate and Improve&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Version 1.1: Add security group&lt;/span&gt;
&lt;span class="c1"&gt;# Version 1.2: Add load balancer option&lt;/span&gt;
&lt;span class="c1"&gt;# Version 2.0: Support multiple instances&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;Test and Document&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Create example configurations
- Test in multiple environments
- Document all variables and outputs
- Add troubleshooting guide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Module Testing Strategy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Unit Testing with Terratest&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestWebServerModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;terraformOptions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;TerraformDir&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"../examples/simple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InitAndApply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;instanceId&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"instance_id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instanceId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Integration Testing&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test module in different scenarios&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;examples/simple &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; terraform apply
&lt;span class="nb"&gt;cd &lt;/span&gt;examples/with-load-balancer &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; terraform apply
&lt;span class="nb"&gt;cd &lt;/span&gt;examples/multi-instance &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Security Scanning&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use tools like tfsec, checkov, or terrascan&lt;/span&gt;
tfsec modules/web-server/
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; modules/web-server/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔮 Advanced Module Topics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Module Registry&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Host modules in private registries&lt;/li&gt;
&lt;li&gt;Version management and automated testing&lt;/li&gt;
&lt;li&gt;Module discovery and documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Module Composition Patterns&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parent modules that combine child modules&lt;/li&gt;
&lt;li&gt;Environment-specific module configurations&lt;/li&gt;
&lt;li&gt;Cross-module data sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Module Governance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Approval processes for module changes&lt;/li&gt;
&lt;li&gt;Module lifecycle management&lt;/li&gt;
&lt;li&gt;Security and compliance scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Implementation Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Identify repetitive infrastructure patterns&lt;/li&gt;
&lt;li&gt;[ ] Design your first module with clear inputs/outputs&lt;/li&gt;
&lt;li&gt;[ ] Create module documentation and examples&lt;/li&gt;
&lt;li&gt;[ ] Set up module versioning strategy&lt;/li&gt;
&lt;li&gt;[ ] Implement testing for your modules&lt;/li&gt;
&lt;li&gt;[ ] Create a module registry (internal or external)&lt;/li&gt;
&lt;li&gt;[ ] Train your team on module usage&lt;/li&gt;
&lt;li&gt;[ ] Establish module governance processes&lt;/li&gt;
&lt;li&gt;[ ] Monitor module usage and gather feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modules are LEGO blocks&lt;/strong&gt; for your infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start simple&lt;/strong&gt;, then add complexity as needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation and examples&lt;/strong&gt; are crucial for adoption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning&lt;/strong&gt; prevents breaking changes from affecting consumers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt; ensures your modules work reliably&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt; improves when everyone uses the same building blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Terraform modules are like having a team of infrastructure experts who've already solved common problems and packaged their solutions for you to use. They transform Infrastructure as Code from a chore into a joy.&lt;/p&gt;

&lt;p&gt;The initial investment in creating good modules pays dividends forever. Your future self (and your teammates) will thank you for the consistency, reliability, and speed that modules bring to your infrastructure.&lt;/p&gt;

&lt;p&gt;Start small - pick one repetitive pattern in your infrastructure and modularize it. Then watch as your team's productivity and infrastructure quality improve dramatically.&lt;/p&gt;

&lt;p&gt;What infrastructure patterns are you planning to modularize first? Share your module ideas in the comments below!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #terraform #modules #devops #infrastructure #iac #aws #automation #best-practices&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this helpful? Give it a ❤️ and follow me for more Infrastructure as Code content!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Building your first module? Drop your questions in the comments - I love helping fellow DevOps engineers!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>terraform</category>
      <category>aws</category>
    </item>
    <item>
      <title>Terraform Remote Backend: Why Your Team Needs It (And How to Set It Up)</title>
      <dc:creator>Deepanshu</dc:creator>
      <pubDate>Wed, 30 Jul 2025 15:59:00 +0000</pubDate>
      <link>https://dev.to/deepanshub09/terraform-remote-backend-why-your-team-needs-it-and-how-to-set-it-up-4iep</link>
      <guid>https://dev.to/deepanshub09/terraform-remote-backend-why-your-team-needs-it-and-how-to-set-it-up-4iep</guid>
      <description>&lt;p&gt;Ever had that moment when you and your teammate both run &lt;code&gt;terraform apply&lt;/code&gt; at the same time and suddenly your infrastructure is in a weird state? Yeah, we've all been there. Let's talk about how Terraform remote backend can save your sanity (and your infrastructure).&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Terraform Remote Backend?
&lt;/h2&gt;

&lt;p&gt;Think of Terraform's state file as your infrastructure's memory - it remembers what resources exist, their current configuration, and how they're connected. By default, this "memory" is stored locally on your computer in a file called &lt;code&gt;terraform.tfstate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But here's the problem: &lt;strong&gt;What happens when you work in a team?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you're building a house with your friends, but each person has their own blueprint and nobody shares what they've built. Chaos, right? That's exactly what happens with local state files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote backend&lt;/strong&gt; is like having a shared blueprint stored in the cloud that everyone can access and update safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Horror Stories of Local State
&lt;/h2&gt;

&lt;p&gt;Let me paint you a picture of what can go wrong:&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 1: The "Oops, I Deleted Everything" Story
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Developer A: &lt;span class="s2"&gt;"I just ran terraform destroy to clean up my test environment"&lt;/span&gt;
Developer B: &lt;span class="s2"&gt;"Wait... wasn't that the production database?! "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 2: The "Conflict of Interest" Story
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Developer A: Creates 5 EC2 instances
Developer B: &lt;span class="o"&gt;(&lt;/span&gt;at the same &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; Creates 3 RDS databases
Terraform: &lt;span class="s2"&gt;"Error: State file conflict. Good luck figuring this out! "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 3: The "Lost in Space" Story
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Developer: &lt;span class="s2"&gt;"My laptop crashed and I lost the state file"&lt;/span&gt;
Infrastructure: &lt;span class="k"&gt;*&lt;/span&gt;exists but is now unmanaged&lt;span class="k"&gt;*&lt;/span&gt;
Team: &lt;span class="s2"&gt;"So... do we rebuild everything or manually import 100 resources?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Remote Backend Architecture
&lt;/h2&gt;

&lt;p&gt;Here's how remote backend solves these problems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    👩‍💻 Developer 1        👨‍💻 Developer 2        👩‍💻 Developer 3
         │                    │                    │
         └─────────────┬──────┴─────────┬─────────┘
                       │                │
                       ▼                ▼
              ┌─────────────────────────────┐
              │       ☁️ AWS S3 Bucket       │
              │    (Shared State Storage)   │
              └─────────────┬───────────────┘
                            │
                            ▼
              ┌─────────────────────────────┐
              │      🔒 DynamoDB Table      │
              │      (State Locking)       │
              └─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzljx41unckcop4f36mjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzljx41unckcop4f36mjl.png" alt="LockID show when one user working on Infrastructure as code" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Benefits for Organizations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Team Collaboration Made Easy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of emailing state files around (please tell me you're not doing this), everyone accesses the same centralized state.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;State Locking Prevents Disasters&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When someone runs &lt;code&gt;terraform apply&lt;/code&gt;, the state gets locked. If another team member tries to run Terraform simultaneously, they get a friendly "Hey, wait your turn!" message instead of corrupting the state.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Backup and Versioning&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;S3 automatically versions your state files. Accidentally destroyed production? Roll back to the previous state version.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Security and Compliance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;State files often contain sensitive information. Remote backend with proper IAM policies ensures only authorized team members can access it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;CI/CD Integration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your deployment pipelines can access the state without needing to store it in your code repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Remote Backend (Step by Step)
&lt;/h2&gt;

&lt;p&gt;Let's build this together! I'll show you exactly how to set up a remote backend with AWS S3 and DynamoDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create the Backend Infrastructure
&lt;/h3&gt;

&lt;p&gt;First, we need to create the S3 bucket and DynamoDB table that will store our state:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;backend-setup/resource.tf&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  S3 bucket for storing state files
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_s3_bucket" "terraform_state" {
  bucket = "your-company-terraform-state-bucket"

  tags = {
    Name        = "Terraform State Bucket"
    Environment = "Production"
    Purpose     = "Infrastructure State Management"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Enable versioning for state file backup
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_s3_bucket_versioning" "terraform_state_versioning" {
  bucket = aws_s3_bucket.terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Encrypt the state files
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_s3_bucket_server_side_encryption_configuration" 
"terraform_state_encryption" {
  bucket = aws_s3_bucket.terraform_state.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  DynamoDB table for state locking
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_dynamodb_table" "terraform_state_lock" {
  name           = "terraform-state-lock"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }

  tags = {
    Name = "Terraform State Lock Table"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;backend-setup/provider.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1"&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;File: &lt;code&gt;backend-setup/terraform.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.0"&lt;/span&gt;

  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="p"&gt;=&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;"hashicorp/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;"~&amp;gt; 5.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this setup first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend-setup/
terraform init
terraform plan
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Your Project to Use Remote Backend
&lt;/h3&gt;

&lt;p&gt;Now, for any Terraform project, add this backend configuration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File: &lt;code&gt;your-project/terraform.tf&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.0"&lt;/span&gt;

  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="p"&gt;=&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;"hashicorp/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;"~&amp;gt; 5.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# Here's the magic!&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;"your-company-terraform-state-bucket"&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;"projects/my-awesome-project/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;"us-east-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-state-lock"&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;h3&gt;
  
  
  Step 3: Initialize and Migrate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project/
terraform init

&lt;span class="c"&gt;# If you have existing local state, Terraform will ask:&lt;/span&gt;
&lt;span class="c"&gt;# "Do you want to copy existing state to the new backend?"&lt;/span&gt;
&lt;span class="c"&gt;# Answer: yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro Tips for Production Use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Organize Your State Files&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use meaningful key paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Good&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"environments/production/vpc/terraform.tfstate"&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"environments/staging/databases/terraform.tfstate"&lt;/span&gt;

&lt;span class="c1"&gt;# Bad&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform.tfstate"&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"stuff.tfstate"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Use Different Buckets for Different Environments&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Production&lt;/span&gt;
&lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"company-terraform-prod-state"&lt;/span&gt;

&lt;span class="c1"&gt;# Staging&lt;/span&gt;
&lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"company-terraform-staging-state"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Set Up Proper IAM Permissions&lt;/strong&gt;
&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;"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;"s3:ListBucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:PutObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:DeleteObject"&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="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::your-terraform-state-bucket"&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:s3:::your-terraform-state-bucket/*"&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;"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;"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;"dynamodb:GetItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"dynamodb:PutItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"dynamodb:DeleteItem"&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;"arn:aws:dynamodb:*:*:table/terraform-state-lock"&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;h2&gt;
  
  
  Common Gotchas and How to Avoid Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;The Bootstrap Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can't use remote backend to create the remote backend! Create the S3 bucket and DynamoDB table first with local state, then migrate other projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;State File Naming Conflicts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Always use unique &lt;code&gt;key&lt;/code&gt; values for different projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This will cause conflicts if multiple projects use it&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform.tfstate"&lt;/span&gt;  

&lt;span class="c1"&gt;# This is unique and descriptive&lt;/span&gt;
&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"projects/web-app/production/terraform.tfstate"&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Lock File Stuck&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If Terraform crashes, the lock might remain. Force unlock with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform force-unlock LOCK_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Success Story
&lt;/h2&gt;

&lt;p&gt;Here's how a 50-person engineering team I worked with transformed their infrastructure management:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Remote Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; 3 production outages due to state conflicts&lt;/li&gt;
&lt;li&gt; 2 hours average time to resolve state issues&lt;/li&gt;
&lt;li&gt; State files shared via Slack/email&lt;/li&gt;
&lt;li&gt; One developer accidentally destroyed staging DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After Remote Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Zero state-related outages in 6 months&lt;/li&gt;
&lt;li&gt; 5 minutes to onboard new team members&lt;/li&gt;
&lt;li&gt; Seamless collaboration across teams&lt;/li&gt;
&lt;li&gt; Audit trail of all infrastructure changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create S3 bucket for state storage&lt;/li&gt;
&lt;li&gt;[ ] Set up DynamoDB table for locking&lt;/li&gt;
&lt;li&gt;[ ] Enable S3 versioning and encryption&lt;/li&gt;
&lt;li&gt;[ ] Configure IAM permissions&lt;/li&gt;
&lt;li&gt;[ ] Update terraform.tf with backend config&lt;/li&gt;
&lt;li&gt;[ ] Run &lt;code&gt;terraform init&lt;/code&gt; to migrate&lt;/li&gt;
&lt;li&gt;[ ] Test with team members&lt;/li&gt;
&lt;li&gt;[ ] Document the setup for your team&lt;/li&gt;
&lt;li&gt;[ ] Set up monitoring and alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Once you have remote backend set up, consider these advanced topics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terraform Workspaces&lt;/strong&gt; for environment management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote state data sources&lt;/strong&gt; for cross-project dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform Cloud/Enterprise&lt;/strong&gt; for advanced features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State file encryption&lt;/strong&gt; with customer-managed keys&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remote backend is essential for any team using Terraform&lt;/li&gt;
&lt;li&gt;It prevents state conflicts and enables collaboration&lt;/li&gt;
&lt;li&gt;S3 + DynamoDB is a solid, cost-effective solution&lt;/li&gt;
&lt;li&gt;Set it up once, enjoy peace of mind forever&lt;/li&gt;
&lt;li&gt;Your future self (and teammates) will thank you&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Learn more about terraform with practical knowledge check out &lt;a href="https://github.com/deepanshub9/terraform_practice/tree/main/remote_backend" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;Setting up remote backend might seem like extra work initially, but it's an investment that pays dividends. Think of it as infrastructure insurance - you hope you never need it, but you'll be incredibly grateful when you do.&lt;/p&gt;

&lt;p&gt;Have you implemented remote backend in your organization? What challenges did you face? Share your experiences in the comments below!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #terraform #aws #devops #infrastructure #backend #s3 #dynamodb #iac&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this helpful? Give it a ❤️ and follow me for more practical DevOps content!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Got questions? Drop them in the comments - I read and respond to every one!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
