<?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>Forem: Abdiel Jonathan</title>
    <description>The latest articles on Forem by Abdiel Jonathan (@abdieljonathan007).</description>
    <link>https://forem.com/abdieljonathan007</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%2F3567536%2F3031d44c-9f01-46c2-b6c0-4da8eee17f7e.png</url>
      <title>Forem: Abdiel Jonathan</title>
      <link>https://forem.com/abdieljonathan007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/abdieljonathan007"/>
    <language>en</language>
    <item>
      <title>Deploying a Secure &amp; Scalable Web App on AWS EC2 (No ECS, No Beanstalk!)</title>
      <dc:creator>Abdiel Jonathan</dc:creator>
      <pubDate>Wed, 15 Oct 2025 20:43:01 +0000</pubDate>
      <link>https://forem.com/abdieljonathan007/deploying-a-secure-scalable-web-app-on-aws-ec2-no-ecs-no-beanstalk-437n</link>
      <guid>https://forem.com/abdieljonathan007/deploying-a-secure-scalable-web-app-on-aws-ec2-no-ecs-no-beanstalk-437n</guid>
      <description>&lt;p&gt;Starting the Tutorial&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll go step-by-step through deploying a Dockerized web application on AWS EC2 using only EC2 services — no Elastic Beanstalk, no ECS, no shortcuts.&lt;/p&gt;

&lt;p&gt;By the end, you’ll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A launch template that auto-installs Docker and deploys your app.&lt;/li&gt;
&lt;li&gt;An Auto Scaling Group for high availability.&lt;/li&gt;
&lt;li&gt;A custom domain pointing to your EC2 instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prerequisites&lt;br&gt;
Before we start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AWS account&lt;/li&gt;
&lt;li&gt;Access to ChatGPT (optional, but great for debugging along the way!)&lt;/li&gt;
&lt;li&gt;IAM roles with permissions for EC2, ECR, SSM, and Auto Scaling&lt;/li&gt;
&lt;li&gt;Basic knowledge of GitHub (to clone your project repo)&lt;/li&gt;
&lt;li&gt;Docker installed on your local machine&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Part 1 – Configuring EC2 Using a Launch Template
&lt;/h3&gt;

&lt;p&gt;We’ll start by setting up an EC2 Launch Template — this defines how each instance should be created, configured, and secured.&lt;br&gt;
a - On your AWS Management Console, search for “Launch Templates”.&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%2Fiiptdf0g7cpm30tan8ii.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%2Fiiptdf0g7cpm30tan8ii.png" alt=" " width="800" height="121"&gt;&lt;/a&gt;&lt;br&gt;
b - We will then be redirected to this page and proceed to click on Create Launch Template&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%2Fy608boqufp9pip9o8w9j.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%2Fy608boqufp9pip9o8w9j.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;br&gt;
You’ll now see a form to define the template’s details. Let’s fill it out together 👇&lt;/p&gt;

&lt;p&gt;Basic Configuration &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Template name: cloud-tutorial&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%2F9428zse1s6gjqkakxzbc.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%2F9428zse1s6gjqkakxzbc.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Application and OS Image (AMI):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu Server 24.04 LTS (64-bit x86)&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%2Fltedpzc2v5dym9fp5a7d.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%2Fltedpzc2v5dym9fp5a7d.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instance type: t3.small&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%2F859grjs8og8moxec0hvj.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%2F859grjs8og8moxec0hvj.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Network settings:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Create a new security group&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%2Fchjqsatcbdi27gf811b6.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%2Fchjqsatcbdi27gf811b6.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow port 80 (HTTP) and port 443 (HTTPS)&lt;/li&gt;
&lt;li&gt;Disable SSH access — we’ll use SSM Session Manager for secure logins.&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%2F5et97fl0bxpll614f5cu.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%2F5et97fl0bxpll614f5cu.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Storage: 20 GB (change from the default 8 GB)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitoring: Enable CloudWatch monitoring&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This helps with debugging and tracking CPU, disk I/O, and network usage.&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%2Fxy4umuzgvemxgpjkvcdj.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%2Fxy4umuzgvemxgpjkvcdj.png" alt=" " width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;IAM instance profile:&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%2Fb29z0fzmd1y8hcn01i71.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%2Fb29z0fzmd1y8hcn01i71.png" alt=" " width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose your IAM role (e.g., LabRole if you’re using AWS Academy).&lt;/p&gt;

