<?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: Ntseze-Nelvis</title>
    <description>The latest articles on DEV Community by Ntseze-Nelvis (@ntsezenelvis).</description>
    <link>https://dev.to/ntsezenelvis</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%2F3400058%2Fd85e01f4-f315-46df-8bd1-b70e49614840.jpg</url>
      <title>DEV Community: Ntseze-Nelvis</title>
      <link>https://dev.to/ntsezenelvis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ntsezenelvis"/>
    <language>en</language>
    <item>
      <title>Production-Grade 3-Tier Image Processing Platform</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Fri, 03 Apr 2026 11:38:52 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/production-grade-3-tier-image-processing-platform-5d32</link>
      <guid>https://dev.to/ntsezenelvis/production-grade-3-tier-image-processing-platform-5d32</guid>
      <description>&lt;p&gt;==========================================================================&lt;/p&gt;

&lt;h2&gt;
  
  
  HSBC-gamma:Production-Grade 3-Tier Image Processing Platform
&lt;/h2&gt;

&lt;p&gt;A secure, scalable, and highly available image processing platform built on AWS with Terraform&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 Overview
&lt;/h2&gt;

&lt;p&gt;This project implements a &lt;strong&gt;production-grade 3-tier image processing platform&lt;/strong&gt; on AWS using Infrastructure as Code (IaC) with Terraform. Users can upload images through a web interface, which are then automatically processed (resized into multiple versions) and stored securely in encrypted S3 buckets.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;53 Terraform resources&lt;/strong&gt; deployed in AWS&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Multi-AZ high availability&lt;/strong&gt; across eu-north-1a and eu-north-1b&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Auto-scaling&lt;/strong&gt; (1-3 instances per tier based on CPU utilization)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;KMS encryption&lt;/strong&gt; for all S3 data at rest&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Least privilege IAM&lt;/strong&gt; with instance profiles (no access keys on EC2)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Path-based routing&lt;/strong&gt; with Application Load Balancer&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Complete observability&lt;/strong&gt; with CloudWatch logs and alarms&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Self-healing architecture&lt;/strong&gt; with health checks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📂 Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;C:.
│   .gitignore
│   .gitlab-ci.yml
│   .terraform.lock.hcl
│   complete-configuration.txt
│   elbv2 describe-target-groups _
│   elbv2 describe-target-groups 
│   main.tf
│   outputs.tf
│   print_project.sh
│   project_tracker.sh
│   providers.tf
│   README.md
│   terraform.tfstate
│   terraform.tfstate.backup
│   terraform.tfvars
│   variables.tf
│
├───.terraform
│   ├───modules
│   │       modules.json
│   │
│   └───providers
│       └───registry.terraform.io
│           └───hashicorp
│               └───aws
│                   └───6.31.0
│                       └───windows_amd64
│                               LICENSE.txt
│                               terraform-provider-aws_v6.31.0_x5.exe
│
└───modules
    ├───alb
    │       main.tf
    │       outputs.tf
    │       variables.tf
    │
    ├───app
    │       asg.tf
    │       launch_template.tf
    │       outputs.tf
    │       user_data.sh
    │       variables.tf
    │
    ├───monitoring
    │       alarms.tf
    │       cloudwatch.tf
    │       logs.tf
    │       user_data.sh
    │       variables.tf
    │
    ├───s3
    │       buckets.tf
    │       kms.tf
    │       lifecycle.tf
    │       outputs.tf
    │       test-upload.html
    │       variables.tf
    │
    ├───security
    │       iam.tf
    │       outputs.tf
    │       sg.tf
    │       variables.tf
    │
    ├───vpc
    │       main.tf
    │       outputs.tf
    │       variables.tf
    │
    └───web
            asg.tf
            launch_template.tf
            output.tf
            user_data.sh
            variables.tf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Module Resource Count
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Resources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vpc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network infrastructure&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security controls&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;s3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Storage layer&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;alb&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Load balancing&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend tier&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;app&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backend tier&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;7&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;/td&gt;
&lt;td&gt;&lt;strong&gt;53&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Architecture Diagram
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HSBC-Gamma-Achitectural-Diagram&lt;/strong&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%2Fx58fm2445guz7xfvvu44.jpg" 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%2Fx58fm2445guz7xfvvu44.jpg" alt="HSBC-Gamma-Achitectural-Diagram" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&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;# AWS CLI installed and configured&lt;/span&gt;
aws configure
&lt;span class="c"&gt;# Enter your credentials and region: eu-north-1&lt;/span&gt;

&lt;span class="c"&gt;# Terraform v1.0+ installed&lt;/span&gt;
terraform &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/Ntseze-Nelvis/hsbc-gamma-3tier-image-platform.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hsbc-gamma-3tier-image-platform-main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Deploy Infrastructure
&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;# Initialize Terraform&lt;/span&gt;
terraform init

&lt;span class="c"&gt;# Format and validate configuration&lt;/span&gt;
terraform &lt;span class="nb"&gt;fmt&lt;/span&gt; &lt;span class="nt"&gt;-recursive&lt;/span&gt;
terraform validate

&lt;span class="c"&gt;# Review what will be created&lt;/span&gt;
terraform plan
&lt;span class="k"&gt;**&lt;/span&gt;Terraform plan&lt;span class="k"&gt;**&lt;/span&gt;
&lt;span class="o"&gt;![&lt;/span&gt;Terraform-plan]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w6g8px681qz6oe41w8gs.jpg&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Deploy infrastructure&lt;/span&gt;
terraform apply &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;

&lt;span class="c"&gt;## View outputs&lt;/span&gt;
terraform output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Expected Outputs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alb_dns_name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hsbc-gamma-dev-alb-50807543.eu-north-1.elb.amazonaws.com"&lt;/span&gt;
app_asg_name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-asg"&lt;/span&gt;
kms_key_arn &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:kms:eu-north-1:211125430491:key/bb2beb00-4920-44e4-8ea6-6fb2a554b0e8"&lt;/span&gt;
processed_bucket_arn &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:s3:::hsbc-gamma-dev-processed-images"&lt;/span&gt;
raw_bucket_arn &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:s3:::hsbc-gamma-dev-raw-images"&lt;/span&gt;
web_asg_name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web-asg"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terraform apply&lt;/strong&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%2Ft024t4f6xqbmzky8cf4h.jpg" 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%2Ft024t4f6xqbmzky8cf4h.jpg" alt="Terraform-apply" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;







&lt;h2&gt;
  
  
  Test Your Application
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Open your browser and navigate to:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://hsbc-gamma-dev-alb-50807543.eu-north-1.elb.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload and Process an Image&lt;br&gt;
Click "Choose Image" or drag &amp;amp; drop an image&lt;/p&gt;

&lt;p&gt;Wait 5-10 seconds for processing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HSBC-Gamma-Web-App&lt;/strong&gt;&lt;/p&gt;

&lt;h2&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%2Fjssl7i2t7tggbre0vagv.jpg" alt="HSBC-Gamma-Web-App" width="800" height="485"&gt;
&lt;/h2&gt;




&lt;h2&gt;
  
  
  Verify Processing
&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;## Check raw bucket&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://hsbc-gamma-dev-raw-images/

&lt;span class="c"&gt;## Check processed bucket&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://hsbc-gamma-dev-processed-images/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Expected output shows:&lt;/li&gt;
&lt;li&gt;thumbnail-uuid.jpg&lt;/li&gt;
&lt;li&gt;small-uuid.jpg&lt;/li&gt;
&lt;li&gt;medium-uuid.jpg&lt;/li&gt;
&lt;li&gt;large-uuid.jpg&lt;/li&gt;
&lt;/ul&gt;







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

&lt;h3&gt;
  
  
  View CloudWatch Logs
&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;# App tier logs (Flask API)&lt;/span&gt;
aws logs &lt;span class="nb"&gt;tail&lt;/span&gt; /hsbc-gamma/app &lt;span class="nt"&gt;--since&lt;/span&gt; 1h &lt;span class="nt"&gt;--follow&lt;/span&gt;

&lt;span class="c"&gt;# Web tier logs (Apache)&lt;/span&gt;
aws logs &lt;span class="nb"&gt;tail&lt;/span&gt; /hsbc-gamma/web &lt;span class="nt"&gt;--since&lt;/span&gt; 1h &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Check Auto Scaling Status
&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;# Web tier instances&lt;/span&gt;
aws autoscaling describe-auto-scaling-groups &lt;span class="nt"&gt;--auto-scaling-group-names&lt;/span&gt; web-asg

&lt;span class="c"&gt;## App tier instances&lt;/span&gt;
aws autoscaling describe-auto-scaling-groups &lt;span class="nt"&gt;--auto-scaling-group-names&lt;/span&gt; app-asg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Monitor ALB Health
&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;# Check target group health&lt;/span&gt;
aws elbv2 describe-target-health &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-group-arn&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws elbv2 describe-target-groups &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb-web-tg &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'TargetGroups[0].TargetGroupArn'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="sb"&gt;```&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;## Security Validation&lt;/span&gt;
&lt;span class="c"&gt;## Verify S3 Encryption&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="sb"&gt;```&lt;/span&gt;bash
aws s3api get-bucket-encryption &lt;span class="nt"&gt;--bucket&lt;/span&gt; hsbc-gamma-dev-raw-images
&lt;span class="c"&gt;# Expected: KMS encryption enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Verify Public Access Block
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3api get-public-access-block &lt;span class="nt"&gt;--bucket&lt;/span&gt; hsbc-gamma-dev-raw-images
&lt;span class="c"&gt;# Expected: All blocks enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify Security Groups
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 describe-security-groups &lt;span class="nt"&gt;--group-names&lt;/span&gt; hsbc-gamma-dev-web-sg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'SecurityGroups[0].IpPermissions'&lt;/span&gt;
&lt;span class="c"&gt;# Expected: Only port 80 from ALB security group&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h2&gt;
  
  
  Sample Calculation (2 instances each tier)
&lt;/h2&gt;

&lt;p&gt;EC2:     4 × $8.76  = $35.04&lt;br&gt;
ALB:     $0.0225/h × 730h = $16.43&lt;br&gt;
NAT:     $0.045/h × 730h = $32.85&lt;br&gt;
S3:      Estimated = $8.00&lt;br&gt;
KMS:     $1.00 + operations = $1.50&lt;br&gt;
CW:      Logs + metrics = $4.00&lt;br&gt;
Data:    Estimated = $15.00&lt;br&gt;
─────────────────────────────────&lt;br&gt;
Total:   $112.82/month&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Issue 1: Can't Access Web UI
&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;# Check ALB DNS&lt;/span&gt;
terraform output alb_dns_name

&lt;span class="c"&gt;## Verify ALB is active&lt;/span&gt;
aws elbv2 describe-load-balancers &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'LoadBalancers[0].State.Code'&lt;/span&gt;

&lt;span class="c"&gt;## Test ALB endpoint&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://&lt;span class="si"&gt;$(&lt;/span&gt;terraform output &lt;span class="nt"&gt;-raw&lt;/span&gt; alb_dns_name&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;p&gt;&lt;strong&gt;Verify ALB is in active state&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Ensure security group allows port 80 from 0.0.0.0/0&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Check that web tier instances are healthy&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue 2: Image Upload Fails
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Symptoms: Upload returns server error, image not processed
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Diagnostic 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;# Check app tier logs for errors&lt;/span&gt;
aws logs &lt;span class="nb"&gt;tail&lt;/span&gt; /hsbc-gamma/app &lt;span class="nt"&gt;--since&lt;/span&gt; 30m &lt;span class="nt"&gt;--filter-pattern&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;

&lt;span class="c"&gt;# Verify target group health&lt;/span&gt;
aws elbv2 describe-target-health &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-group-arn&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws elbv2 describe-target-groups &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb-app-tg &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'TargetGroups[0].TargetGroupArn'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;#Diagnostic Commands:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Restart Flask app on app tier instances&lt;/li&gt;
&lt;li&gt;Verify IAM role has S3 permissions&lt;/li&gt;
&lt;li&gt;Check S3 bucket policies allow app role 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="c"&gt;# Issue 3: Instances Not Launching&lt;/span&gt;
&lt;span class="c"&gt;#Symptoms: Auto Scaling group shows 0 instances or desired capacity not met&lt;/span&gt;
&lt;span class="c"&gt;#Diagnostic Commands:&lt;/span&gt;

&lt;span class="c"&gt;## Check ASG status&lt;/span&gt;
aws autoscaling describe-auto-scaling-groups &lt;span class="nt"&gt;--auto-scaling-group-names&lt;/span&gt; web-asg

&lt;span class="c"&gt;## View scaling activities&lt;/span&gt;
aws autoscaling describe-scaling-activities &lt;span class="nt"&gt;--auto-scaling-group-name&lt;/span&gt; web-asg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h1&gt;
  
  
  Clean UpClean Up
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Destroy all infrastructure&lt;/span&gt;
terraform destroy &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;

&lt;span class="c"&gt;# Verify resources are deleted&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;hsbc-gamma-dev
aws ec2 describe-instances &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="s2"&gt;"Name=tag:Name,Values=*hsbc*"&lt;/span&gt;
aws elbv2 describe-load-balancers &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb
aws autoscaling describe-auto-scaling-groups &lt;span class="nt"&gt;--auto-scaling-group-names&lt;/span&gt; web-asg app-asg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resources &amp;amp; Documentation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terraform AWS Provider&lt;/td&gt;
&lt;td&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/aws" rel="noopener noreferrer"&gt;registry.terraform.io/providers/hashicorp/aws&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS 3-Tier Architecture&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/architecture/3-tier" rel="noopener noreferrer"&gt;aws.amazon.com/architecture/3-tier&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM Instance Profiles&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html" rel="noopener noreferrer"&gt;docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flask Documentation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://flask.palletsprojects.com" rel="noopener noreferrer"&gt;flask.palletsprojects.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pillow Documentation&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pillow.readthedocs.io" rel="noopener noreferrer"&gt;pillow.readthedocs.io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto Scaling Groups&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/" rel="noopener noreferrer"&gt;docs.aws.amazon.com/autoscaling/ec2/userguide/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Load Balancer&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/" rel="noopener noreferrer"&gt;docs.aws.amazon.com/elasticloadbalancing/latest/application/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  Terraform Operations
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init                                      &lt;span class="c"&gt;# Initialize&lt;/span&gt;
terraform validate                                  &lt;span class="c"&gt;# Validate config&lt;/span&gt;
terraform plan                                      &lt;span class="c"&gt;# Preview changes&lt;/span&gt;
terraform apply &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;                       &lt;span class="c"&gt;# Deploy&lt;/span&gt;
terraform destroy &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;                     &lt;span class="c"&gt;# Destroy all&lt;/span&gt;
terraform output                                    &lt;span class="c"&gt;# View outputs&lt;/span&gt;
terraform output &lt;span class="nt"&gt;-raw&lt;/span&gt; alb_dns_name                  &lt;span class="c"&gt;# Get specific output&lt;/span&gt;
terraform state list                                &lt;span class="c"&gt;# List resources&lt;/span&gt;
terraform state show aws_instance.example          &lt;span class="c"&gt;# Show resource details&lt;/span&gt;
terraform graph | dot &lt;span class="nt"&gt;-Tpng&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; graph.png            &lt;span class="c"&gt;# Generate graph&lt;/span&gt;

&lt;span class="c"&gt;# State Management&lt;/span&gt;
terraform state &lt;span class="nb"&gt;mv &lt;/span&gt;aws_instance.old aws_instance.new &lt;span class="c"&gt;# Move resource&lt;/span&gt;
terraform state &lt;span class="nb"&gt;rm &lt;/span&gt;aws_instance.to_remove           &lt;span class="c"&gt;# Remove from state&lt;/span&gt;
terraform import aws_instance.example i-12345678    &lt;span class="c"&gt;# Import resource&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  AWS CLI Commands
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Account &amp;amp; Identity&lt;/span&gt;
aws sts get-caller-identity                        &lt;span class="c"&gt;# Verify account&lt;/span&gt;

&lt;span class="c"&gt;# EC2 &amp;amp; Compute&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="s2"&gt;"Name=tag:Name,Values=*hsbc*"&lt;/span&gt;

&lt;span class="c"&gt;# Auto Scaling&lt;/span&gt;
aws autoscaling describe-auto-scaling-groups &lt;span class="nt"&gt;--auto-scaling-group-names&lt;/span&gt; web-asg
aws autoscaling describe-scaling-activities &lt;span class="nt"&gt;--auto-scaling-group-name&lt;/span&gt; web-asg

&lt;span class="c"&gt;# Load Balancer&lt;/span&gt;
aws elbv2 describe-load-balancers &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb
aws elbv2 describe-target-groups &lt;span class="nt"&gt;--names&lt;/span&gt; hsbc-gamma-dev-alb-web-tg