&lt;p&gt;Finally, click Create launch template ✅&lt;/p&gt;

&lt;p&gt;You should now see your new template listed.&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%2F9hq66cuqfdkz5bo1otra.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%2F9hq66cuqfdkz5bo1otra.png" alt=" " width="800" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 2 - Setting Up Auto Scaling for High Availability
&lt;/h3&gt;

&lt;p&gt;Next, we’ll configure an Auto Scaling Group (ASG) to automatically manage EC2 instances.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to EC2 → Auto Scaling Groups → Create Auto Scaling Group&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%2Fquyca9s4m8pszjv778fw.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%2Fquyca9s4m8pszjv778fw.png" alt=" " width="800" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name it ASG-cloud-tutorial&lt;/li&gt;
&lt;li&gt;Select your launch template (cloud-tutorial)&lt;/li&gt;
&lt;li&gt;Choose two Availability Zones and their subnets for high availability.(In the network section)&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%2Fl5pv36mkarperewwuexq.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%2Fl5pv36mkarperewwuexq.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave the distribution as “Balanced best effort”.&lt;/li&gt;
&lt;li&gt;Integrating Load Balancing
In the “Load Balancing” section:

&lt;ul&gt;
&lt;li&gt;Enable Elastic Load Balancing (ALB).&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%2F1j7t34wgkt1e3fzwsuqm.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%2F1j7t34wgkt1e3fzwsuqm.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* Turn on ELB health checks, so EC2 Auto Scaling can replace unhealthy instances.(Then configure scaling:Minimum capacity: 1,Desired capacity: 1,Maximum capacity: 3,Target tracking policy: Average CPU utilization at 50%.)
  This ensures your app scales up under load and back down when idle — saving costs while staying responsive.
&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%2Fr44dfiwwb15lta283mf6.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%2Fr44dfiwwb15lta283mf6.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
Once done, click Create Auto Scaling Group ✅&lt;br&gt;
Your configuration should look like this:&lt;br&gt;
Part a - &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%2F6lboct959g9vh2ilgzz7.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%2F6lboct959g9vh2ilgzz7.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Part b - &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%2Fm84jsvxkbsrh3gaukxhl.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%2Fm84jsvxkbsrh3gaukxhl.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Part c -&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%2Fk52597bt6bkbemr28t3g.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%2Fk52597bt6bkbemr28t3g.png" alt=" " width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 3 – Deploying the Application
&lt;/h3&gt;

&lt;p&gt;Now that your infrastructure is ready, let’s deploy a simple app.&lt;br&gt;
Project Structure&lt;br&gt;
Your app repository will look like this:&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%2F0imcsu4lr1eoranb6v4c.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%2F0imcsu4lr1eoranb6v4c.png" alt=" " width="552" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Deployment steps
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Clone your repo to your local machine:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/AbdielJonathan007/cloud-tutorial
cd cloud-tutorial

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Use Docker Buildx for multi-platform builds (for M1/M2 Mac compatibility and when we upload to EC2 instances later):&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%2Fixibkf4inxxxrkfrte65.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%2Fixibkf4inxxxrkfrte65.png" alt=" " width="800" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an ECR repository for each component:

&lt;ul&gt;
&lt;li&gt;backend&lt;/li&gt;
&lt;li&gt;frontend&lt;/li&gt;
&lt;li&gt;nginx
At Amazon search bar look for : ECR repository 
Choose:
Visibility: Private
Repository name: hello-world-app
Leave encryption and scanning default
Click Create repository
After creating you get a url like this:339712882354.dkr.ecr.us-east-1.amazonaws.com/hello-world-app
&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%2Ft4v363r1f0auae2btfe4.png" alt=" " width="800" height="144"&gt;
&lt;/li&gt;
&lt;li&gt;After creating the repository we will need the following information&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%2F986t9b3ga88xqhhvftkj.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%2F986t9b3ga88xqhhvftkj.png" alt=" " width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which in our case we are using the canvas lab to access the information would be under AWS details then clicking on AWS CLI , then we fill out that informationB
Then we run this command to Retrieve an authentication token and authenticate your Docker client to your registry. Use the AWS CLI:

&lt;ul&gt;
&lt;li&gt;Then we run this command
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 339712882354.dkr.ecr.us-east-1.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%2Fxrhiq0dor58vk2z1l7pg.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%2Fxrhiq0dor58vk2z1l7pg.png" alt=" " width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will need to push 3 Docker images &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend &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%2Fdjhiy1dd52w9e0ze02uj.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%2Fdjhiy1dd52w9e0ze02uj.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend &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%2Fb4wg23lf8gnvgkus9ozv.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%2Fb4wg23lf8gnvgkus9ozv.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nginx &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%2F5vaza8egu5frinuilmgv.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%2F5vaza8egu5frinuilmgv.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 4 - Automating Deployment via Launch Template
&lt;/h3&gt;

&lt;p&gt;Now we’ll make sure new EC2 instances automatically install Docker and run the app.&lt;br&gt;
Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to EC2 → Launch Templates → Actions → Create new version&lt;/li&gt;
&lt;li&gt;Scroll to Advanced details → User data&lt;/li&gt;
&lt;li&gt;Paste this script:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
apt update -y
apt install -y docker.io unzip curl
systemctl enable docker --now
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 339712882354.dkr.ecr.us-east-1.amazonaws.com

docker pull 339712882354.dkr.ecr.us-east-1.amazonaws.com/backend:latest
docker pull 339712882354.dkr.ecr.us-east-1.amazonaws.com/frontend:latest
docker pull 339712882354.dkr.ecr.us-east-1.amazonaws.com/nginx:latest

docker network create myapp-network
docker run -d --name backend --network myapp-network -p 5000:5000 backend:latest
docker run -d --name frontend --network myapp-network -p 3000:3000 frontend:latest
docker run -d --name nginx --network myapp-network -p 80:80 nginx:latest

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

&lt;/div&gt;



&lt;p&gt;4 - Create the new version and attach it to your Auto Scaling Group (ASG).&lt;br&gt;
Now, whenever ASG launches a new EC2 instance, it’ll run this script automatically. 💪&lt;br&gt;
We should see something like this :&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%2Flcikkj6masse56ijzz8m.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%2Flcikkj6masse56ijzz8m.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 5 - Connecting Your Domain (Using Name.com Only)
&lt;/h3&gt;

&lt;p&gt;Now that our app is up and running on EC2, let’s make it accessible through a custom domain instead of the public IP.&lt;/p&gt;

&lt;p&gt;We’ll be using a domain from Name.com, and we’ll connect it directly using DNS “A” records — no Route 53 needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Get Your EC2 Public IP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Open the AWS Management Console → EC2 → Instances.&lt;br&gt;
2️⃣ Select the instance that’s running your app.&lt;br&gt;
3️⃣ Copy the Public IPv4 address (for example, 3.90.248.104).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add DNS Records on Name.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Log in to your Name.com&lt;br&gt;
 account.&lt;br&gt;
2️⃣ Go to My Domains → abdielcloud.live → Manage DNS.&lt;br&gt;
3️⃣ Under DNS Records, add two A records:&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%2Fy2yt5m7te7ut1ut0prda.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%2Fy2yt5m7te7ut1ut0prda.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;br&gt;
Click Save Changes when you’re done.&lt;/p&gt;

&lt;p&gt;Once propagation finishes, navigating to&lt;br&gt;
&lt;a href="http://abdielcloud.live" rel="noopener noreferrer"&gt;http://abdielcloud.live&lt;/a&gt;&lt;br&gt;
(or &lt;a href="http://www.abdielcloud.live" rel="noopener noreferrer"&gt;http://www.abdielcloud.live&lt;/a&gt;)&lt;br&gt;
should open your frontend running on the EC2 instance 🎉&lt;/p&gt;

&lt;p&gt;Thank you for reading thus far!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