&lt;span class="c"&gt;# S3 Storage&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://hsbc-gamma-dev-raw-images/ &lt;span class="nt"&gt;--recursive&lt;/span&gt; &lt;span class="nt"&gt;--summarize&lt;/span&gt;
aws s3api get-bucket-encryption &lt;span class="nt"&gt;--bucket&lt;/span&gt; hsbc-gamma-dev-raw-images

&lt;span class="c"&gt;# CloudWatch&lt;/span&gt;
aws logs &lt;span class="nb"&gt;tail&lt;/span&gt; /hsbc-gamma/app &lt;span class="nt"&gt;--since&lt;/span&gt; 1h &lt;span class="nt"&gt;--follow&lt;/span&gt;
aws logs filter-log-events &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; /hsbc-gamma/app &lt;span class="nt"&gt;--filter-pattern&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Monitoring &amp;amp; Debugging
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Real-time monitoring&lt;/span&gt;
watch &lt;span class="nt"&gt;-n&lt;/span&gt; 5 &lt;span class="s1"&gt;'aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names web-asg --query "AutoScalingGroups[0].Instances[*].LifecycleState"'&lt;/span&gt;

&lt;span class="c"&gt;# Check ASG instances health&lt;/span&gt;
watch &lt;span class="nt"&gt;-n&lt;/span&gt; 10 &lt;span class="s1"&gt;'aws elbv2 describe-target-health --target-group-arn $(aws elbv2 describe-target-groups --names hsbc-gamma-dev-alb-web-tg --query "TargetGroups[0].TargetGroupArn" --output text)'&lt;/span&gt;

&lt;span class="c"&gt;# Network connectivity test&lt;/span&gt;
curl &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"Connect: %{time_connect}s TTFB: %{time_starttransfer}s Total: %{time_total}s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-s&lt;/span&gt; http://&lt;span class="si"&gt;$(&lt;/span&gt;terraform output &lt;span class="nt"&gt;-raw&lt;/span&gt; alb_dns_name&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









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

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

&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Owner : NTSEZE VOUFFO NELVIS&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Role Responsibilities
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Responsibilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Solutions Architect&lt;/td&gt;
&lt;td&gt;Architecture design, security compliance, system diagrams, trade-off analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud/DevOps Engineer&lt;/td&gt;
&lt;td&gt;Infrastructure automation, CI/CD, deployment, monitoring setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>cloud</category>
      <category>python</category>
      <category>security</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Designing a Production-Grade Multi-AZ Web Architecture on AWS Using ALB, EC2, and Auto Scaling</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Thu, 15 Jan 2026 16:06:04 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/designing-a-production-grade-multi-az-web-architecture-on-aws-using-alb-ec2-and-auto-scaling-1531</link>
      <guid>https://dev.to/ntsezenelvis/designing-a-production-grade-multi-az-web-architecture-on-aws-using-alb-ec2-and-auto-scaling-1531</guid>
      <description>&lt;h2&gt;
  
  
  Executive Summary
&lt;/h2&gt;

&lt;p&gt;In this project, we design and deploy a &lt;strong&gt;highly available, fault-tolerant, and scalable web application architecture&lt;/strong&gt; on AWS using an &lt;strong&gt;Application Load Balancer integrated with an existing Auto Scaling Group across multiple Availability Zones&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This architecture reflects real production systems used by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Banking platforms
&lt;/li&gt;
&lt;li&gt;E-commerce websites
&lt;/li&gt;
&lt;li&gt;SaaS products
&lt;/li&gt;
&lt;li&gt;Enterprise web backends
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re preparing for &lt;strong&gt;AWS certifications, DevOps interviews, or real production work&lt;/strong&gt;, this project checks all the boxes.&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%2Fw6kq5by7lz6peg7xrqvj.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%2Fw6kq5by7lz6peg7xrqvj.png" alt="LOAD BALANCER DIAGRAM" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Objective (Interview-Ready Framing)
&lt;/h2&gt;

&lt;p&gt;Design and deploy a &lt;strong&gt;production-grade web architecture&lt;/strong&gt; that automatically handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic spikes
&lt;/li&gt;
&lt;li&gt;Instance failures
&lt;/li&gt;
&lt;li&gt;Availability Zone outages
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— &lt;strong&gt;without downtime&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%2F9a26z9u5rinhb0hz53ve.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%2F9a26z9u5rinhb0hz53ve.png" alt="Imption" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We achieve this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributing traffic using an &lt;strong&gt;Application Load Balancer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Running EC2 instances across &lt;strong&gt;multiple AZs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Integrating an existing &lt;strong&gt;Auto Scaling Group&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enforcing &lt;strong&gt;security best practices&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Validating &lt;strong&gt;real-world failure scenarios&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VPC with:

&lt;ul&gt;
&lt;li&gt;At least &lt;strong&gt;2 public subnets&lt;/strong&gt; in different AZs
&lt;/li&gt;
&lt;li&gt;Internet Gateway
&lt;/li&gt;
&lt;li&gt;Route table: &lt;code&gt;0.0.0.0/0 → IGW&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compute &amp;amp; Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Existing Auto Scaling Group: &lt;strong&gt;hsbc-asg&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;EC2 Key Pair (for SSH)&lt;/li&gt;
&lt;li&gt;IAM permissions for:

&lt;ul&gt;
&lt;li&gt;EC2
&lt;/li&gt;
&lt;li&gt;Load Balancers
&lt;/li&gt;
&lt;li&gt;Target Groups
&lt;/li&gt;
&lt;li&gt;Auto Scaling
&lt;/li&gt;
&lt;li&gt;Security Groups
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Section 1 — Security Groups (Foundation of Security)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 EC2 Security Group — &lt;code&gt;sg_web-servers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Control backend server access.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Inbound Rules&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&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%2Fvs106pgxtxwdcyp9qmgu.png" alt="EC2 Security Group" width="800" height="262"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdya1cdj84435bixsrgs4.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%2Fdya1cdj84435bixsrgs4.png" alt="Security Groups" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;0.0.0.0/0 &lt;em&gt;(temporary)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;My IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
   &lt;em&gt;Intentional design:&lt;/em&gt; Public HTTP is allowed initially for validation, then hardened later — a &lt;strong&gt;classic interview scenario&lt;/strong&gt;.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0khsr2j4af5hg50433fy.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%2F0khsr2j4af5hg50433fy.png" alt="Imagtre" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1.2 Load Balancer Security Group — &lt;code&gt;sg_alb&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Allow public web traffic to ALB only.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;0.0.0.0/0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2F7c4dtrgxaay5bik6e5he.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%2F7c4dtrgxaay5bik6e5he.png" alt="sg-alb" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flq474gfy4u3uhb0y0j85.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%2Flq474gfy4u3uhb0y0j85.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sections 2 &amp;amp; 3 — Launch EC2 Web Servers (Multi-AZ)
&lt;/h2&gt;

&lt;p&gt;To demonstrate &lt;strong&gt;high availability and fault tolerance&lt;/strong&gt;, deploy &lt;strong&gt;two EC2 instances in different Availability Zones (AZs)&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The steps below show how to launch &lt;strong&gt;one instance&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;Repeat the same steps for the second instance&lt;/strong&gt;, selecting a different AZ and user data script.&lt;/p&gt;


&lt;h2&gt;
  
  
  Launch EC2 Instance (Repeat for Second AZ)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Launch a New EC2 Instance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;AWS Console → EC2 → Instances&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Launch Instance&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fij4dpfo5d3insukmu3ze.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%2Fij4dpfo5d3insukmu3ze.png" alt="Imageec2" width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Configure Instance Basics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;hsbc-server1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AMI:&lt;/strong&gt; Amazon Linux 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instance Type:&lt;/strong&gt; &lt;code&gt;t2.micro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Pair:&lt;/strong&gt; Select an existing key pair&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%2F8n3xsoddgffxiaa93nsp.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%2F8n3xsoddgffxiaa93nsp.png" alt="Imafrjr" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Network Configuration (Critical)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC:&lt;/strong&gt; Select your existing VPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnet:&lt;/strong&gt; Public subnet in &lt;strong&gt;AZ-A&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-assign Public IP:&lt;/strong&gt; Enabled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Group:&lt;/strong&gt; &lt;code&gt;sg_web-servers&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%2Fnz8kr3x4k4zh4s46r601.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%2Fnz8kr3x4k4zh4s46r601.png" alt="Imagfgsw" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc67wl8l0ewywie1pog2.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%2Fkc67wl8l0ewywie1pog2.png" alt="Imauytg" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the second instance, choose a &lt;strong&gt;public subnet in a different AZ (AZ-B)&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Configure Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Leave default settings (8 GB gp3)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Advanced Settings — User Data
&lt;/h3&gt;

&lt;p&gt;Paste the following &lt;strong&gt;User Data&lt;/strong&gt; script:&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;#!/bin/bash&lt;/span&gt;
yum update &lt;span class="nt"&gt;-y&lt;/span&gt;
yum &lt;span class="nb"&gt;install &lt;/span&gt;httpd git &lt;span class="nt"&gt;-y&lt;/span&gt;
git clone https://github.com/Ntseze-Nelvis/CloudReality-ecommerce-web-app.git
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; CloudReality-ecommerce-web-app/server1/&lt;span class="k"&gt;*&lt;/span&gt; /var/www/html/
systemctl start httpd
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;httpd

&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%2F6k6ivcwj8osija2bvumz.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%2F6k6ivcwj8osija2bvumz.png" alt="Imadfgh" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Instance B — &lt;code&gt;hsbc-server2&lt;/code&gt; (AZ-B)
&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;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
yum update &lt;span class="nt"&gt;-y&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; httpd git
&lt;span class="nb"&gt;cd&lt;/span&gt; /home/ec2-user
git clone https://github.com/Ntseze-Nelvis/CloudReality-ecommerce-web-app.git
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"CloudReality-ecommerce-web-app/server2"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: server2 directory not found"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/www/html/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; CloudReality-ecommerce-web-app/server2/&lt;span class="k"&gt;*&lt;/span&gt; /var/www/html/

&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; apache:apache /var/www/html

systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; httpd


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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Section 4 — Backend Validation (Before ALB)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;p&gt;Always validate components &lt;strong&gt;before adding complexity&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Access each EC2 via public IP (http://)&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%2Fxznxrqazx6b7uwtvo4cd.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%2Fxznxrqazx6b7uwtvo4cd.png" alt="Imon" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm content loads correctly
&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%2Fy94knwjiwf5itqkd4x6b.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%2Fy94knwjiwf5itqkd4x6b.png" alt="Imageon" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure HTTP service is running
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ Isolates issues early&lt;br&gt;&lt;br&gt;
✔ Follows production troubleshooting best practices  &lt;/p&gt;


&lt;h2&gt;
  
  
  Section 5 — Target Group (ALB → EC2 / ASG)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Target Group Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;tg-hsbc-web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol:&lt;/strong&gt; HTTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port:&lt;/strong&gt; 80&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health check path:&lt;/strong&gt; &lt;code&gt;/&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%2Fe1j9w1vca9ob2o2dsqkc.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%2Fe1j9w1vca9ob2o2dsqkc.png" alt="Imageiption" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Register targets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hsbc-server1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hsbc-server2&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%2F97pfpznanpp1zpg54x9r.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%2F97pfpznanpp1zpg54x9r.png" alt="Imagscription" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait until both show &lt;strong&gt;Healthy&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%2Fgv7uh8xi6i55j3c0z89j.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%2Fgv7uh8xi6i55j3c0z89j.png" alt="Imcription" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Section 6 — Application Load Balancer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fclvq81w3tld5a60aq78i.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%2Fclvq81w3tld5a60aq78i.png" alt="create alb" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ALB Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;hsbc-alb-web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheme:&lt;/strong&gt; Internet-facing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets:&lt;/strong&gt; 2 public AZs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Group:&lt;/strong&gt; &lt;code&gt;sg-alb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listener:&lt;/strong&gt; HTTP :80&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; Forward to &lt;code&gt;tg-hsbc-web&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%2F10vuex2l99xelbnqd60d.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%2F10vuex2l99xelbnqd60d.png" alt="Imagption" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Section 7 — Load Balancing Test
&lt;/h2&gt;

&lt;p&gt;Visit the ALB DNS name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://hsbc-alb-web-xxxx.elb.amazonaws.com
&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%2Fwbgf8elxiy1utlk2kufh.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%2Fwbgf8elxiy1utlk2kufh.png" alt="Imagscription" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Balancing Validation
&lt;/h3&gt;

&lt;p&gt;Refresh the ALB endpoint multiple times:&lt;/p&gt;

&lt;p&gt;✔ Confirms &lt;strong&gt;round-robin traffic distribution&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✔ Confirms &lt;strong&gt;ALB health checks&lt;/strong&gt; are functioning correctly  &lt;/p&gt;


&lt;h2&gt;
  
  
  Section 8 — Attach Existing Auto Scaling Group
&lt;/h2&gt;

&lt;p&gt;Attach &lt;strong&gt;&lt;code&gt;hsbc-asg&lt;/code&gt;&lt;/strong&gt; to the Application Load Balancer:&lt;/p&gt;
&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Auto Scaling Group → Load Balancing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Attach to an &lt;strong&gt;existing target group&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;&lt;code&gt;tg-hsbc-web&lt;/code&gt;&lt;/strong&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%2Fv6y7ci5djkgix182t8nu.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%2Fv6y7ci5djkgix182t8nu.png" alt="Imagcription" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✔ New instances automatically register with the ALB&lt;br&gt;&lt;br&gt;
✔ Zero manual intervention required  &lt;/p&gt;


&lt;h2&gt;
  
  
  Section 9 — Real-World Failure Scenarios (Interview Ready)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Test 1 — Instance Failure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manually terminate an EC2 instance
&lt;/li&gt;
&lt;li&gt;Auto Scaling Group launches a replacement
&lt;/li&gt;
&lt;li&gt;ALB reroutes traffic automatically
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Test 2 — Load Spike
&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;sudo &lt;/span&gt;stress &lt;span class="nt"&gt;--cpu&lt;/span&gt; 4 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✔ ASG scales out automatically&lt;br&gt;&lt;br&gt;
✔ ALB distributes increased traffic  &lt;/p&gt;


&lt;h3&gt;
  
  
  Test 3 — Application Failure
&lt;/h3&gt;

&lt;p&gt;Stop the web service on an instance:&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;sudo &lt;/span&gt;systemctl stop httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ ALB marks the instance as &lt;strong&gt;unhealthy&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✔ ASG replaces the instance &lt;strong&gt;automatically&lt;/strong&gt; (if configured)  &lt;/p&gt;




&lt;h2&gt;
  
  
  Section 10 — Security Hardening (Production Must)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (Insecure)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;EC2 instances allowed HTTP access from &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After (Correct)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Remove public HTTP rule from the EC2 Security Group
&lt;/li&gt;
&lt;li&gt;Allow HTTP &lt;strong&gt;only from &lt;code&gt;sg-alb&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ EC2 instances are now private&lt;br&gt;&lt;br&gt;
✔ ALB is the single entry point&lt;br&gt;&lt;br&gt;
✔ Highly tested AWS exam &amp;amp; interview concept  &lt;/p&gt;




&lt;h2&gt;
  
  
  Section 11 — Cleanup (Cost Control)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Delete the Application Load Balancer
&lt;/li&gt;
&lt;li&gt;Delete the Target Group
&lt;/li&gt;
&lt;li&gt;Restore ASG desired capacity
&lt;/li&gt;
&lt;li&gt;Terminate test EC2 instances
&lt;/li&gt;
&lt;li&gt;Remove unused Security Groups and volumes
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Certification &amp;amp; Interview Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Exam Topics Covered
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;High Availability
&lt;/li&gt;
&lt;li&gt;Elastic Load Balancing
&lt;/li&gt;
&lt;li&gt;Auto Scaling
&lt;/li&gt;
&lt;li&gt;Health Checks
&lt;/li&gt;
&lt;li&gt;Security Groups
&lt;/li&gt;
&lt;li&gt;Fault Tolerance
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Architecture Matters (Interview Gold)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Production Problems
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single EC2 failure&lt;/td&gt;
&lt;td&gt;Application downtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic spikes&lt;/td&gt;
&lt;td&gt;Performance degradation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual scaling&lt;/td&gt;
&lt;td&gt;Slow &amp;amp; error-prone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public EC2 exposure&lt;/td&gt;
&lt;td&gt;Security risks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Solution Implemented
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-AZ EC2 deployment
&lt;/li&gt;
&lt;li&gt;Application Load Balancer
&lt;/li&gt;
&lt;li&gt;Auto Scaling Group integration
&lt;/li&gt;
&lt;li&gt;Health checks &amp;amp; self-healing
&lt;/li&gt;
&lt;li&gt;ALB → EC2 security isolation
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the &lt;strong&gt;default architecture AWS expects&lt;/strong&gt; in real environments.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;✔ Highly available&lt;br&gt;&lt;br&gt;
✔ Horizontally scalable&lt;br&gt;&lt;br&gt;
✔ Secure by design&lt;br&gt;&lt;br&gt;
✔ Production-ready  &lt;/p&gt;




&lt;h2&gt;
  
  
  Interview Questions This Project Answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Why use an ALB instead of exposing EC2 directly?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Security, scalability, health checks, and zero-downtime deployments  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; How does an Auto Scaling Group integrate with an ALB?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Through target groups with dynamic instance registration  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What happens if an Availability Zone goes down?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; The ALB routes traffic to healthy AZs automatically  &lt;/p&gt;




&lt;h2&gt;
  
  
  Problem → Solution Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 failure&lt;/td&gt;
&lt;td&gt;Auto Scaling replacement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic spikes&lt;/td&gt;
&lt;td&gt;Horizontal scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-AZ risk&lt;/td&gt;
&lt;td&gt;Multi-AZ deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public EC2 exposure&lt;/td&gt;
&lt;td&gt;ALB-only access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual recovery&lt;/td&gt;
&lt;td&gt;Automated health checks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>architecture</category>
      <category>aws</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DAY 4 &amp; 5: ADVANCED EC2 DEPLOYMENT PATTERNS &amp; ENTERPRISE STRATEGIES</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Fri, 28 Nov 2025 15:24:42 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/day-4-5-advanced-ec2-deployment-patterns-enterprise-strategies-54cn</link>
      <guid>https://dev.to/ntsezenelvis/day-4-5-advanced-ec2-deployment-patterns-enterprise-strategies-54cn</guid>
      <description>&lt;h1&gt;
  
  
  Objective: Create a fault-tolerant web application across multiple Availability Zones
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1: Create Launch Template
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Navigate to EC2 Console
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to AWS Management Console
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;EC2&lt;/strong&gt; and click on it
&lt;/li&gt;
&lt;li&gt;In the left sidebar, click &lt;strong&gt;Launch Templates&lt;/strong&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%2Fdbktoqobz4mtf3o1ia14.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%2Fdbktoqobz4mtf3o1ia14.png" alt="Launch Template" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Create New Launch Template
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Create launch template&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fill in the following details:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Launch template name and description&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Launch template name: &lt;code&gt;production-web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Template version description: &lt;code&gt;Production web servers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auto Scaling guidance:  &lt;em&gt;Check&lt;/em&gt; &lt;strong&gt;Provide guidance to help me set up a template for use with EC2 Auto Scaling&lt;/strong&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%2F2eq5ezzqjcwc649mfs0o.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%2F2eq5ezzqjcwc649mfs0o.png" alt="Launch template name and description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Application and OS Images (Amazon Machine Image)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;AMI: Choose &lt;strong&gt;Amazon Linux 2 AMI&lt;/strong&gt; (&lt;code&gt;ami-0c02fb55956c7d316&lt;/code&gt; or latest)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Select&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Instance type&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Instance type: &lt;code&gt;t3.medium&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Key pair (login)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Key pair name: &lt;code&gt;cloudreality-KP&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%2Fhikozt5wugxfdtoadqlh.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%2Fhikozt5wugxfdtoadqlh.png" alt="Instance type" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Network settings&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Security groups: Select existing or create new:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security group name: &lt;code&gt;web-sg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: Allow SSH and HTTP&lt;/li&gt;
&lt;li&gt;Inbound rules:

&lt;ul&gt;
&lt;li&gt;SSH (port 22) — Your IP
&lt;/li&gt;
&lt;li&gt;HTTP (port 80) — &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&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%2F17loirlzppgfa66ul1e6.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%2F17loirlzppgfa66ul1e6.png" alt="Security groups" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Configure Advanced Details
&lt;/h3&gt;

&lt;p&gt;Scroll to &lt;strong&gt;Advanced details → User data&lt;/strong&gt; and paste:&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;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Update system and install Apache&lt;/span&gt;
yum update &lt;span class="nt"&gt;-y&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; httpd

&lt;span class="c"&gt;# Enable and start Apache&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;httpd
systemctl start httpd

&lt;span class="c"&gt;# Create web page&lt;/span&gt;
&lt;span class="nb"&gt;cat&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; &amp;gt; /var/www/html/index.html
&amp;lt;h1&amp;gt;Hello from CloudReality Auto Scaling Group&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Instance ID: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://169.254.169.254/latest/meta-data/instance-id&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Availability Zone: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://169.254.169.254/latest/meta-data/placement/availability-zone&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.4 Create Launch Template
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;"Create launch template"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You'll see success message: &lt;strong&gt;"Launch template production-web was successfully created"&lt;/strong&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%2Fvs75l9kfbg0998f6qwj3.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%2Fvs75l9kfbg0998f6qwj3.png" alt="Create Launch Template" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Create Auto Scaling Group&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Navigate to Auto Scaling Groups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In EC2 left sidebar, click &lt;strong&gt;"Auto Scaling Groups"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Auto Scaling group"&lt;/strong&gt; button
&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%2F8u06szj3308jej0fgm6u.png" alt="Create Auto Scaling group" width="800" height="329"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 Choose Launch Template
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto Scaling group name&lt;/strong&gt;: &lt;code&gt;production-web-asg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch template&lt;/strong&gt;: Select &lt;code&gt;production-web&lt;/code&gt; from dropdown&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Next"&lt;/strong&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%2Fvlt61z4te5mlk9itolor.png" alt="Choose Launch Template" width="800" height="311"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Configure Instance Launch Options
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Choose instance launch options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purchase options and instance types&lt;/strong&gt;: Keep default (On-demand)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: Select your VPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets&lt;/strong&gt;: &lt;strong&gt;CRITICAL&lt;/strong&gt; - Select &lt;strong&gt;AT LEAST 2 DIFFERENT SUBNETS&lt;/strong&gt; in different Availability Zones

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;subnet-12345678 (us-east-1a)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;subnet-87654321 (us-east-1b)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;"Next"&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%2F559gq1l340v73w9ij7zj.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%2F559gq1l340v73w9ij7zj.png" alt="Configure Instance Launch Options" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Configure Advanced Options
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Load balancing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attach to an existing load balancer&lt;/strong&gt;: ☐ No load balancer (we'll add later)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;![Configure Advanced Options&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%2F47rscg37oda6p7a0pxo7.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%2F47rscg37oda6p7a0pxo7.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;](...)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health checks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☑ &lt;strong&gt;EC2&lt;/strong&gt; (default)&lt;/li&gt;
&lt;li&gt;☑ &lt;strong&gt;ELB&lt;/strong&gt; (check this for application-level health checks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health check grace period&lt;/strong&gt;: &lt;code&gt;300&lt;/code&gt; seconds&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%2F1zzg7hwjc6i7rjhefwx5.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%2F1zzg7hwjc6i7rjhefwx5.png" alt="Health checks" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: ☑ Enable CloudWatch detailed monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;"Next"&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.5 Configure Group Size and Scaling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Group size:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desired capacity&lt;/strong&gt;: &lt;code&gt;3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum capacity&lt;/strong&gt;: &lt;code&gt;2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum capacity&lt;/strong&gt;: &lt;code&gt;10&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%2Ffki81e5xtp5d04gtlxae.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%2Ffki81e5xtp5d04gtlxae.png" alt="Configure Group Size and Scaling" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling policies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;"Target tracking scaling policy"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric type&lt;/strong&gt;: Average CPU utilization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target value&lt;/strong&gt;: &lt;code&gt;50&lt;/code&gt; (percent)&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%2F1k6o6c8ih6mw6pg7soat.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%2F1k6o6c8ih6mw6pg7soat.png" alt="Scaling policies" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;"Next"&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.6 Add Tags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;"Add tag"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key&lt;/strong&gt;: &lt;code&gt;Name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value&lt;/strong&gt;: &lt;code&gt;production-web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;☑ &lt;strong&gt;Tag instances&lt;/strong&gt; (this tags all instances created by ASG)&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%2Fo6xo5337v5doyyou1w6u.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%2Fo6xo5337v5doyyou1w6u.png" alt="Add Tags" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;"Next"&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.7 Review and Create
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Review all settings&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Auto Scaling group"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Verify Auto Scaling Group&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  3.1 Check Auto Scaling Group Status
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Auto Scaling Groups&lt;/strong&gt; in EC2 console&lt;/li&gt;
&lt;li&gt;Click on your new ASG: &lt;code&gt;production-web-asg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;"Instance management"&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;You should see 3 instances launching with status &lt;strong&gt;"Pending"&lt;/strong&gt; → &lt;strong&gt;"InService"&lt;/strong&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%2Fdlnnssoao1hhdos9xwtn.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%2Fdlnnssoao1hhdos9xwtn.png" alt="Check Auto Scaling Group Status" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2 Monitor Instance Launch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Instances&lt;/strong&gt; in EC2 console&lt;/li&gt;
&lt;li&gt;You should see 3 new instances with names &lt;code&gt;production-web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wait for all instances to show &lt;strong&gt;"3/3 checks passed"&lt;/strong&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%2Fdv38y5s0vriomhdwg8cw.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%2Fdv38y5s0vriomhdwg8cw.png" alt="Monitor Instance Launch" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Test the Setup&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  4.1 Test Web Server
&lt;/h3&gt;

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

&lt;ol&gt;
&lt;li&gt;Copy the &lt;strong&gt;Public IP&lt;/strong&gt; address&lt;/li&gt;
&lt;li&gt;Open web browser and go to: &lt;code&gt;http://&amp;lt;PUBLIC_IP&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You should see: "Hello from Auto Scaling Group" with instance details&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm72df0qrrakuq11cqbj.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%2Fmm72df0qrrakuq11cqbj.png" alt="web-instance" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 Test Instance Replacement
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Instances&lt;/strong&gt; console, select one instance&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Instance state"&lt;/strong&gt; → &lt;strong&gt;"Terminate instance"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Confirm termination&lt;/li&gt;
&lt;li&gt;Watch Auto Scaling Group:

&lt;ul&gt;
&lt;li&gt;ASG will detect missing instance&lt;/li&gt;
&lt;li&gt;New instance will automatically launch&lt;/li&gt;
&lt;li&gt;Wait 2-3 minutes for new instance to be ready&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhjn86cfoa5qfqpizle8.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%2Fvhjn86cfoa5qfqpizle8.png" alt="termination" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4.3 Test Manual Scaling
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Auto Scaling Groups&lt;/strong&gt; → Select your ASG&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Edit"&lt;/strong&gt; (top right)&lt;/li&gt;
&lt;li&gt;Change &lt;strong&gt;"Desired capacity"&lt;/strong&gt; to &lt;code&gt;5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Update"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Watch 2 new instances launch automatically
&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%2Fnd8abxvn101f2144jbsu.png" alt="scale up" width="800" height="260"&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Configure CloudWatch Alarms&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  5.1 Create CPU Utilization Alarm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;CloudWatch&lt;/strong&gt; console&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Alarms"&lt;/strong&gt; → &lt;strong&gt;"All alarms"&lt;/strong&gt; → &lt;strong&gt;"Create alarm"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Select metric"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"EC2"&lt;/strong&gt; → &lt;strong&gt;"Per-Instance Metrics"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"CPUUtilization"&lt;/strong&gt; for your instances&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Select metric"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure conditions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Threshold type&lt;/strong&gt;: Static&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whenever CPUUtilization is...&lt;/strong&gt;: Greater &amp;gt; 70&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional configuration&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Datapoints to alarm&lt;/strong&gt;: 2 out of 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing data treatment&lt;/strong&gt;: Treat missing data as missing
&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%2Fi1yx4mgg9gchw44r1dsg.png" alt="DESCRIPTION" width="800" height="277"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure actions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alarm state trigger&lt;/strong&gt;: In alarm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select an SNS topic&lt;/strong&gt;: Create new topic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;asg-high-cpu-alert&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email endpoints&lt;/strong&gt;: Enter your email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;"Create alarm"&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%2Fdvstmatwla2xe59piqm0.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%2Fdvstmatwla2xe59piqm0.png" alt="CREATE alarm" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5.2 Create Scale-Out Policy (Optional)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go back to your Auto Scaling Group&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Automatic scaling"&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create dynamic scaling policy"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy type&lt;/strong&gt;: Step scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alarm&lt;/strong&gt;: Select the CPU alarm you created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take the action&lt;/strong&gt;: Add 2 capacity units when alarm triggers
&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%2Fgs31xvpgnyzygo2aeewq.png" alt="cloud" width="800" height="353"&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 6: Monitoring and Validation&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  6.1 Check Auto Scaling Activities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In your ASG, go to &lt;strong&gt;"Activity"&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;You should see history of all scaling activities&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%2Friapqfiy9q9e1v61ocn3.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%2Friapqfiy9q9e1v61ocn3.png" alt="activities" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6.2 Verify Multi-AZ Distribution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;"Instance management"&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Check that instances are distributed across different Availability Zones
&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%2Fsdqagka1ovzmsbfx61nk.png" alt="location" width="800" height="291"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  6.3 Test Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Access each instance via public IP&lt;/li&gt;
&lt;li&gt;Verify all instances serve the web page correctly&lt;/li&gt;
&lt;li&gt;Note different instance IDs and AZs shown on each page&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%2Fj1xcgebr31nquzm3dp1y.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%2Fj1xcgebr31nquzm3dp1y.png" alt="1one" width="799" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmu2elewlnrxr9w0evpx.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%2Fsmu2elewlnrxr9w0evpx.png" alt="two" width="782" height="223"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Success Checklist&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Launch template created successfully&lt;/li&gt;
&lt;li&gt;[ ] Auto Scaling Group created with 3 instances&lt;/li&gt;
&lt;li&gt;[ ] Instances distributed across multiple AZs&lt;/li&gt;
&lt;li&gt;[ ] Web servers responding on port 80&lt;/li&gt;
&lt;li&gt;[ ] Instance auto-replacement working&lt;/li&gt;
&lt;li&gt;[ ] Manual scaling working&lt;/li&gt;
&lt;li&gt;[ ] CloudWatch alarms configured&lt;/li&gt;
&lt;li&gt;[ ] All instances healthy in ASG&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Troubleshooting Tips&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instances not launching&lt;/strong&gt;: Check security group inbound rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health checks failing&lt;/strong&gt;: Increase health check grace period&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web server not responding&lt;/strong&gt;: Check User Data script for errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No public IP&lt;/strong&gt;: Ensure subnets have auto-assign public IP enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your production-grade Auto Scaling Group is now ready! 🚀&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Delete the Auto Scaling Group (ASG)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;EC2 console → Auto Scaling Groups&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your ASG (&lt;code&gt;production-web-asg&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Delete&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When prompted, choose &lt;strong&gt;“Yes, terminate all instances”&lt;/strong&gt; so that all EC2 instances managed by this ASG are stopped and deleted.&lt;/li&gt;
&lt;li&gt;Wait until the ASG status disappears from the console.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Important: Deleting the ASG will not delete your Launch Template or Security Groups. That’s next.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 2: Terminate any leftover EC2 instances
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 → Instances&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Look for any instances with the name &lt;code&gt;production-web&lt;/code&gt; or related.&lt;/li&gt;
&lt;li&gt;Select them → &lt;strong&gt;Instance state → Terminate instance&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait until they show &lt;strong&gt;terminated&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 3: Delete the Launch Template
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 → Launch Templates&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the launch template: &lt;code&gt;production-web&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Actions → Delete template&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm deletion.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 4: Delete Security Groups
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 → Security Groups&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find the security group you created (&lt;code&gt;web-sg&lt;/code&gt;) or any related to this app.&lt;/li&gt;
&lt;li&gt;Select it → &lt;strong&gt;Actions → Delete security group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm deletion.
&amp;gt; ⚠️ You cannot delete a security group if it’s still attached to a running instance or ENI. Make sure all instances are terminated.
---
## Step 5: Delete Load Balancers (if created)&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 → Load Balancers&lt;/strong&gt; (or &lt;strong&gt;Elastic Load Balancing&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Find any load balancers you attached to the ASG.&lt;/li&gt;
&lt;li&gt;Select it → &lt;strong&gt;Actions → Delete&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm deletion.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 6: Delete CloudWatch Alarms
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;CloudWatch → Alarms → All alarms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Look for alarms you created, e.g., &lt;code&gt;asg-high-cpu-alert&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  3. Select → &lt;strong&gt;Actions → Delete&lt;/strong&gt;.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Step 7: Delete SNS Topics (if any)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;SNS → Topics&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find any topic you created (like &lt;code&gt;asg-high-cpu-alert&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  3. Select → &lt;strong&gt;Delete topic&lt;/strong&gt;.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Step 8: Clean up Key Pairs (optional)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 → Key Pairs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  2. Select &lt;code&gt;cloudreality-KP&lt;/code&gt; (or any you used for this app) → &lt;strong&gt;Delete key pair&lt;/strong&gt;.
&lt;/h2&gt;

&lt;p&gt;✅ After completing these steps, your AWS account will be completely clean of this multi-AZ setup.&lt;/p&gt;
&lt;h2&gt;
  
  
  DAY 4 — ADVANCED EC2 DEPLOYMENT PATTERNS &amp;amp; ENTERPRISE STRATEGIES
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Master production-grade EC2 architectures, automation, and enterprise best practices for real-world deployments.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Hands-On Lab: Production Auto Scaling Group&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Deploy a fault-tolerant web application across multiple Availability Zones.&lt;/p&gt;
&lt;h1&gt;
  
  
  Create Launch Template
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Launch Template&lt;/span&gt;
aws ec2 create-launch-template &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--launch-template-name&lt;/span&gt; production-web &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--version-description&lt;/span&gt; &lt;span class="s2"&gt;"Production web servers"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--launch-template-data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "ImageId": "ami-0c02fb55956c7d316",
    "InstanceType": "t3.medium",
    "KeyName": "cloudreality-KP",
    "SecurityGroupIds": ["sg-1234567890abcdef0"],
    "UserData": "IyEvYmluL2Jhc2gKc3VkbyB5dW0gdXBkYXRlIC15CnN1ZG8geXVtIGluc3RhbGwgLXkgaHR0cGQKc3VkbyBzeXN0ZW1jdGwgc3RhcnQgaHR0cGQKZWNobyAiPGgxPkhlbGxvIGZyb20gQXV0byBTY2FsaW5nIEdyb3VwPC9oMT4iIHwgc3VkbyB0ZWUgL3Zhci93d3cvaHRtbC9pbmRleC5odG1s"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Create Auto Scaling Group
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create Auto Scaling Group&lt;/span&gt;
aws autoscaling create-auto-scaling-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auto-scaling-group-name&lt;/span&gt; production-web-asg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--launch-template&lt;/span&gt; &lt;span class="nv"&gt;LaunchTemplateName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production-web,Version&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'$Latest'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--min-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-size&lt;/span&gt; 10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--desired-capacity&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-zone-identifier&lt;/span&gt; &lt;span class="s2"&gt;"subnet-12345678,subnet-87654321"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--health-check-type&lt;/span&gt; ELB &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--health-check-grace-period&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="s2"&gt;"Key=Name,Value=production-web,PropagateAtLaunch=true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Practice Tasks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test instance replacement by terminating one instance&lt;/li&gt;
&lt;li&gt;Scale the ASG manually and observe new instances&lt;/li&gt;
&lt;li&gt;Configure CloudWatch alarms for auto-scaling
# How to Delete Your Multi-AZ Fault-Tolerant Web Application Setup in AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📘 AWS Docs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html" rel="noopener noreferrer"&gt;Auto Scaling Groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html" rel="noopener noreferrer"&gt;Launch Templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; High Availability, Auto Scaling, Load Balancing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; Solutions Architect Professional, DevOps Engineer Professional&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What's the difference between launch configurations and launch templates?&lt;/li&gt;
&lt;li&gt;How do you ensure zero-downtime deployments with Auto Scaling Groups?&lt;/li&gt;
&lt;li&gt;What metrics are most important for scaling decisions?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  💡 Problem &amp;amp; Solution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ASG instances failing health checks&lt;/td&gt;
&lt;td&gt;Application startup too slow&lt;/td&gt;
&lt;td&gt;Increase health check grace period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling too aggressively&lt;/td&gt;
&lt;td&gt;Wrong CloudWatch alarm thresholds&lt;/td&gt;
&lt;td&gt;Adjust scaling policies and cooldown periods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instances unevenly distributed&lt;/td&gt;
&lt;td&gt;Imbalanced subnet configuration&lt;/td&gt;
&lt;td&gt;Use multiple AZs and balanced subnets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Certification Questions
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Expert Level (Solutions Architect Professional)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; Design a multi-region active-active architecture with 99.99% availability&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use Global Accelerator, Route53 latency routing, cross-region read replicas, and automated failover&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; How do you implement blue-green deployments for EC2 with zero downtime?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use Elastic Load Balancer with target groups, Auto Scaling groups, and weighted routing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; Design cost-optimized architecture handling 10x traffic spikes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Spot Fleets (70%) + On-Demand (20%) + Reserved (10%) with predictive scaling&lt;/p&gt;
&lt;h3&gt;
  
  
  Enterprise Interview Scenarios
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Architecture Design Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"Design an EC2 architecture for a financial trading platform requiring &amp;lt;1ms latency"&lt;/li&gt;
&lt;li&gt;"How would you secure EC2 instances handling PCI-DSS compliant data?"&lt;/li&gt;
&lt;li&gt;"Design a migration strategy for 500 on-premises servers to EC2"&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Troubleshooting Scenarios&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"Users report intermittent 503 errors - walk through your investigation process"&lt;/li&gt;
&lt;li&gt;"Database performance degraded 50% after migration to EC2 - diagnose and fix"&lt;/li&gt;
&lt;li&gt;"Auto Scaling group constantly cycling instances - root cause analysis"&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Real-World Scenarios
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 1: E-Commerce Platform Migration&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Black Friday traffic spikes causing downtime&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Implemented predictive scaling with CloudWatch metrics and Spot Fleets for cost optimization&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 2: Microservices Container Platform&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Container instances failing health checks&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Implemented custom health checks, instance replacement policies, and proper drain configurations&lt;/p&gt;


&lt;h2&gt;
  
  
  🗓️ DAY 5 — ENTERPRISE SECURITY &amp;amp; COST OPTIMIZATION
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Implement enterprise-grade security, compliance, and cost optimization strategies for production workloads.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hands-On Lab: Security Hardening &amp;amp; Cost Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Implement security best practices and cost optimization techniques.&lt;/p&gt;
&lt;h1&gt;
  
  
  Enforce IMDSv2 and disable IMDSv1
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enforce IMDSv2 and disable IMDSv1&lt;/span&gt;
aws ec2 modify-instance-metadata-options &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-1234567890abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-tokens&lt;/span&gt; required &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-endpoint&lt;/span&gt; enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Create cost allocation tags
&lt;/h1&gt;

&lt;p&gt;bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create cost allocation tags
aws ec2 create-tags \
  --resources i-1234567890abcdef0 \
  --tags Key=CostCenter,Value=Engineering Key=Project,Value=WebApp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Set up budget alerts
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set up budget alerts&lt;/span&gt;
aws budgets create-budget &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; 123456789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--budget&lt;/span&gt; file://budget.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--notifications-with-subscribers&lt;/span&gt; file://notifications.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>architecture</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>you can help share the link 

https://dev.to/ntsezenelvis/aws-ec2-mastery-bootcamp-45od</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Wed, 05 Nov 2025 02:02:26 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/you-can-help-share-the-link-httpsdevtontsezenelvisaws-ec2-mastery-bootcamp-45od-5dn2</link>
      <guid>https://dev.to/ntsezenelvis/you-can-help-share-the-link-httpsdevtontsezenelvisaws-ec2-mastery-bootcamp-45od-5dn2</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/ntsezenelvis" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3400058%2Fd85e01f4-f315-46df-8bd1-b70e49614840.jpg" alt="ntsezenelvis"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/ntsezenelvis/aws-ec2-mastery-bootcamp-45od" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;AWS EC2 Mastery Bootcamp&lt;/h2&gt;
      &lt;h3&gt;Ntseze-Nelvis ・ Nov 5 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/ntsezenelvis" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3400058%2Fd85e01f4-f315-46df-8bd1-b70e49614840.jpg" alt="ntsezenelvis"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/ntsezenelvis/aws-ec2-mastery-bootcamp-45od" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;AWS EC2 Mastery Bootcamp&lt;/h2&gt;
      &lt;h3&gt;Ntseze-Nelvis ・ Nov 5 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>AWS EC2 Mastery Bootcamp</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Wed, 05 Nov 2025 02:00:57 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/aws-ec2-mastery-bootcamp-45od</link>
      <guid>https://dev.to/ntsezenelvis/aws-ec2-mastery-bootcamp-45od</guid>
      <description>&lt;h2&gt;
  
  
  AWS EC2 Series – 3-Days Intensive Hands-On Track
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; aws, ec2, devops, cloud, infrastructure  &lt;/p&gt;




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

&lt;p&gt;This 3-day sprint helps you master EC2 fundamentals, networking, and storage with real-world labs, AWS documentation links, and certification-oriented challenges.&lt;br&gt;&lt;br&gt;
Each day blends &lt;strong&gt;AWS Console + CLI + troubleshooting&lt;/strong&gt; to make you exam-ready and project-capable.  &lt;/p&gt;


&lt;h2&gt;
  
  
  🗓️ DAY 1 — EC2 FUNDAMENTALS &amp;amp; INSTANCE OPERATIONS
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Understand EC2 basics AMIs, instance types, pricing models, and lifecycle.&lt;br&gt;&lt;br&gt;
You'll learn to launch, manage, and automate EC2 instances efficiently.  &lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Hands-On Lab: Multi-Instance Launch &amp;amp; Lifecycle&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Launch multiple EC2 instances across AZs.&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 a key pair&lt;/span&gt;
aws ec2 create-key-pair &lt;span class="nt"&gt;--key-name&lt;/span&gt; cloudreality-KP &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'KeyMaterial'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; cloudreality-KP.pem
&lt;span class="nb"&gt;chmod &lt;/span&gt;400 cloudreality-KP.pem

&lt;span class="c"&gt;# Launch instances&lt;/span&gt;
aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-0c02fb55956c7d316 &lt;span class="se"&gt;\ &lt;/span&gt;  &amp;lt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt; EDIT THIS: Use AMI &lt;span class="k"&gt;for &lt;/span&gt;your region &lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;--count&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-name&lt;/span&gt; cloudreality-KP &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag-specifications&lt;/span&gt; &lt;span class="s1"&gt;'ResourceType=instance,Tags=[{Key=Name,Value=DevOps-Lab}]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Practice Tasks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stop/start and observe IP changes&lt;/li&gt;
&lt;li&gt;Resize instance type&lt;/li&gt;
&lt;li&gt;Terminate one and review volume behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📘 AWS Docs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2" rel="noopener noreferrer"&gt;What is Amazon EC2?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2/latest/instancelaunch" rel="noopener noreferrer"&gt;Launch your first instance (Step by Step)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; EC2 lifecycle states, AMI and key pair management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; Cloud Practitioner (CLF-C02), Solutions Architect – Associate (SAA-C03)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is the difference between stopping and terminating an instance?&lt;/li&gt;
&lt;li&gt;Which EC2 purchase option best suits long-term stable workloads?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Problem &amp;amp; Solution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instance not showing&lt;/td&gt;
&lt;td&gt;Wrong region&lt;/td&gt;
&lt;td&gt;Switch to correct AWS region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch failed&lt;/td&gt;
&lt;td&gt;IAM policy missing&lt;/td&gt;
&lt;td&gt;Attach AmazonEC2FullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stopped instance lost IP&lt;/td&gt;
&lt;td&gt;Used public IP, not Elastic IP&lt;/td&gt;
&lt;td&gt;Allocate and associate an Elastic IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📚 Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; EC2 lifecycle states, AMI and key pair management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; Cloud Practitioner (CLF-C02), Solutions Architect – Associate (SAA-C03)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎓 Certification Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Level (Cloud Practitioner)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; What happens to data on instance store volumes when an EC2 instance is stopped?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Data on instance store volumes is lost, while EBS volumes persist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; Which EC2 pricing model offers the lowest cost for uninterruptible workloads?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Reserved Instances (1-3 year commitment)&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Level (Solutions Architect)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; Your company needs to run a batch processing job for 6 hours. Which purchasing option is most cost-effective?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Spot Instances, as they offer up to 90% discount for interruptible workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4:&lt;/strong&gt; How can you ensure an EC2 instance maintains the same public IP after restart?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use an Elastic IP address and associate it with the instance.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Level (DevOps Engineer)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q5:&lt;/strong&gt; Describe how to implement instance refresh with Auto Scaling Groups while maintaining zero downtime.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use rolling deployments with health checks, and configure minimum healthy percentage.&lt;/p&gt;
&lt;h3&gt;
  
  
  💼 Interview Questions
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"What's the difference between stopping and terminating an EC2 instance?"&lt;/li&gt;
&lt;li&gt;"How do you choose between different instance families?"&lt;/li&gt;
&lt;li&gt;"What are the key factors in selecting an AMI?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"How would you design a cost-optimized architecture for a web application with predictable traffic?"&lt;/li&gt;
&lt;li&gt;"Explain the process of migrating an on-premises application to EC2."&lt;/li&gt;
&lt;li&gt;"What monitoring metrics are crucial for EC2 instances?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"How do you implement disaster recovery for EC2 instances across regions?"&lt;/li&gt;
&lt;li&gt;"Describe a scenario where you'd use placement groups and the trade-offs involved."&lt;/li&gt;
&lt;li&gt;"How would you troubleshoot an instance that's failing health checks?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Real-World Scenarios
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 1: Cost Optimization Challenge&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; A company's EC2 costs increased 200% due to developers using on-demand instances for development.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Implemented Auto Scaling with Spot Instances for non-production workloads, saving 65% on compute costs.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 2: Performance Issue&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Application experiencing high CPU steal on shared tenancy instances.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Migrated to dedicated instances and implemented proper monitoring with CloudWatch.&lt;/p&gt;


&lt;h2&gt;
  
  
  🗓️ DAY 2 — NETWORKING, SECURITY GROUPS &amp;amp; ELASTIC IPs
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Secure instance access, configure firewall rules, and deploy a simple web app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hands-On Lab: Deploy a Public Web Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Assign an Elastic IP, configure SGs, and host a simple webpage.&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;# Allocate Elastic IP&lt;/span&gt;
aws ec2 allocate-address &lt;span class="nt"&gt;--domain&lt;/span&gt; vpc

&lt;span class="c"&gt;# Associate to instance&lt;/span&gt;
aws ec2 associate-address &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-0abcd1234efgh5678 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allocation-id&lt;/span&gt; eipalloc-0abcdef1234567890

&lt;span class="c"&gt;# Create Security Group&lt;/span&gt;
aws ec2 create-security-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-name&lt;/span&gt; web-sg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Allow SSH &amp;amp; HTTP access"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-id&lt;/span&gt; vpc-0ab12c34d56e78f90

&lt;span class="c"&gt;# Add ingress rules&lt;/span&gt;
aws ec2 authorize-security-group-ingress &lt;span class="nt"&gt;--group-name&lt;/span&gt; web-sg &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="nt"&gt;--port&lt;/span&gt; 22 &lt;span class="nt"&gt;--cidr&lt;/span&gt; 0.0.0.0/0
aws ec2 authorize-security-group-ingress &lt;span class="nt"&gt;--group-name&lt;/span&gt; web-sg &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="nt"&gt;--port&lt;/span&gt; 80 &lt;span class="nt"&gt;--cidr&lt;/span&gt; 0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;SSH into instance&lt;/li&gt;
&lt;li&gt;Install Apache&lt;/li&gt;
&lt;li&gt;View site in browser
&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;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; httpd
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start httpd
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Hello from Nelvis EC2 Web Server&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📘 AWS Docs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2/security-groups" rel="noopener noreferrer"&gt;Security Groups for EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2/elastic-ips" rel="noopener noreferrer"&gt;Elastic IPs Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; EC2 connectivity, networking, security boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; SysOps Administrator, DevOps Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Compare Security Groups and NACLs.&lt;/li&gt;
&lt;li&gt;Why does Elastic IP retain its address across instance stops?&lt;/li&gt;
&lt;li&gt;How can you secure SSH access from a corporate network only?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📘 AWS Docs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2/security-groups" rel="noopener noreferrer"&gt;Security Groups for EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ec2/elastic-ips" rel="noopener noreferrer"&gt;Elastic IPs Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Problem &amp;amp; Solution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH Timeout&lt;/td&gt;
&lt;td&gt;SG rule missing&lt;/td&gt;
&lt;td&gt;Allow TCP 22 inbound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webpage not loading&lt;/td&gt;
&lt;td&gt;HTTP rule missing or Apache off&lt;/td&gt;
&lt;td&gt;Add port 80 + start service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elastic IP not reachable&lt;/td&gt;
&lt;td&gt;Wrong instance association&lt;/td&gt;
&lt;td&gt;Reassociate using CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📚 Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; EC2 connectivity, networking, security boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; SysOps Administrator, DevOps Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎓 Certification Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; What's the difference between Security Groups and NACLs?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Security Groups are stateful (return traffic allowed automatically) and operate at instance level, while NACLs are stateless and operate at subnet level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; Why does an Elastic IP retain its address across instance stops?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Elastic IPs are allocated to your AWS account, not specific instances.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; How can you restrict SSH access to only your corporate network?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Modify Security Group to allow port 22 only from your corporate IP range (e.g., 192.168.1.0/24).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4:&lt;/strong&gt; What happens to Elastic IP charges when an instance is stopped?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; You're charged for unattached Elastic IPs, but not for attached ones to running instances.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q5:&lt;/strong&gt; Design a network architecture that spans multiple AZs with proper failover capabilities.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use multiple subnets across AZs, Elastic IPs with failover scripts, and proper route table configurations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Interview Questions
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"What's the default behavior of a new Security Group?"&lt;/li&gt;
&lt;li&gt;"How do Security Groups differ from traditional firewalls?"&lt;/li&gt;
&lt;li&gt;"When would you use an Elastic IP vs. a public IP?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"How would you design security groups for a 3-tier web application?"&lt;/li&gt;
&lt;li&gt;"What are the implications of using 0.0.0.0/0 in security group rules?"&lt;/li&gt;
&lt;li&gt;"How do you troubleshoot connectivity issues between instances in different subnets?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"Design a network architecture that complies with PCI-DSS requirements."&lt;/li&gt;
&lt;li&gt;"How would you implement zero-trust networking in AWS?"&lt;/li&gt;
&lt;li&gt;"What strategies would you use for gradual security group rule migration?"&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Real-World Scenarios
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 1: Security Breach&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Company exposed SSH to 0.0.0.0/0, leading to brute force attacks.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Implemented security group rules restricting SSH to corporate IP, set up AWS WAF, and used Session Manager for SSH.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 2: High Availability Requirement&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Application needed to survive AZ failure with minimal downtime.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Deployed across multiple AZs with Elastic IP failover automation and health checks.&lt;/p&gt;


&lt;h2&gt;
  
  
  🗓️ DAY 3 — EBS VOLUMES, SNAPSHOTS &amp;amp; BACKUPS
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Understand persistent storage, expand volumes, and set up snapshot automation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hands-On Lab: EBS Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Create, attach, and back up a volume.&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 EBS Volume&lt;/span&gt;
aws ec2 create-volume &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--availability-zone&lt;/span&gt; us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--size&lt;/span&gt; 10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume-type&lt;/span&gt; gp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Attach to instance
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 attach-volume \
  --volume-id vol-0abcdef1234567890 \
  --instance-id i-0abcd1234efgh5678 \
  --device /dev/xvdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Then SSH into the instance:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkfs -t xfs /dev/xvdf
sudo mkdir /data
sudo mount /dev/xvdf /data
df -h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📘 AWS Docs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ebs" rel="noopener noreferrer"&gt;Amazon EBS Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ebs/snapshots" rel="noopener noreferrer"&gt;Create Snapshots&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Problem &amp;amp; Solution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Volume not attaching&lt;/td&gt;
&lt;td&gt;Different AZ&lt;/td&gt;
&lt;td&gt;Recreate volume in same AZ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data lost after termination&lt;/td&gt;
&lt;td&gt;Root volume deleted&lt;/td&gt;
&lt;td&gt;Disable DeleteOnTermination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snapshots not running&lt;/td&gt;
&lt;td&gt;Missing IAM role&lt;/td&gt;
&lt;td&gt;Attach AmazonDLMFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📚 Certification Focus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Topic:&lt;/strong&gt; Storage, Backup, High Availability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Certs:&lt;/strong&gt; Solutions Architect, DevOps Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎓 Certification Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; What happens when you detach a root EBS volume?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; The instance becomes unusable as the operating system is on the root volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; How can you restore a snapshot to a new volume?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Create a new volume from the snapshot in the EC2 console or using AWS CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; What's the difference between gp2, gp3, and io2 volumes?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; gp2: baseline performance, gp3: provisioned performance, io2: highest performance with durability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4:&lt;/strong&gt; How do you increase the size of an EBS volume?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Modify volume size in console/CLI, then extend filesystem in OS.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Level&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Q5:&lt;/strong&gt; Design a backup strategy for a mission-critical database on EC2.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Use application-consistent snapshots with DLM, multi-region replication, and automated recovery testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  💼 Interview Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"What are the different EBS volume types and their use cases?"&lt;/li&gt;
&lt;li&gt;"How does EBS snapshot pricing work?"&lt;/li&gt;
&lt;li&gt;"What's the process for resizing an EBS volume?"&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Intermediate Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"How would you design a backup strategy for compliance requirements?"&lt;/li&gt;
&lt;li&gt;"What are the performance characteristics of different EBS volume types?"&lt;/li&gt;
&lt;li&gt;"How do you monitor EBS performance and troubleshoot issues?"&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Questions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;"Design a disaster recovery strategy with RTO of 15 minutes and RPO of 5 minutes."&lt;/li&gt;
&lt;li&gt;"How would you implement cross-region snapshot replication automatically?"&lt;/li&gt;
&lt;li&gt;"What are the considerations for EBS-optimized instances?"&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Real-World Scenarios
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 1: Database Performance Issue&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Database performance degraded due to insufficient IOPS on gp2 volumes.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Migrated to gp3 volumes with provisioned IOPS, implemented monitoring, and set up performance baselines.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Scenario 2: Backup Failure&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Critical snapshots failed due to IAM permissions during automated backup process.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Implemented proper IAM roles with least privilege, added backup success/failure notifications, and created runbooks.&lt;/p&gt;

&lt;h3&gt;
  
  
  📘 Extra Learning &amp;amp; Exam Resources
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EC2 Official Docs&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/ec2" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/ec2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Hands-On Tutorials&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/getting-started/hands-on/" rel="noopener noreferrer"&gt;https://aws.amazon.com/getting-started/hands-on/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Labs GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/aws-samples" rel="noopener noreferrer"&gt;https://github.com/aws-samples&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam Prep – AWS Cloud Practitioner&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/certification/certified-cloud-practitioner/" rel="noopener noreferrer"&gt;https://aws.amazon.com/certification/certified-cloud-practitioner/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam Prep – Solutions Architect&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/certification/certified-solutions-architect-associate/" rel="noopener noreferrer"&gt;https://aws.amazon.com/certification/certified-solutions-architect-associate/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam Prep – DevOps Engineer&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/certification/certified-devops-engineer-professional/" rel="noopener noreferrer"&gt;https://aws.amazon.com/certification/certified-devops-engineer-professional/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 Troubleshooting Reference&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-troubleshooting.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-troubleshooting.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>devops</category>
      <category>tutorial</category>
      <category>cli</category>
      <category>aws</category>
    </item>
    <item>
      <title>DAY 2: EC2 FUNDAMENTALS &amp; INSTANCE MANAGEMENT</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Sat, 25 Oct 2025 03:16:51 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/day-2-ec2-fundamentals-instance-management-1cjh</link>
      <guid>https://dev.to/ntsezenelvis/day-2-ec2-fundamentals-instance-management-1cjh</guid>
      <description>&lt;h2&gt;
  
  
  Complete Step-by-Step Guide
&lt;/h2&gt;

&lt;p&gt;Welcome to &lt;strong&gt;Day 2&lt;/strong&gt; of the AWS EC2 Series a hands-on journey to mastering EC2 for DevOps and Cloud Engineers.&lt;/p&gt;




&lt;h1&gt;
  
  
  🛠 HANDS-ON LAB SCENARIO
&lt;/h1&gt;

&lt;p&gt;Lab: Multi-Instance Deployment &amp;amp; Management&lt;/p&gt;

&lt;p&gt;Objective: Launch instances across AZs and practice lifecycle operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Launch Instances
&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;# Create key pair first&lt;/span&gt;
aws ec2 create-key-pair &lt;span class="nt"&gt;--key-name&lt;/span&gt; MyKeyPair &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'KeyMaterial'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; MyKeyPair.pem
&lt;span class="nb"&gt;chmod &lt;/span&gt;400 MyKeyPair.pem

&lt;span class="c"&gt;# Launch instances in different AZs&lt;/span&gt;
aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-0c02fb55956c7d316 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--count&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--key-name&lt;/span&gt; MyKeyPair &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--placement&lt;/span&gt; &lt;span class="nv"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Instance Operations
&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;# Get instance IDs&lt;/span&gt;
&lt;span class="nv"&gt;INSTANCE_IDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[].Instances[].InstanceId'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Stop one instance&lt;/span&gt;
aws ec2 stop-instances &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-1234567890abcdef0

&lt;span class="c"&gt;# Change instance type (must be stopped)&lt;/span&gt;
aws ec2 modify-instance-attribute &lt;span class="nt"&gt;--instance-id&lt;/span&gt; i-1234567890abcdef0 &lt;span class="nt"&gt;--instance-type&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Value&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;t3.small&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;

&lt;span class="c"&gt;# Terminate instance&lt;/span&gt;
aws ec2 terminate-instances &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-1234567890abcdef0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Monitoring &amp;amp; Verification
&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;# Check instance states&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[].Instances[].[InstanceId,InstanceType,State.Name]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# View pricing information&lt;/span&gt;
aws ec2 describe-spot-price-history &lt;span class="nt"&gt;--instance-types&lt;/span&gt; t3.micro &lt;span class="nt"&gt;--product-descriptions&lt;/span&gt; &lt;span class="s2"&gt;"Linux/UNIX"&lt;/span&gt; &lt;span class="nt"&gt;--start-time&lt;/span&gt; 2024-01-01T00:00:00Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  REAL-WORLD PROBLEM &amp;amp; SOLUTION
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem Statement:&lt;/strong&gt;&lt;br&gt;
Company XYZ spends $5,000/month on EC2 with predictable 24/7 workload.&lt;br&gt;
How to reduce costs by 40%?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution Implementation&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Analyze Current Usage
&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 current instance inventory&lt;/span&gt;
aws ec2 describe-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[].Instances[].[InstanceId,InstanceType,State.Name]'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# Check Cost Explorer (via AWS Console)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Implement Reserved Instances
&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;# Purchase Reserved Instances (conceptual)&lt;/span&gt;
aws ec2 purchase-reserved-instances-offering &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reserved-instances-offering-id&lt;/span&gt; &amp;lt;offering-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-count&lt;/span&gt; 10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; m5.large
&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="c"&gt;###Step 3: Cost Monitoring Setup&lt;/span&gt;
&lt;span class="c"&gt;# Create budget alert&lt;/span&gt;
aws budgets create-budget &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; 123456789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--budget&lt;/span&gt; file://budget.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--notifications-with-subscribers&lt;/span&gt; file://notifications.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  budget.json
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"BudgetName"&lt;/span&gt;: &lt;span class="s2"&gt;"ec2-monthly-budget"&lt;/span&gt;,
  &lt;span class="s2"&gt;"BudgetLimit"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"Amount"&lt;/span&gt;: &lt;span class="s2"&gt;"3000"&lt;/span&gt;,
    &lt;span class="s2"&gt;"Unit"&lt;/span&gt;: &lt;span class="s2"&gt;"USD"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"CostFilters"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"Service"&lt;/span&gt;: &lt;span class="s2"&gt;"Amazon EC2"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"TimeUnit"&lt;/span&gt;: &lt;span class="s2"&gt;"MONTHLY"&lt;/span&gt;,
  &lt;span class="s2"&gt;"BudgetType"&lt;/span&gt;: &lt;span class="s2"&gt;"COST"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🚀 CORE CONCEPTS Q&amp;amp;A
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Q1: What's the difference between stopping vs terminating an instance?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Answer:&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;STOPPING:
- OS gracefully shuts down
- EBS root volume persists
- Instance can be restarted
- Keeps same private IP &lt;span class="o"&gt;(&lt;/span&gt;usually&lt;span class="o"&gt;)&lt;/span&gt;
- Charging stops &lt;span class="k"&gt;for &lt;/span&gt;instance, continues &lt;span class="k"&gt;for &lt;/span&gt;EBS

TERMINATING:
- Instance is permanently deleted
- EBS root volume deleted by default
- Cannot be recovered
- All data on instance store lost
- All charging stops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Q2: Explain EC2 purchasing options
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;On-Demand:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pay by second/hour&lt;/li&gt;
&lt;li&gt;No long-term commitment&lt;/li&gt;
&lt;li&gt;Most flexible, highest cost&lt;/li&gt;
&lt;li&gt;Use case: unpredictable workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reserved Instances:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1-3 year commitment&lt;/li&gt;
&lt;li&gt;30-60% cost savings&lt;/li&gt;
&lt;li&gt;Types: Standard, Convertible, Scheduled&lt;/li&gt;
&lt;li&gt;Use case: predictable, steady-state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Spot Instances:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to 90% savings&lt;/li&gt;
&lt;li&gt;Can be terminated with 2-minute warning&lt;/li&gt;
&lt;li&gt;Use case: fault-tolerant, flexible workloads&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;1-3 year commitment&lt;/li&gt;
&lt;li&gt;Flexible across instance family/region&lt;/li&gt;
&lt;li&gt;Use case: consistent usage patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 COMMON INTERVIEW QUESTIONS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Technical Questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🟡 &lt;strong&gt;"What happens to EBS volumes when you terminate an instance?"&lt;/strong&gt;&lt;br&gt;
By default, root EBS volume is deleted, additional volumes persist.&lt;/p&gt;

&lt;p&gt;🟡 &lt;strong&gt;"How do you change instance types?"&lt;/strong&gt;&lt;br&gt;
Stop instance → Change instance type → Start instance.&lt;/p&gt;

&lt;p&gt;🟡 &lt;strong&gt;"What's the difference between reboot and stop/start?"&lt;/strong&gt;&lt;br&gt;
Reboot = OS restart (same hardware).&lt;br&gt;
Stop/Start = may move to new hardware, new public IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario-Based Question&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"A company has applications with different reliability requirements. How would you recommend instance types?"**&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Critical production: On-Demand/Reserved
Testing/Dev: Spot Instances
Batch processing: Spot Fleets
Long-running services: Reserved Instances
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Certification-Style Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Question 1&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your company needs to run a critical database server for 3 years. Which EC2 option provides the lowest total cost?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A) On-Demand Instances
&lt;/li&gt;
&lt;li&gt;B) Spot Instances
&lt;/li&gt;
&lt;li&gt;C) Reserved Instances (All Upfront)
&lt;/li&gt;
&lt;li&gt;D) Savings Plans
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; C - Reserved Instances with All Upfront payment for predictable long-term workloads.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Question 2&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;What happens to data on an instance store volume when you stop an instance?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Data is preserved on EBS volumes but lost on instance store volumes when instance is stopped/terminated.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Question 3&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Which instance would be most cost-effective for a batch processing job that can handle interruptions?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Spot Instances — up to 90% savings for interruptible workloads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Issue:&lt;/strong&gt; Instance failed to launch due to insufficient capacity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solutions:&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;# Try different instance type&lt;/span&gt;
aws ec2 run-instances &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.small ...

&lt;span class="c"&gt;# Try different AZ&lt;/span&gt;
aws ec2 run-instances &lt;span class="nt"&gt;--placement&lt;/span&gt; &lt;span class="nv"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1b ...

&lt;span class="c"&gt;# Use capacity-optimized allocation strategy for Spot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Issue: Cannot Connect to Instance via SSH
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Checklist&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Security group allows SSH (port 22)
&lt;/li&gt;
&lt;li&gt;✅ Correct key pair
&lt;/li&gt;
&lt;li&gt;✅ Instance is in running state
&lt;/li&gt;
&lt;li&gt;✅ Public IP address is correct
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Day2 Hands-On Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Launch 3 instances in different AZs
&lt;/li&gt;
&lt;li&gt;✅ Practice stop/start/terminate operations
&lt;/li&gt;
&lt;li&gt;✅ Change instance type on stopped instance
&lt;/li&gt;
&lt;li&gt;✅ Create and attach EBS volume
&lt;/li&gt;
&lt;li&gt;✅ Configure security groups for SSH access
&lt;/li&gt;
&lt;li&gt;✅ Set up basic CloudWatch monitoring
&lt;/li&gt;
&lt;li&gt;✅ Calculate potential Reserved Instance savings
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>cloud</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>AWS EC2 Series</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Fri, 10 Oct 2025 16:53:09 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/aws-ec2-series-53i5</link>
      <guid>https://dev.to/ntsezenelvis/aws-ec2-series-53i5</guid>
      <description>&lt;h1&gt;
  
  
  AWS EC2 Series – Part 1: EC2 Dashboard Deep Dive
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; aws, ec2, cloud, devops, infrastructure  &lt;/p&gt;




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

&lt;p&gt;Amazon EC2 (Elastic Compute Cloud) is the backbone of AWS compute services.&lt;br&gt;&lt;br&gt;
The &lt;strong&gt;EC2 Dashboard&lt;/strong&gt; is your main console for managing EC2 instances, images, storage, security, and network components.&lt;br&gt;&lt;br&gt;
Mastering the dashboard is essential before diving into instances, AMIs, networking, and auto-scaling.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What is the EC2 Dashboard?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;EC2 Dashboard&lt;/strong&gt; provides a centralized view of all EC2 resources in a specific AWS region. It allows you to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch, stop, or terminate instances.
&lt;/li&gt;
&lt;li&gt;Monitor the status of instances and associated resources.
&lt;/li&gt;
&lt;li&gt;Manage storage volumes, snapshots, and security groups.
&lt;/li&gt;
&lt;li&gt;Track AWS events affecting your EC2 infrastructure.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as the &lt;strong&gt;control tower&lt;/strong&gt; for your virtual servers and related resources.  &lt;/p&gt;




&lt;h2&gt;
  
  
  2. Key Components of the EC2 Dashboard
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Resource Summary&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Displays counts of running instances, volumes, security groups, Elastic IPs, and key pairs.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Launch Instance Button&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Shortcut to create new EC2 instances using predefined AMIs and instance types.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Events &amp;amp; Notifications&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Alerts for scheduled maintenance, system updates, or instance retirement.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Quick Access Panels&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Links to AMIs, Volumes, Snapshots, Security Groups, Load Balancers, and Auto Scaling Groups.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Region Selector&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ensures you are viewing resources in the correct AWS Region — crucial when managing multi-region deployments.  &lt;/p&gt;




&lt;h2&gt;
  
  
  3. Common Issues and Solutions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Issue&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instances not visible&lt;/td&gt;
&lt;td&gt;Wrong region selected&lt;/td&gt;
&lt;td&gt;Switch to the correct region in the top-right corner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unexpected instance stop&lt;/td&gt;
&lt;td&gt;Billing issues, scheduled retirement&lt;/td&gt;
&lt;td&gt;Check Events and ensure billing is active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing access to resources&lt;/td&gt;
&lt;td&gt;IAM permissions missing&lt;/td&gt;
&lt;td&gt;Request appropriate IAM policy (e.g., &lt;code&gt;AmazonEC2FullAccess&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. Hands-On Guide: Exploring the EC2 Dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Familiarize yourself with EC2 Dashboard components and navigation.  &lt;/p&gt;

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

&lt;p&gt;Log in to your AWS Management Console and navigate to &lt;strong&gt;EC2 → Dashboard&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Observe the &lt;strong&gt;Resource Summary&lt;/strong&gt;. Take note of:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running instances
&lt;/li&gt;
&lt;li&gt;EBS volumes
&lt;/li&gt;
&lt;li&gt;Security groups
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use the &lt;strong&gt;Region Selector&lt;/strong&gt; to switch between regions and see how your resources vary.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Click on &lt;strong&gt;Events&lt;/strong&gt; to review system notifications such as upcoming maintenance or instance retirement.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 5:&lt;/strong&gt; Launch a small test EC2 instance:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Launch Instance&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10pk0unwx8ci73pc98ro.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%2F10pk0unwx8ci73pc98ro.png" alt="Launch Instance" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Choose &lt;strong&gt;Amazon Linux 2 AMI&lt;/strong&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%2Fc2wp1in6a177shlsqd9r.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%2Fc2wp1in6a177shlsqd9r.png" alt="Amazon Linux 2 AMI" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;t2.micro&lt;/strong&gt; (Free Tier eligible)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F405z4jgiqx5zqdw8lggm.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%2F405z4jgiqx5zqdw8lggm.png" alt="t2.micro" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Configure default &lt;strong&gt;VPC and subnet&lt;/strong&gt;&lt;br&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%2Fiznjn287u9ti763jrhu5.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%2Fiznjn287u9ti763jrhu5.png" alt="VPC and subnet" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attach a &lt;strong&gt;key pair&lt;/strong&gt; for SSH access&lt;br&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%2F50l0zwa67cz1r6xetf2u.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%2F50l0zwa67cz1r6xetf2u.png" alt="key pair" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch and verify the instance appears in the dashboard  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32cjua0t2ukljlzbmbi4.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%2F32cjua0t2ukljlzbmbi4.png" alt="lunch" width="496" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 6:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Explore other quick-access sections like &lt;strong&gt;Volumes&lt;/strong&gt;, &lt;strong&gt;Security Groups&lt;/strong&gt;, and &lt;strong&gt;Load Balancers&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  5. Best Practices for Dashboard Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always &lt;strong&gt;verify the region&lt;/strong&gt; before launching resources.
&lt;/li&gt;
&lt;li&gt;Regularly &lt;strong&gt;check Events&lt;/strong&gt; to avoid unexpected downtime.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;tags&lt;/strong&gt; for instances and resources to simplify management.
&lt;/li&gt;
&lt;li&gt;Combine the dashboard view with &lt;strong&gt;CloudWatch&lt;/strong&gt; for monitoring metrics and alarms.
&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;IAM roles&lt;/strong&gt; to restrict dashboard access according to the &lt;strong&gt;principle of least privilege&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Interview Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Basic:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is the EC2 Dashboard and why is it important?
&lt;/li&gt;
&lt;li&gt;Why is the region selector critical when managing EC2 resources?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Intermediate:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How do you monitor AWS maintenance events for your EC2 instances?
&lt;/li&gt;
&lt;li&gt;What is the difference between instance status and system status checks?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Advanced:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How can you replicate the dashboard view using AWS CLI or SDKs?
&lt;/li&gt;
&lt;li&gt;How do IAM policies affect visibility and access on the EC2 Dashboard?
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Summary
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;EC2 Dashboard&lt;/strong&gt; is your first stop for managing AWS compute resources.&lt;br&gt;&lt;br&gt;
By understanding its layout, components, and functionality, you can:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch and manage EC2 instances efficiently.
&lt;/li&gt;
&lt;li&gt;Monitor health and system events proactively.
&lt;/li&gt;
&lt;li&gt;Control access securely through IAM.
&lt;/li&gt;
&lt;li&gt;Lay the foundation for advanced EC2 topics like &lt;strong&gt;auto-scaling&lt;/strong&gt;, &lt;strong&gt;networking&lt;/strong&gt;, and &lt;strong&gt;monitoring&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Next in the Series:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;EC2 Global View – Managing Multi-Region EC2 Resources at a Glance&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AWS IAM ACCESS ANALYSIS &amp; REPORTS</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Thu, 09 Oct 2025 18:23:38 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/aws-iam-access-analysis-reports-31pc</link>
      <guid>https://dev.to/ntsezenelvis/aws-iam-access-analysis-reports-31pc</guid>
      <description>&lt;h1&gt;
  
  
  AWS IAM ACCESS ANALYSIS &amp;amp; REPORTS Deep Dive
&lt;/h1&gt;

&lt;h1&gt;
  
  
  aws #iam #security #devops
&lt;/h1&gt;

&lt;p&gt;📌 This article is part of the &lt;strong&gt;AWS IAM Deep Dive&lt;/strong&gt; series.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-users-deep-dive-3aj7"&gt;Part 1: IAM Users Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-groups-deep-dive-11b2"&gt;Part 2: IAM Groups Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/part-3-iam-roles-1if2"&gt;Part 3: IAM Roles Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4"&gt;Part 4: IAM Policies Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/identity-providers-18ka"&gt;Part 5: IAM Identity Providers Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/account-root-management-2oo"&gt;Part 6: AWS IAM ACCOUNT &amp;amp; ROOT MANAGEMENT Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 7:&lt;/strong&gt; &lt;strong&gt;AWS IAM Access Analysis &amp;amp; Reports Deep Dive (You’re here!)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. What is Access Analysis &amp;amp; Reports in IAM?
&lt;/h2&gt;

&lt;p&gt;AWS IAM Access Analysis &amp;amp; Reports are built-in tools that help you monitor, audit, and understand permissions across your AWS environment.&lt;br&gt;&lt;br&gt;
They help you detect &lt;strong&gt;unused, excessive, or risky permissions&lt;/strong&gt; — ensuring you always follow the &lt;strong&gt;principle of least privilege&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Key Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Access Analyzer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scans resource-based policies to identify public or cross-account access.
&lt;/li&gt;
&lt;li&gt;Detects exposure in S3, KMS, IAM roles, and Lambda layers.
&lt;/li&gt;
&lt;li&gt;Automatically monitors and flags new findings.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Detect if an S3 bucket policy accidentally allows &lt;code&gt;"Principal": "*"&lt;/code&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  Resource Analysis (New)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extends Access Analyzer to perform deep inspection at the resource level.
&lt;/li&gt;
&lt;li&gt;Reveals who can access specific resources and how that access is granted.
&lt;/li&gt;
&lt;li&gt;Ideal for pinpointing permission paths and exposure.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Check who can modify an EC2 security group or delete a Lambda function.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Unused Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Identifies permissions that have not been used within a set period (usually 90 days).
&lt;/li&gt;
&lt;li&gt;Helps you safely remove or restrict policies without affecting workloads.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Remove &lt;code&gt;ec2:DescribeInstances&lt;/code&gt; from users who haven’t accessed EC2 in 3 months.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Access Reports
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generate detailed reports for users, groups, and roles.
&lt;/li&gt;
&lt;li&gt;View permissions and service last accessed data for better auditing.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Review if a role still needs access to RDS or Lambda.  &lt;/p&gt;




&lt;h3&gt;
  
  
  🔑 Credential Reports
&lt;/h3&gt;

&lt;p&gt;Generate an account-wide CSV showing:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password last used
&lt;/li&gt;
&lt;li&gt;Access key age
&lt;/li&gt;
&lt;li&gt;MFA status
&lt;/li&gt;
&lt;li&gt;Last rotation date
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essential for &lt;strong&gt;compliance and governance&lt;/strong&gt; reviews.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Identify users with no MFA or old access keys.  &lt;/p&gt;




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

&lt;p&gt;Access Analysis &amp;amp; Reports help you:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect over-permissioned users and roles.
&lt;/li&gt;
&lt;li&gt;Identify publicly exposed resources.
&lt;/li&gt;
&lt;li&gt;Enforce compliance (SOC2, ISO, PCI).
&lt;/li&gt;
&lt;li&gt;Simplify audits and maintain governance visibility.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Hands-On Guide
&lt;/h2&gt;

&lt;p&gt;🎯 &lt;strong&gt;Goal:&lt;/strong&gt; Detect and Fix Over-Permissive Access  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Enable Access Analyzer
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM → Access Analyzer → Create Analyzer&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4zoaorndvzhl9urz3sv.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%2Fo4zoaorndvzhl9urz3sv.png" alt="Access Analyzer" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose your region
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Organization or Account scope&lt;/strong&gt;&lt;br&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%2Fefr1lhw0y4y2a5btoey9.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%2Fefr1lhw0y4y2a5btoey9.png" alt="IAccount scope" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create Analyzer&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fix23wxmta7b73ewy73it.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%2Fix23wxmta7b73ewy73it.png" alt="Create Analyzer" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS now continuously scans your environment for risky access.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 2: Review Findings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Findings&lt;/strong&gt; tab
&lt;/li&gt;
&lt;li&gt;Sort by &lt;em&gt;Public access&lt;/em&gt; or &lt;em&gt;Cross-account access&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Review each finding → &lt;strong&gt;Resolve&lt;/strong&gt; or &lt;strong&gt;Archive&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Tip:&lt;/em&gt; Use tags or filters to focus on sensitive resources only.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Generate a Credential Report
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam generate-credential-report  
aws iam get-credential-report &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Content'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;--decode&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; credential-report.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Review the CSV for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Users without MFA
&lt;/li&gt;
&lt;li&gt;Expired access keys
&lt;/li&gt;
&lt;li&gt;Root account usage
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4: Clean Up Unused Access
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM → Users → Access Advisor&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Remove permissions from inactive or unused services.
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;You’ve just completed a &lt;strong&gt;mini IAM audit!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Review Access Analyzer findings weekly
&lt;/li&gt;
&lt;li&gt;Rotate access keys every 90 days or less
&lt;/li&gt;
&lt;li&gt;Delete inactive users and roles immediately
&lt;/li&gt;
&lt;li&gt;Grant least privilege only
&lt;/li&gt;
&lt;li&gt;Automate credential report checks via Lambda or AWS Config
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Industry Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Enterprise:&lt;/strong&gt; Uses Access Analyzer org-wide to detect cross-account S3 exposure.&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;Finance:&lt;/strong&gt; Monthly credential report audits to maintain PCI compliance.&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;DevOps:&lt;/strong&gt; Automated alerts when new public access findings appear.&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;Startup:&lt;/strong&gt; Regular cleanup of unused IAM roles post-project delivery.  &lt;/p&gt;




&lt;h2&gt;
  
  
  7. Interview Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟢 Basic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is AWS Access Analyzer?
&lt;/li&gt;
&lt;li&gt;What’s the difference between Access Analyzer and Access Reports?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟡 Intermediate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How do you detect unused IAM permissions?
&lt;/li&gt;
&lt;li&gt;What information does a Credential Report contain?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔴 Advanced
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How can you automate IAM auditing using AWS Config or Lambda?
&lt;/li&gt;
&lt;li&gt;How would you secure multi-account Access Analyzer configurations?
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Access Analysis &amp;amp; Reports act as your &lt;strong&gt;AWS security microscope&lt;/strong&gt; — revealing what’s open, unused, or unsafe in your IAM setup.&lt;br&gt;&lt;br&gt;
Mastering these tools helps you maintain &lt;strong&gt;visibility, control, and compliance&lt;/strong&gt; across all AWS accounts.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Access Analyzer&lt;/strong&gt; to detect risky access.
&lt;/li&gt;
&lt;li&gt;Generate &lt;strong&gt;credential reports&lt;/strong&gt; regularly.
&lt;/li&gt;
&lt;li&gt;Remove &lt;strong&gt;unused permissions&lt;/strong&gt; proactively.
&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;least privilege&lt;/strong&gt; continuously.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If this helped:&lt;br&gt;&lt;br&gt;
❤️ Leave a like and follow for more AWS/DevOps deep dives&lt;br&gt;&lt;br&gt;
💬 Comment your IAM audit tips or questions&lt;br&gt;&lt;br&gt;
🔗 Share with your team to promote better AWS security hygiene  &lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Hurray you've completed the IAM Deep Dive Series&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>iam</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>ACCOUNT &amp; ROOT MANAGEMENT</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Wed, 08 Oct 2025 14:47:42 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/account-root-management-2oo</link>
      <guid>https://dev.to/ntsezenelvis/account-root-management-2oo</guid>
      <description>&lt;h1&gt;
  
  
  AWS IAM ACCOUNT &amp;amp; ROOT MANAGEMENT Deep Dive
&lt;/h1&gt;

&lt;p&gt;📌 This article is part of the &lt;strong&gt;AWS IAM Deep Dive&lt;/strong&gt; series.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-users-deep-dive-3aj7"&gt;Part 1: IAM Users Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-groups-deep-dive-11b2"&gt;Part 2: IAM Groups Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/part-3-iam-roles-1if2"&gt;Part 3: IAM Roles Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4"&gt;Part 4: IAM Policies Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/identity-providers-18ka"&gt;Part 5: IAM Identity Providers Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - Part 6: AWS IAM ACCOUNT &amp;amp; ROOT MANAGEMENT Deep Dive
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. What Is Account &amp;amp; Root Management in AWS IAM?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Account &amp;amp; Root Management&lt;/strong&gt; focuses on securing the foundation of your AWS environment. Your root user, account settings, and password policies.  &lt;/p&gt;

&lt;p&gt;Since the root user has full, unrestricted access, it’s the most powerful (and dangerous) identity in your AWS account.  &lt;/p&gt;

&lt;p&gt;Proper management ensures you protect this identity while enforcing strong authentication and governance across all users.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Root Account — Handle With Extreme Care
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;root user&lt;/strong&gt; is automatically created when you first set up your AWS account.&lt;br&gt;&lt;br&gt;
It can perform &lt;em&gt;any action&lt;/em&gt;, including deleting your entire account — which is why it should rarely (if ever) be used.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Dangers of Using the Root Account
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bypasses IAM permissions and SCP restrictions
&lt;/li&gt;
&lt;li&gt;Can delete CloudTrail logs or disable billing alerts
&lt;/li&gt;
&lt;li&gt;Often targeted in phishing and credential theft attacks
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Securing the Root Account
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Enable MFA (Multi-Factor Authentication)
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;IAM → Dashboard → Activate MFA on Root Account&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Choose &lt;strong&gt;Virtual MFA&lt;/strong&gt; (e.g., Google Authenticator) or &lt;strong&gt;Hardware MFA token&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%2Fr563tk4r4ghck238fdgw.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%2Fr563tk4r4ghck238fdgw.png" alt="MFA description" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Prevents unauthorized sign-in even if your password is leaked.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Create an Admin IAM User
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a new IAM user (e.g., &lt;code&gt;admin-user&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;Assign it &lt;code&gt;AdministratorAccess&lt;/code&gt; permissions
&lt;/li&gt;
&lt;li&gt;Use this account for all administrative actions — &lt;em&gt;not the root user&lt;/em&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%2Fpew9akcuxpl20128ihwf.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%2Fpew9akcuxpl20128ihwf.png" alt="root account" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Store root credentials securely and use them only for critical tasks like billing or MFA recovery.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Add Recovery Contacts
&lt;/h3&gt;

&lt;p&gt;Add alternate contacts under &lt;strong&gt;Account Settings → Alternate Contacts&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Include &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;billing&lt;/strong&gt;, and &lt;strong&gt;operations&lt;/strong&gt; emails.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ensures AWS sends alerts to the right teams if incidents occur.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔑 Step 4: Rotate and Secure Credentials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use a &lt;strong&gt;password manager&lt;/strong&gt; to store root credentials
&lt;/li&gt;
&lt;li&gt;Rotate them &lt;strong&gt;at least once a year&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Never embed root credentials in scripts or CI/CD tools
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Enforcing Account-Wide Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Password Policies
&lt;/h3&gt;

&lt;p&gt;Set strong password policies for IAM users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum &lt;strong&gt;12 characters&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Require &lt;strong&gt;uppercase, lowercase, number, and symbol&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Prevent password reuse
&lt;/li&gt;
&lt;li&gt;Force rotation every &lt;strong&gt;90 days&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  CLI Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam update-account-password-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--minimum-password-length&lt;/span&gt; 12 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--require-symbols&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--require-numbers&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--require-uppercase-characters&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--require-lowercase-characters&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-users-to-change-password&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-password-age&lt;/span&gt; 90 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--password-reuse-prevention&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Account Settings Overview
&lt;/h2&gt;

&lt;p&gt;From &lt;strong&gt;IAM → Account Settings&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable password policies
&lt;/li&gt;
&lt;li&gt;Configure sign-in URLs
&lt;/li&gt;
&lt;li&gt;Enforce MFA on all users
&lt;/li&gt;
&lt;li&gt;Set up an &lt;strong&gt;AWS Account Alias&lt;/strong&gt; (e.g., &lt;code&gt;company-login.awsapps.com&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Custom aliases make it easier and safer for employees to sign in.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use the root account only for &lt;strong&gt;account setup and billing tasks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable MFA&lt;/strong&gt; immediately after creating your AWS account
&lt;/li&gt;
&lt;li&gt;Delegate admin access to an &lt;strong&gt;IAM user or role&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Regularly review account security from the &lt;strong&gt;IAM Dashboard&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Audit root account usage via &lt;strong&gt;CloudTrail events&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Hands-On Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Goal: Lock Down the Root Account
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Enable MFA on Root
&lt;/h4&gt;

&lt;p&gt;Go to &lt;strong&gt;IAM Dashboard → Security Recommendations → MFA on Root Account → Activate&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%2Fozhg6vb5kr5dvxy0kjij.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%2Fozhg6vb5kr5dvxy0kjij.png" alt="MFA" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flinkvewzvnh4gdnl063y.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%2Flinkvewzvnh4gdnl063y.png" alt="MFA-NAME" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa6uguhk8almpnrds1yb.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%2Faa6uguhk8almpnrds1yb.png" alt="SAN MFA" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scan the QR code and store backup codes securely.&lt;/p&gt;




&lt;h4&gt;
  
  
  Step 2: Create a Secure IAM Admin User
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; admin-user
aws iam attach-user-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; admin-user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AdministratorAccess
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test logging in as &lt;code&gt;admin-user&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 3: Disable Root API Keys
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;My Security Credentials → Access Keys&lt;/strong&gt; and delete any active keys.  &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%2Fwt0l9pzl2p2udvsohu5z.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%2Fwt0l9pzl2p2udvsohu5z.png" alt="security-credentials" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Root should never have long-term access keys.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Industry Examples
&lt;/h2&gt;

&lt;p&gt;🏢 &lt;strong&gt;Enterprise:&lt;/strong&gt; Root account locked and controlled by InfoSec team; access only via MFA hardware token in a secure vault.&lt;br&gt;&lt;br&gt;
💻 &lt;strong&gt;Startup:&lt;/strong&gt; Single owner uses root account only for billing, with daily operations done by IAM admins.&lt;br&gt;&lt;br&gt;
💰 &lt;strong&gt;Finance:&lt;/strong&gt; Strict password policy enforced with quarterly credential audits.&lt;br&gt;&lt;br&gt;
🚀 &lt;strong&gt;DevOps:&lt;/strong&gt; Admin roles delegated via AWS SSO, root used only for account recovery.  &lt;/p&gt;




&lt;h2&gt;
  
  
  8. Interview Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟢 Basic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is the AWS root user?
&lt;/li&gt;
&lt;li&gt;Why should you avoid using the root account daily?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟡 Intermediate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How do you enable MFA on the root account?
&lt;/li&gt;
&lt;li&gt;What does the account password policy control?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔴 Advanced
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How can CloudTrail be used to monitor root account activity?
&lt;/li&gt;
&lt;li&gt;How do you secure multiple AWS accounts under one organization?
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The root account is the &lt;strong&gt;heart of your AWS environment&lt;/strong&gt; — protect it like a &lt;strong&gt;crown jewel&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
By enforcing MFA, password policies, and restricted usage, you build a &lt;strong&gt;strong foundation&lt;/strong&gt; for all IAM security that follows.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Never use root for daily operations
&lt;/li&gt;
&lt;li&gt;Enable MFA and disable root access keys
&lt;/li&gt;
&lt;li&gt;Create an IAM admin for management
&lt;/li&gt;
&lt;li&gt;Enforce strong password and recovery policies
&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helped:&lt;br&gt;&lt;br&gt;
❤️ Leave a like and &lt;strong&gt;follow for more AWS/DevOps deep dives&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
💬 Comment your IAM security tips&lt;br&gt;&lt;br&gt;
🔗 Share with your team to promote better AWS hygiene  &lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Stay tuned for the next part of the IAM Deep Dive Series!&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>security</category>
      <category>aws</category>
    </item>
    <item>
      <title>IDENTITY PROVIDERS</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Fri, 03 Oct 2025 19:17:45 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/identity-providers-18ka</link>
      <guid>https://dev.to/ntsezenelvis/identity-providers-18ka</guid>
      <description>&lt;h2&gt;
  
  
  AWS IAM IDENTITY PROVIDERS Deep Dive
&lt;/h2&gt;

&lt;h1&gt;
  
  
  iamidentityproviders #iamroles #iam #aws
&lt;/h1&gt;

&lt;p&gt;📌 This article is part of the &lt;strong&gt;AWS IAM Deep Dive&lt;/strong&gt; series.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-users-deep-dive-3aj7"&gt;Part 1: IAM Users Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-groups-deep-dive-11b2"&gt;Part 2: IAM Groups Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/part-3-iam-roles-1if2"&gt;Part 3: IAM Roles Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4"&gt;Part 4: IAM Policies Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 5: IAM Identity Providers Deep Dive(&lt;a href="https://dev.to/ntsezenelvis/identity-providers-18ka"&gt;https://dev.to/ntsezenelvis/identity-providers-18ka&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  PART 5: IAM IDENTITY PROVIDERS
&lt;/h1&gt;

&lt;h1&gt;
  
  
  aws #iam #security #devops
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. What is an IAM Identity Provider?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;IAM Identity Provider (IdP)&lt;/strong&gt; is a trusted external system (e.g., Okta, Azure AD, Google, GitHub, Auth0) that enables &lt;strong&gt;federated authentication into AWS&lt;/strong&gt; without the need for creating long-lived IAM users.  &lt;/p&gt;

&lt;p&gt;Instead of storing AWS credentials locally, users authenticate with the IdP and assume roles in AWS through &lt;strong&gt;STS (Security Token Service)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Types of IAM Identity Providers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SAML 2.0&lt;/strong&gt; → Enterprise IdPs like Okta, Azure AD, ADFS.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDC (OpenID Connect)&lt;/strong&gt; → Modern apps (Google, GitHub, Auth0).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognito&lt;/strong&gt; → AWS-managed identity provider with social login support.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Identity Federation&lt;/strong&gt; → Direct federation with STS AssumeRoleWithWebIdentity.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Trust Policy vs Permission Policy
&lt;/h2&gt;

&lt;p&gt;📌 IAM roles with IdPs use &lt;strong&gt;two types of policies&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trust Policy&lt;/strong&gt; → Defines &lt;em&gt;who&lt;/em&gt; can assume the role (the external IdP).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission Policy&lt;/strong&gt; → Defines &lt;em&gt;what&lt;/em&gt; actions the role can perform in AWS.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Trust Policy (SAML Federation with Okta)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Federated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::123456789012:saml-provider/MyOktaIdP"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts:AssumeRoleWithSAML"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"StringEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"SAML:aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://signin.aws.amazon.com/saml"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Common Problems with Identity Providers
&lt;/h2&gt;

&lt;p&gt;🔴 Misconfigured SAML metadata (expired certificate or mismatch)&lt;br&gt;&lt;br&gt;
🔴 Overly broad trust policies (&lt;code&gt;Principal: *&lt;/code&gt;)&lt;br&gt;&lt;br&gt;
🔴 Missing MFA enforcement in federation&lt;br&gt;&lt;br&gt;
🔴 Roles granting excessive session durations (12h+)  &lt;/p&gt;


&lt;h2&gt;
  
  
  5. Best Practices
&lt;/h2&gt;

&lt;p&gt;✅ Always use &lt;strong&gt;short-lived credentials&lt;/strong&gt; (1–12 hours max)&lt;br&gt;&lt;br&gt;
✅ Enforce &lt;strong&gt;MFA via IdP&lt;/strong&gt; + AWS conditions (&lt;code&gt;aws:MultiFactorAuthPresent&lt;/code&gt;)&lt;br&gt;&lt;br&gt;
✅ Map IdP &lt;strong&gt;groups to roles&lt;/strong&gt; in AWS (least privilege principle)&lt;br&gt;&lt;br&gt;
✅ Rotate &lt;strong&gt;SAML/OIDC metadata &amp;amp; thumbprints&lt;/strong&gt; regularly&lt;br&gt;&lt;br&gt;
✅ Monitor &lt;strong&gt;STS AssumeRole events&lt;/strong&gt; in CloudTrail  &lt;/p&gt;


&lt;h2&gt;
  
  
  6. Hands-On Guide
&lt;/h2&gt;
&lt;h1&gt;
  
  
  Simple Example: GitHub Actions → AWS
&lt;/h1&gt;
&lt;h2&gt;
  
  
  What we're building:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Allow GitHub Actions to upload files to an S3 bucket&lt;/li&gt;
&lt;li&gt;No complex SAML setup - using OIDC (modern, simpler approach)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step-by-Step in 4 Simple Steps
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Create OIDC Identity Provider in AWS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go to IAM → Identity Providers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click "Add Provider"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choose "OpenID Connect"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provider URL:&lt;/strong&gt; &lt;code&gt;https://token.actions.githubusercontent.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audience:&lt;/strong&gt; &lt;code&gt;sts.amazonaws.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi7nu7la3rs9z4skmxlg.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%2Fbi7nu7la3rs9z4skmxlg.png" alt="OIDC Setup" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Click "Add provider"&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ &lt;strong&gt;Done!&lt;/strong&gt; AWS now trusts GitHub.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Create IAM Role - Trust Policy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CHANGE THIS PART:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Federated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::[YOUR-AWS-ACCOUNT-ID]:oidc-provider/token.actions.githubusercontent.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts:AssumeRoleWithWebIdentity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"StringEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"token.actions.githubusercontent.com:aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"token.actions.githubusercontent.com:sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"repo:[YOUR-GITHUB-USERNAME]/[YOUR-REPO-NAME]:ref:refs/heads/main"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&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%2F0ra8jafjlr3hll9saqkc.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%2F0ra8jafjlr3hll9saqkc.png" alt="trusted policy" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change these 3 things:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[YOUR-AWS-ACCOUNT-ID]&lt;/code&gt; → Your 12-digit AWS account number&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[YOUR-GITHUB-USERNAME]&lt;/code&gt; → Your GitHub username or organization name
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[YOUR-REPO-NAME]&lt;/code&gt; → Your repository name&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Add Permissions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Attach policy:&lt;/strong&gt; &lt;code&gt;AmazonS3FullAccess&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click "Next"&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9rbw5457cllwmw2ujbv.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%2Fx9rbw5457cllwmw2ujbv.png" alt="AmazonS3FullAccess" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Create Workflow File
&lt;/h2&gt;

&lt;p&gt;Create: &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CHANGE THIS PART:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to S3&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;   &lt;span class="c1"&gt;# ← KEEP THIS LINE&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&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@v3&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;Configure AWS credentials&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::[YOUR-AWS-ACCOUNT-ID]:role/github-actions-s3-deploy&lt;/span&gt;
        &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;   &lt;span class="c1"&gt;# ← Change region if needed&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;Upload to S3&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;aws s3 sync ./ s3://[YOUR-BUCKET-NAME]/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change these 3 things:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[YOUR-AWS-ACCOUNT-ID] → Same 12-digit AWS account number&lt;/p&gt;

&lt;p&gt;us-east-1 → Your AWS region if different&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Industry Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Startup:&lt;/strong&gt; Developers use Google OIDC federation for AWS CLI access.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; Okta SAML federation with AWS Organizations → mapped roles per business unit.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Finance:&lt;/strong&gt; MFA enforced on SAML federation roles for compliance (PCI, SOX).&lt;br&gt;&lt;br&gt;
&lt;strong&gt;DevOps:&lt;/strong&gt; GitHub Actions OIDC → AssumeRole directly in AWS without storing long-lived secrets.  &lt;/p&gt;




&lt;h2&gt;
  
  
  8. Interview Questions
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;What is an IAM Identity Provider?
&lt;/li&gt;
&lt;li&gt;Difference between &lt;strong&gt;SAML 2.0&lt;/strong&gt; and &lt;strong&gt;OIDC&lt;/strong&gt;?
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;How does &lt;code&gt;sts:AssumeRoleWithSAML&lt;/code&gt; work?
&lt;/li&gt;
&lt;li&gt;Explain the difference between &lt;strong&gt;Trust Policy&lt;/strong&gt; and &lt;strong&gt;Permission Policy&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;How do you scale identity federation across multiple AWS accounts?
&lt;/li&gt;
&lt;li&gt;How do you securely rotate OIDC thumbprints?
&lt;/li&gt;
&lt;li&gt;How do IAM IdPs integrate with AWS Organizations SCPs?
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🙏 &lt;strong&gt;Wrapping Up&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
IAM Identity Providers act as the &lt;strong&gt;bridge between external authentication systems and AWS IAM&lt;/strong&gt;. They remove the need for long-lived IAM credentials and enable &lt;strong&gt;federated, secure, and scalable authentication&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;🔑 &lt;strong&gt;Key takeaways:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;trust + permission policies&lt;/strong&gt; correctly
&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;short-lived sessions &amp;amp; MFA&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Monitor &amp;amp; audit federation events
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Thanks for reading! If this helped:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave a ❤️ reaction and follow for more AWS/DevOps deep dives
&lt;/li&gt;
&lt;li&gt;Drop your federation experiences/questions in the comments 💬
&lt;/li&gt;
&lt;li&gt;Share with your team to promote &lt;strong&gt;SSO best practices&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Stay tuned for the next deep dive in this IAM series!  &lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>IAM POLICIES</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Wed, 01 Oct 2025 11:29:37 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/iam-policies-16ma</link>
      <guid>https://dev.to/ntsezenelvis/iam-policies-16ma</guid>
      <description>&lt;h2&gt;
  
  
  AWS IAM Groups Deep Dive
&lt;/h2&gt;

&lt;h1&gt;
  
  
  iamgroups #iamusers #iamroles #iampolicies
&lt;/h1&gt;

&lt;p&gt;📌 This article is part of the &lt;strong&gt;AWS IAM Deep Dive&lt;/strong&gt; series.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-users-deep-dive-3aj7"&gt;Part 1: IAM Users Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/aws-iam-groups-deep-dive-11b2"&gt;Part 2: IAM Groups Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/part-3-iam-roles-1if2"&gt;Part 3: IAM Roles Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  PART 4: IAM POLICIES
&lt;/h1&gt;

&lt;h1&gt;
  
  
  aws #iam #devops #cloud
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS IAM Policies Complete Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is an IAM Policy?
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;IAM Policy&lt;/strong&gt; is a JSON document that defines permissions in AWS. Policies specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who can access (via users, groups, or roles)
&lt;/li&gt;
&lt;li&gt;What actions can be performed
&lt;/li&gt;
&lt;li&gt;On which resources (ARNs)
&lt;/li&gt;
&lt;li&gt;Under what conditions (e.g., IP, MFA, tags)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are the building blocks of access control in AWS, attached to identities (IAM users, groups, roles) or directly to resources (S3 buckets, KMS keys, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Core Characteristics of IAM Policies
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Policy Types
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Managed Policies&lt;/strong&gt;: AWS-managed or customer-managed, reusable across identities
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Policies&lt;/strong&gt;: Embedded directly into a user/group/role (one-to-one relationship)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Policy Document Structure
&lt;/h4&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="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"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="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="s2"&gt;"arn:aws:s3:::my-bucket/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Bool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Effect&lt;/strong&gt;: Allow or Deny (explicit deny always wins)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;: API operations (e.g., ec2:StartInstances)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource&lt;/strong&gt;: Specific resources by ARN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Condition&lt;/strong&gt;: Contextual restrictions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Policy Evaluation Logic&lt;br&gt;
Start with default deny&lt;/p&gt;

&lt;p&gt;Apply explicit denies&lt;/p&gt;

&lt;p&gt;Apply explicit allows&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Common Problems With IAM Policies&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔴 &lt;strong&gt;Overly broad policies:&lt;/strong&gt; Using Action:"&lt;em&gt;" and Resource:"&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Inline policies sprawl:&lt;/strong&gt; Hard to manage since they are tied to a single identity&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Policy size/limits:&lt;/strong&gt; Limited to 6,144 characters; too many statements cause scaling issues&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Lack of conditions:&lt;/strong&gt; Granting access without MFA/IP conditions increases attack surface&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Dependency confusion:&lt;/strong&gt; Mixing AWS-managed and customer-managed policies without documentation&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solutions and Best Practices&lt;/strong&gt;
&lt;em&gt;Policy Management&lt;/em&gt;
Use customer-managed policies instead of inline for reusability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow least privilege principle → grant only required actions on specific resources&lt;/p&gt;

&lt;p&gt;Use IAM Access Analyzer to validate and detect broad access&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Hardening&lt;/strong&gt;&lt;br&gt;
Add MFA requirements in conditions&lt;/p&gt;

&lt;p&gt;Use tags &amp;amp; conditions for environment-based restrictions (e.g., Environment=Prod)&lt;/p&gt;

&lt;p&gt;Avoid attaching AdministratorAccess except for break-glass scenarios&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lifecycle Management&lt;/strong&gt;&lt;br&gt;
Version and track policies with IaC (Terraform/CloudFormation)&lt;/p&gt;

&lt;p&gt;Regularly run IAM Access Advisor to remove unused permissions&lt;/p&gt;

&lt;p&gt;Review SCPs in AWS Organizations for org-wide boundaries&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Industry Examples&lt;/strong&gt;
&lt;strong&gt;Startup:&lt;/strong&gt; Developers share a S3ReadWritePolicy (customer-managed) attached to a group; inline avoided&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Enterprise:&lt;/strong&gt; Hundreds of microservices → policies modularized per service; SCPs block public S3 buckets&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finance:&lt;/strong&gt; MFA required for sensitive actions (ec2:TerminateInstances); quarterly compliance reviews&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps:&lt;/strong&gt; Policies stored in Git, deployed via Terraform; CI/CD pipeline lints policies to prevent &lt;em&gt;:&lt;/em&gt; mistakes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interview Questions on IAM Policies&lt;/strong&gt;
&lt;strong&gt;Basic Level&lt;/strong&gt;
&lt;strong&gt;What is an IAM Policy?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Difference between AWS-managed and customer-managed policies?&lt;/p&gt;

&lt;p&gt;Inline policy vs. managed policy?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intermediate Level&lt;/strong&gt;&lt;br&gt;
How does IAM policy evaluation logic work?&lt;/p&gt;

&lt;p&gt;How would you enforce least privilege?&lt;/p&gt;

&lt;p&gt;Why is Deny more powerful than Allow?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advanced Level&lt;/strong&gt;&lt;br&gt;
How do you design scalable IAM policies across multiple AWS accounts?&lt;/p&gt;

&lt;p&gt;How do SCPs and IAM policies interact?&lt;/p&gt;

&lt;p&gt;How do you restrict actions to specific environments (dev vs. prod)?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hands-On Guide&lt;/strong&gt;
Pre-checks
You must have IAM rights: iam:CreatePolicy, iam:AttachUserPolicy, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Decide: inline or managed? AWS-managed or customer-managed?&lt;/p&gt;

&lt;p&gt;Define scope: Actions, Resources, Conditions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Console Steps&lt;/strong&gt;&lt;br&gt;
Open IAM Console → Policies → Create policy&lt;/p&gt;

&lt;p&gt;Choose Visual editor or JSON&lt;/p&gt;

&lt;p&gt;Define actions (e.g., s3:GetObject)&lt;/p&gt;

&lt;p&gt;Select resources (specific bucket ARN)&lt;/p&gt;

&lt;p&gt;Add optional conditions (MFA, IP, tags)&lt;/p&gt;

&lt;p&gt;Review and create&lt;/p&gt;

&lt;p&gt;CLI Examples&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 a customer-managed policy&lt;/span&gt;
aws iam create-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-name&lt;/span&gt; S3ReadOnlyPolicy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-document&lt;/span&gt; file://s3readonly.json
&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="c"&gt;# Attach policy to a user&lt;/span&gt;
aws iam attach-user-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; dev-alice &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::123456789012:policy/S3ReadOnlyPolicy
&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="c"&gt;# List policies attached to a group&lt;/span&gt;
aws iam list-attached-group-policies &lt;span class="nt"&gt;--group-name&lt;/span&gt; Developers
&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="c"&gt;# Detach policy&lt;/span&gt;
aws iam detach-role-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; EC2AppRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
&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="c"&gt;# Delete policy (cleanup)&lt;/span&gt;
aws iam delete-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::123456789012:policy/S3ReadOnlyPolicy
Automation &amp;amp; Reporting
&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="c"&gt;# Validate policy with Access Analyzer&lt;/span&gt;
aws accessanalyzer validate-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-document&lt;/span&gt; file://s3readonly.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-type&lt;/span&gt; IDENTITY_POLICY
&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="c"&gt;# List unused policies&lt;/span&gt;
aws iam list-policies &lt;span class="nt"&gt;--scope&lt;/span&gt; Local &lt;span class="nt"&gt;--only-attached&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🙏 Wrapping Up&lt;br&gt;
IAM Policies are the foundation of AWS security.&lt;br&gt;
By writing clear, reusable, and least-privileged policies, you can build strong guardrails for your environment.&lt;/p&gt;

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

&lt;p&gt;Prefer managed over inline&lt;/p&gt;

&lt;p&gt;Always validate with Access Analyzer&lt;/p&gt;

&lt;p&gt;Automate with IaC for versioning and consistency&lt;/p&gt;

&lt;p&gt;✅ Thanks for reading! If this helped, don’t forget to:&lt;/p&gt;

&lt;p&gt;Leave a reaction and follow for more AWS/DevOps guides&lt;/p&gt;

&lt;p&gt;Drop your questions or examples of policy misconfigurations&lt;/p&gt;

&lt;p&gt;Share this with your team so everyone follows least privilege best practices&lt;/p&gt;

&lt;p&gt;🚀 Stay tuned for the next deep dive in this series!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>AWS IAM POLICIES Deep Dive</title>
      <dc:creator>Ntseze-Nelvis</dc:creator>
      <pubDate>Tue, 30 Sep 2025 12:53:42 +0000</pubDate>
      <link>https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4</link>
      <guid>https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4</guid>
      <description>&lt;h2&gt;
  
  
  AWS IAM POLICIES Deep Dive
&lt;/h2&gt;

&lt;h1&gt;
  
  
  iamgroups #iamusers #iamroles #iampolicies
&lt;/h1&gt;

&lt;p&gt;📌 This article is part of the &lt;strong&gt;AWS IAM Deep Dive&lt;/strong&gt; series.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/ntsezenelvis/aws-iam-users-deep-dive-3aj7"&gt;Part 1: IAM Users Deep Dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/aws-iam-groups-deep-dive-11b2"&gt;Part 2: IAM Groups Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/part-3-iam-roles-1if2"&gt;Part 3: IAM Roles Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ntsezenelvis/aws-iam-policies-deep-dive-nm4"&gt;Part 4: IAM Policies Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  PART 4: IAM POLICIES
&lt;/h1&gt;

&lt;h1&gt;
  
  
  aws #iam #devops #cloud
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS IAM Policies Complete Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is an IAM Policy?
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;IAM Policy&lt;/strong&gt; is a JSON document that defines permissions in AWS. Policies specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who can access (via users, groups, or roles)
&lt;/li&gt;
&lt;li&gt;What actions can be performed
&lt;/li&gt;
&lt;li&gt;On which resources (ARNs)
&lt;/li&gt;
&lt;li&gt;Under what conditions (e.g., IP, MFA, tags)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are the building blocks of access control in AWS, attached to identities (IAM users, groups, roles) or directly to resources (S3 buckets, KMS keys, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Core Characteristics of IAM Policies
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Policy Types
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Managed Policies&lt;/strong&gt;: AWS-managed or customer-managed, reusable across identities
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Policies&lt;/strong&gt;: Embedded directly into a user/group/role (one-to-one relationship)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Policy Document Structure
&lt;/h4&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="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"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="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="s2"&gt;"arn:aws:s3:::my-bucket/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Bool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Effect&lt;/strong&gt;: Allow or Deny (explicit deny always wins)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;: API operations (e.g., ec2:StartInstances)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource&lt;/strong&gt;: Specific resources by ARN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Condition&lt;/strong&gt;: Contextual restrictions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Policy Evaluation Logic&lt;br&gt;
Start with default deny&lt;/p&gt;

&lt;p&gt;Apply explicit denies&lt;/p&gt;

&lt;p&gt;Apply explicit allows&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Common Problems With IAM Policies&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔴 &lt;strong&gt;Overly broad policies:&lt;/strong&gt; Using Action:"&lt;em&gt;" and Resource:"&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Inline policies sprawl:&lt;/strong&gt; Hard to manage since they are tied to a single identity&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Policy size/limits:&lt;/strong&gt; Limited to 6,144 characters; too many statements cause scaling issues&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Lack of conditions:&lt;/strong&gt; Granting access without MFA/IP conditions increases attack surface&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;Dependency confusion:&lt;/strong&gt; Mixing AWS-managed and customer-managed policies without documentation&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solutions and Best Practices&lt;/strong&gt;
&lt;em&gt;Policy Management&lt;/em&gt;
Use customer-managed policies instead of inline for reusability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow least privilege principle → grant only required actions on specific resources&lt;/p&gt;

&lt;p&gt;Use IAM Access Analyzer to validate and detect broad access&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Hardening&lt;/strong&gt;&lt;br&gt;
Add MFA requirements in conditions&lt;/p&gt;

&lt;p&gt;Use tags &amp;amp; conditions for environment-based restrictions (e.g., Environment=Prod)&lt;/p&gt;

&lt;p&gt;Avoid attaching AdministratorAccess except for break-glass scenarios&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lifecycle Management&lt;/strong&gt;&lt;br&gt;
Version and track policies with IaC (Terraform/CloudFormation)&lt;/p&gt;

&lt;p&gt;Regularly run IAM Access Advisor to remove unused permissions&lt;/p&gt;

&lt;p&gt;Review SCPs in AWS Organizations for org-wide boundaries&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Industry Examples&lt;/strong&gt;
&lt;strong&gt;Startup:&lt;/strong&gt; Developers share a S3ReadWritePolicy (customer-managed) attached to a group; inline avoided&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Enterprise:&lt;/strong&gt; Hundreds of microservices → policies modularized per service; SCPs block public S3 buckets&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finance:&lt;/strong&gt; MFA required for sensitive actions (ec2:TerminateInstances); quarterly compliance reviews&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps:&lt;/strong&gt; Policies stored in Git, deployed via Terraform; CI/CD pipeline lints policies to prevent &lt;em&gt;:&lt;/em&gt; mistakes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interview Questions on IAM Policies&lt;/strong&gt;
&lt;strong&gt;Basic Level&lt;/strong&gt;
&lt;strong&gt;What is an IAM Policy?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Difference between AWS-managed and customer-managed policies?&lt;/p&gt;

&lt;p&gt;Inline policy vs. managed policy?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intermediate Level&lt;/strong&gt;&lt;br&gt;
How does IAM policy evaluation logic work?&lt;/p&gt;

&lt;p&gt;How would you enforce least privilege?&lt;/p&gt;

&lt;p&gt;Why is Deny more powerful than Allow?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advanced Level&lt;/strong&gt;&lt;br&gt;
How do you design scalable IAM policies across multiple AWS accounts?&lt;/p&gt;

&lt;p&gt;How do SCPs and IAM policies interact?&lt;/p&gt;

&lt;p&gt;How do you restrict actions to specific environments (dev vs. prod)?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hands-On Guide&lt;/strong&gt;
Pre-checks
You must have IAM rights: iam:CreatePolicy, iam:AttachUserPolicy, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Decide: inline or managed? AWS-managed or customer-managed?&lt;/p&gt;

&lt;p&gt;Define scope: Actions, Resources, Conditions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Console Steps&lt;/strong&gt;&lt;br&gt;
Open IAM Console → Policies → Create policy&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%2F5nvansfgo0wulfuy4kyr.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%2F5nvansfgo0wulfuy4kyr.png" alt=" " width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose Visual editor or JSON&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%2F96mkcq0v1sc24iigbp1t.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%2F96mkcq0v1sc24iigbp1t.png" alt="s3 get" width="800" height="284"&gt;&lt;/a&gt;&lt;br&gt;
Define actions (e.g., s3:GetObject)&lt;br&gt;
Select resources (specific bucket ARN)&lt;br&gt;
Add optional conditions (MFA, IP, tags)&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%2Fs7tvs80knixlrysiierj.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%2Fs7tvs80knixlrysiierj.png" alt="description of s3" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Review and create&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%2Fixyb1g35i58neuvt2c5x.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%2Fixyb1g35i58neuvt2c5x.png" alt="role created" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CLI Examples&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 a customer-managed policy&lt;/span&gt;
aws iam create-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-name&lt;/span&gt; S3ReadOnlyPolicy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-document&lt;/span&gt; file://s3readonly.json
&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="c"&gt;# Attach policy to a user&lt;/span&gt;
aws iam attach-user-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; dev-alice &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::123456789012:policy/S3ReadOnlyPolicy
&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="c"&gt;# List policies attached to a group&lt;/span&gt;
aws iam list-attached-group-policies &lt;span class="nt"&gt;--group-name&lt;/span&gt; Developers
&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="c"&gt;# Detach policy&lt;/span&gt;
aws iam detach-role-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; EC2AppRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
&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="c"&gt;# Delete policy (cleanup)&lt;/span&gt;
aws iam delete-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::123456789012:policy/S3ReadOnlyPolicy
Automation &amp;amp; Reporting
&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="c"&gt;# Validate policy with Access Analyzer&lt;/span&gt;
aws accessanalyzer validate-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-document&lt;/span&gt; file://s3readonly.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-type&lt;/span&gt; IDENTITY_POLICY
&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="c"&gt;# List unused policies&lt;/span&gt;
aws iam list-policies &lt;span class="nt"&gt;--scope&lt;/span&gt; Local &lt;span class="nt"&gt;--only-attached&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🙏 Wrapping Up&lt;br&gt;
IAM Policies are the foundation of AWS security.&lt;br&gt;
By writing clear, reusable, and least-privileged policies, you can build strong guardrails for your environment.&lt;/p&gt;

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

&lt;p&gt;Prefer managed over inline&lt;/p&gt;

&lt;p&gt;Always validate with Access Analyzer&lt;/p&gt;

&lt;p&gt;Automate with IaC for versioning and consistency&lt;/p&gt;

&lt;p&gt;✅ Thanks for reading! If this helped, don’t forget to:&lt;/p&gt;

&lt;p&gt;Leave a reaction and follow for more AWS/DevOps guides&lt;/p&gt;

&lt;p&gt;Drop your questions or examples of policy misconfigurations&lt;/p&gt;

&lt;p&gt;Share this with your team so everyone follows least privilege best practices&lt;/p&gt;

&lt;p&gt;🚀 Stay tuned for the next deep dive in this series!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
