<?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: Amapakabo, Joseph I.</title>
    <description>The latest articles on DEV Community by Amapakabo, Joseph I. (@jodev001).</description>
    <link>https://dev.to/jodev001</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%2F3830972%2F4156af34-175b-4591-8adc-dc219c38c610.webp</url>
      <title>DEV Community: Amapakabo, Joseph I.</title>
      <link>https://dev.to/jodev001</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jodev001"/>
    <language>en</language>
    <item>
      <title>Scaling Up: How I Deployed an Azure VM Scale Set with a Load Balancer and Apache2</title>
      <dc:creator>Amapakabo, Joseph I.</dc:creator>
      <pubDate>Sat, 23 May 2026 09:48:07 +0000</pubDate>
      <link>https://dev.to/jodev001/scaling-up-how-i-deployed-an-azure-vm-scale-set-with-a-load-balancer-and-apache2-262c</link>
      <guid>https://dev.to/jodev001/scaling-up-how-i-deployed-an-azure-vm-scale-set-with-a-load-balancer-and-apache2-262c</guid>
      <description>&lt;p&gt;A hands-on walkthrough of setting up an Azure Virtual Machine Scale Set (VMSS) from scratch — complete with a Load Balancer, autoscaling, custom Apache2 web pages, and NSG configuration. Each step is screenshotted.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In this post, I walk through how I set up a complete Azure VM Scale Set (VMSS) environment — resource group, virtual network, load balancer with a health probe and inbound rule, autoscaling configuration, Apache2 deployed via cloud-init custom data, and NSG rules to let traffic through. The end result? A live, load-balanced web page rotating across multiple VM instances. Let's go. ☁️&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why VMSS?
&lt;/h2&gt;

&lt;p&gt;A single VM is fine for learning, but it's not how real production workloads run. The moment your app starts getting actual traffic, you need something that can &lt;strong&gt;scale out automatically&lt;/strong&gt; and &lt;strong&gt;stay available&lt;/strong&gt; even when an instance goes down.&lt;/p&gt;

&lt;p&gt;That's exactly what &lt;strong&gt;Azure Virtual Machine Scale Sets (VMSS)&lt;/strong&gt; solve. VMSS lets you run a group of identical VMs that scale in and out based on demand — and when paired with an &lt;strong&gt;Azure Load Balancer&lt;/strong&gt;, traffic gets distributed evenly across all running instances.&lt;/p&gt;

&lt;p&gt;This is the setup I put together, step by step.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;An active &lt;strong&gt;Microsoft Azure account&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Basic familiarity with the Azure portal&lt;/li&gt;
&lt;li&gt;A browser and some patience 😄&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Create a Resource Group
&lt;/h2&gt;

&lt;p&gt;Everything starts here. The resource group is the logical container that holds every resource we're about to create — VNet, Load Balancer, VMSS, NSG, all of it.&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;Resource Groups&lt;/strong&gt; in the portal, click &lt;strong&gt;Create&lt;/strong&gt;, and fill in your subscription, a name (&lt;code&gt;azure-vmss&lt;/code&gt;), and region. I used &lt;strong&gt;South Africa North&lt;/strong&gt; throughout.&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%2F37v4de5zfkdtp0fbldva.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%2F37v4de5zfkdtp0fbldva.png" alt="Create a resource group — subscription, name azure-vmss, and region South Africa North" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Review + create&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Create the Virtual Network (VNet)
&lt;/h2&gt;

&lt;p&gt;Next up is the network that our scale set instances will live inside.&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;Virtual Network&lt;/strong&gt;, click &lt;strong&gt;Create&lt;/strong&gt;, attach it to the &lt;code&gt;azure-vmss&lt;/code&gt; resource group, name it &lt;code&gt;vmss-vnet&lt;/code&gt;, and set the same region. Go through the tabs — leave Security defaults as-is, configure your address space, skip Tags — and click &lt;strong&gt;Create&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%2F3633s54lid4fmjd5mmy3.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%2F3633s54lid4fmjd5mmy3.png" alt="Create virtual network — Review + create screen showing vmss-vnet configuration and validation passed" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Create the Load Balancer
&lt;/h2&gt;

&lt;p&gt;This is the piece that sits in front of our VMs and distributes incoming traffic. Without it, VMSS doesn't have a single public entry point to route requests through.&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;Load Balancers&lt;/strong&gt; and select &lt;strong&gt;Create &amp;gt; Standard Load Balancer&lt;/strong&gt; from the dropdown.&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%2Fsvdk9rnmpvbib86y7pzo.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%2Fsvdk9rnmpvbib86y7pzo.png" alt="Load balancers dashboard showing Create &amp;gt; Standard Load Balancer option" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3a. Basics
&lt;/h3&gt;

&lt;p&gt;Name it &lt;code&gt;vmss-lb&lt;/code&gt;, set the type to &lt;strong&gt;Public&lt;/strong&gt;, SKU to &lt;strong&gt;Standard&lt;/strong&gt;, and tier to &lt;strong&gt;Regional&lt;/strong&gt;. Make sure it's in the same resource group and region.&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%2F1vz57qgc6hmx251f9c9b.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%2F1vz57qgc6hmx251f9c9b.png" alt="Create load balancer Basics — vmss-lb, Public, Standard SKU, Regional tier" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Next: Frontend IP configuration&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3b. Add a Frontend IP Configuration
&lt;/h3&gt;

&lt;p&gt;The frontend IP is the public-facing address your load balancer listens on. Click &lt;strong&gt;+ Add a frontend IP configuration&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%2F0d1mh9g2c7ja9cdbxa4v.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%2F0d1mh9g2c7ja9cdbxa4v.png" alt="Frontend IP configuration tab with Add a frontend IP configuration button" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name it &lt;code&gt;frontend-vmss1&lt;/code&gt;, leave IP version as IPv4, and click &lt;strong&gt;Create new&lt;/strong&gt; under Public IP address to generate a new one. Save, then save again.&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%2Fxvtjzdl3j0m7kwvxiykp.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%2Fxvtjzdl3j0m7kwvxiykp.png" alt="Add frontend IP configuration panel — frontend-vmss1 name, IPv4, Create new public IP" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3c. Add a Backend Pool
&lt;/h3&gt;

&lt;p&gt;The backend pool is the group of VMs the load balancer will distribute traffic to — our VMSS instances will register here automatically.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Next: Backend pools&lt;/strong&gt;, then &lt;strong&gt;+ Add a backend pool&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%2F0u4rdmuk3och5r680i92.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%2F0u4rdmuk3och5r680i92.png" alt="Backend pools tab showing Add a backend pool option" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name it &lt;code&gt;backend-vmss1&lt;/code&gt;, select the &lt;code&gt;vmss-vnet&lt;/code&gt; virtual network, set backend pool configuration to &lt;strong&gt;NIC&lt;/strong&gt;, and save.&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%2Fohk2fj84dkqjup5m8w2v.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%2Fohk2fj84dkqjup5m8w2v.png" alt="Add backend pool panel — NIC configuration selected, vmss-vnet attached" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3d. Add an Inbound Load Balancing Rule
&lt;/h3&gt;

&lt;p&gt;The load balancing rule tells the balancer &lt;em&gt;how&lt;/em&gt; to distribute incoming traffic to the backend pool. Click &lt;strong&gt;Next: Inbound rules&lt;/strong&gt;, then &lt;strong&gt;+ Add a load balancing rule&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%2Fhlrf8fqmj92va32f6phe.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%2Fhlrf8fqmj92va32f6phe.png" alt="Inbound rules tab with Add a load balancing rule button" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set the rule name to &lt;code&gt;vmsslb-rule1&lt;/code&gt;, select &lt;code&gt;frontend-vmss1&lt;/code&gt; as the frontend IP, &lt;code&gt;backend-vmss1&lt;/code&gt; as the backend pool, protocol &lt;strong&gt;TCP&lt;/strong&gt;, and port &lt;strong&gt;80&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%2F13k1otlguaz2ivcifh63.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%2F13k1otlguaz2ivcifh63.png" alt="Add load balancing rule panel — vmsslb-rule1, frontend-vmss1, backend-vmss1, TCP port 80" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the &lt;strong&gt;Health probe&lt;/strong&gt;, click &lt;strong&gt;Create new&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%2Fdkmjmj9139snpd6dtlc0.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%2Fdkmjmj9139snpd6dtlc0.png" alt="Load balancing rule — health probe set to No existing probes, Create new highlighted" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name it &lt;code&gt;vmsslb-health&lt;/code&gt;, set protocol to &lt;strong&gt;HTTP&lt;/strong&gt;, port &lt;strong&gt;80&lt;/strong&gt;, path &lt;code&gt;/&lt;/code&gt;, and interval &lt;strong&gt;5 seconds&lt;/strong&gt;. Save.&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%2F2am1bh8h9hbnv2d52l1r.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%2F2am1bh8h9hbnv2d52l1r.png" alt="Health probe creation — vmsslb-health, HTTP, port 80, path /, 5 second interval" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the rule, then save again to confirm all settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  3e. Review + Create
&lt;/h3&gt;

&lt;p&gt;With everything configured, navigate to &lt;strong&gt;Review + create&lt;/strong&gt;. Confirm the validation passes and click &lt;strong&gt;Create&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%2Fvpystde5ytkzq7w6js65.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%2Fvpystde5ytkzq7w6js65.png" alt="Load balancer Review + create — validation passed, showing all settings including frontend-vmss1 and backend-vmss1" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once deployment completes, click &lt;strong&gt;Go to resource&lt;/strong&gt; to view your new load balancer. You'll also see a success notification in the top-right bell icon.&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%2F382whgk4iqp27wabtzrc.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%2F382whgk4iqp27wabtzrc.png" alt="vmss-lb overview showing successful deployment with frontend IP 20.87.240.113 and deployment succeeded notification" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Take note of your frontend IP address.&lt;/strong&gt; You'll need it later to test the setup in your browser. Mine was &lt;code&gt;20.87.240.113&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Create the VM Scale Set (VMSS)
&lt;/h2&gt;

&lt;p&gt;With the networking and load balancer in place, it's time to create the scale set itself.&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;Virtual Machine Scale Set&lt;/strong&gt; in the portal and click &lt;strong&gt;Create&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%2Fwi9psfqzyzg6ynwd2sjv.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%2Fwi9psfqzyzg6ynwd2sjv.png" alt="Virtual Machine Scale Set dashboard — empty, with Create button" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4a. Basics
&lt;/h3&gt;

&lt;p&gt;Fill in the details: subscription, resource group (&lt;code&gt;azure-vmss&lt;/code&gt;), scale set name (&lt;code&gt;myvmss1&lt;/code&gt;), region (&lt;strong&gt;South Africa North&lt;/strong&gt;), and availability zones &lt;strong&gt;1, 2, 3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Set &lt;strong&gt;Orchestration mode&lt;/strong&gt; to &lt;strong&gt;Flexible&lt;/strong&gt; and &lt;strong&gt;Scaling mode&lt;/strong&gt; to &lt;strong&gt;Autoscaling&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%2Fds2o1yhe0jqa5qj49j8f.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%2Fds2o1yhe0jqa5qj49j8f.png" alt="Create VMSS Basics tab — myvmss1, South Africa North, Flexible orchestration, Autoscaling selected" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4b. Configure Autoscaling
&lt;/h3&gt;

&lt;p&gt;Once you select Autoscaling, a &lt;strong&gt;Scaling configuration&lt;/strong&gt; section appears. Click &lt;strong&gt;Configure&lt;/strong&gt; to set up the autoscale 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%2Fc8fa9ix8lhku4haezc3y.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%2Fc8fa9ix8lhku4haezc3y.png" alt="VMSS Basics showing Autoscaling selected with Configure button highlighted" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll land on the Scaling configuration page showing the &lt;strong&gt;Default condition&lt;/strong&gt;. Click the &lt;strong&gt;edit (pencil) icon&lt;/strong&gt; to modify it.&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%2Fq9juthne0zu4p5ltjhbq.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%2Fq9juthne0zu4p5ltjhbq.png" alt="Scaling configuration page — Default condition row with edit pencil icon highlighted" width="799" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Edit Condition&lt;/strong&gt; panel, set the parameters like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale mode:&lt;/strong&gt; Autoscaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default instance count:&lt;/strong&gt; 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum:&lt;/strong&gt; 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum:&lt;/strong&gt; 5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale out&lt;/strong&gt; when CPU &amp;gt; &lt;strong&gt;80%&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%2Fvgesc928whv1tael6gts.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%2Fvgesc928whv1tael6gts.png" alt="Edit Condition panel — default 2 instances, min 2, max 5, scale out CPU threshold 80%" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to also set the &lt;strong&gt;Scale in&lt;/strong&gt; rule and query duration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale in&lt;/strong&gt; when CPU &amp;lt; &lt;strong&gt;20%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query duration:&lt;/strong&gt; 10 minutes&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%2F6exrjpbg1o4se5andqll.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%2F6exrjpbg1o4se5andqll.png" alt="Edit Condition — Scale in CPU threshold 20%, decrease by 1, query duration 10 minutes" width="799" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save twice to apply and return.&lt;/p&gt;

&lt;h3&gt;
  
  
  4c. Select Disk Image, Size, and Admin Credentials
&lt;/h3&gt;

&lt;p&gt;Scroll up to the image and size section. I used &lt;strong&gt;Ubuntu Pro 24.04 LTS - x64 Gen2&lt;/strong&gt; with size &lt;strong&gt;Standard B2as v2&lt;/strong&gt;. Set your admin username (&lt;code&gt;vmssengine&lt;/code&gt;) and password.&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%2F71yqvth4l0m7qf2bbvqk.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%2F71yqvth4l0m7qf2bbvqk.png" alt="VMSS image Ubuntu Pro 24.04 LTS, size Standard B2as v2, admin credentials" width="783" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4d. Networking Tab
&lt;/h3&gt;

&lt;p&gt;Click on &lt;strong&gt;Networking&lt;/strong&gt; (or hit Next until you reach it). Confirm the virtual network and subnet are selected. Scroll down to the &lt;strong&gt;Load balancing&lt;/strong&gt; section and select &lt;strong&gt;Azure load balancer&lt;/strong&gt;, then pick &lt;code&gt;vmss-lb&lt;/code&gt; as your load balancer and &lt;code&gt;backend-vmss1&lt;/code&gt; as the backend pool.&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%2Fw5r60jngm78cnotnd0hp.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%2Fw5r60jngm78cnotnd0hp.png" alt="VMSS Networking tab — virtual network and subnet configured" width="799" height="476"&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%2Fputirfu5q49f4g19p6kq.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%2Fputirfu5q49f4g19p6kq.png" alt="VMSS Networking — Load balancing section, Azure load balancer selected, vmss-lb and backend-vmss1 attached" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4e. Management Tab
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;Management&lt;/strong&gt; tab, set &lt;strong&gt;Boot diagnostics&lt;/strong&gt; to &lt;strong&gt;Disable&lt;/strong&gt; — this prevents an unnecessary storage account from being auto-created. Leave everything else as default.&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%2Fevpbrvdp3ti8bqx3bzmm.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%2Fevpbrvdp3ti8bqx3bzmm.png" alt="VMSS Management tab — Boot diagnostics set to Disable" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4f. Advanced Tab — The Cloud-Init Script
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. The &lt;strong&gt;Advanced&lt;/strong&gt; tab has a &lt;strong&gt;Custom data&lt;/strong&gt; field that accepts a cloud-init script. Whatever you paste here runs automatically on every VM instance when it boots — no manual SSH required.&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%2F3nb35q7o1d3kkq6b4a4s.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%2F3nb35q7o1d3kkq6b4a4s.png" alt="VMSS Advanced tab — allocation policy and VM applications section" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Custom data and cloud init&lt;/strong&gt; and paste in the following script:&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%2F522ytt0e41w6fg730byg.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%2F522ytt0e41w6fg730byg.png" alt="Custom data field with the bash script pasted in" width="800" height="353"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Update package index&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Install Apache2&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Enable Apache2 to start on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2

&lt;span class="c"&gt;# Start Apache2 service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2

&lt;span class="c"&gt;# Get hostname&lt;/span&gt;
&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Create custom webpage&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; | sudo tee /var/www/html/index.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Azure VMSS Demo&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    body {
      font-family: Arial, sans-serif;
      background-color: #f4f4f4;
      text-align: center;
      padding-top: 100px;
    }
    h1 { color: #0078D4; font-size: 50px; }
    p  { font-size: 24px; }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;Hello from &lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;Azure VM Scale Set Instance&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Restart Apache2 to ensure changes are loaded&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;This script installs Apache2, grabs the VM's hostname, and writes it into a custom HTML page. This is how we'll later confirm which instance is serving each request.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4g. Review + Create
&lt;/h3&gt;

&lt;p&gt;Click through Tags and head to &lt;strong&gt;Review + create&lt;/strong&gt;. Confirm the summary looks right — Ubuntu Pro 24.04 LTS, Standard B2as v2, Autoscaling, South Africa North — and hit &lt;strong&gt;Create&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%2F7o2q5yhkz5gofl9x9voc.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%2F7o2q5yhkz5gofl9x9voc.png" alt="VMSS Review + create — validation passed, deployment initializing notification" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Get the Load Balancer's Frontend IP
&lt;/h2&gt;

&lt;p&gt;Once the VMSS deploys successfully, navigate to your &lt;strong&gt;vmss-lb&lt;/strong&gt; load balancer → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Frontend IP configuration&lt;/strong&gt;. You'll see the public IP address that was assigned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji1zijrjpfwjvvaii76a.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%2Fji1zijrjpfwjvvaii76a.png" alt="vmss-lb Frontend IP configuration — frontend-vmss1 showing IP 20.87.240.113, VMSS deployment succeeded notification" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy that IP address and paste it into your browser.&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%2Fmwyb805otwzm4r6q3iqk.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%2Fmwyb805otwzm4r6q3iqk.png" alt="Browser address bar with 20.87.240.113 entered" width="733" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the page doesn't load — don't panic. It just means the &lt;strong&gt;Network Security Group (NSG)&lt;/strong&gt; hasn't been configured to allow HTTP traffic yet. We'll fix that next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Fix the NSG — Allow HTTP Traffic
&lt;/h2&gt;

&lt;p&gt;The VMSS creates a default NSG attached to the network interfaces of each instance, but HTTP (port 80) isn't open by default. We need to add an inbound rule.&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;NSG&lt;/strong&gt; (or &lt;strong&gt;Network security groups&lt;/strong&gt;) in the portal search bar.&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%2Fir2d9eumbb359019mimq.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%2Fir2d9eumbb359019mimq.png" alt="Azure portal search showing NSG search with Network security groups in recent services" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see the auto-generated NSG for your VMSS. Click on it.&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%2Fdoc7lqjzd5afox0xll5r.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%2Fdoc7lqjzd5afox0xll5r.png" alt="NSG list showing basicNsgvnet-southafricanorth-1-nic01 in the azure-vmss resource group" width="800" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the NSG blade, under &lt;strong&gt;Settings&lt;/strong&gt;, click &lt;strong&gt;Inbound security rules&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%2Flhk93xv8gkfuxrc5v8f9.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%2Flhk93xv8gkfuxrc5v8f9.png" alt="NSG overview with Inbound security rules highlighted in the Settings section" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;+ Add&lt;/strong&gt; to add a new rule.&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%2Fsb15npmfgslj5t50tuzt.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%2Fsb15npmfgslj5t50tuzt.png" alt="Inbound security rules tab with the Add button highlighted" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set the following parameters and click &lt;strong&gt;Add&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; Any&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service:&lt;/strong&gt; HTTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination port:&lt;/strong&gt; 80&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol:&lt;/strong&gt; TCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; Allow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority:&lt;/strong&gt; 100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Allowport80&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%2Fkse9gm7sd5413u9sl717.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%2Fkse9gm7sd5413u9sl717.png" alt="Add inbound security rule panel — HTTP, port 80, TCP, Allow, priority 100, name Allowport80" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Verify in the Browser — Load Balancing in Action! 🎉
&lt;/h2&gt;

&lt;p&gt;Go back to your browser and refresh. This time, the custom Apache page should load — showing the hostname of whichever VM instance handled your request.&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%2Fj0fqnudl73p5560st21o.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%2Fj0fqnudl73p5560st21o.png" alt="Browser showing " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refresh again. The load balancer routes the request to a different instance — and a different hostname appears!&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%2F92b320xuxdcox20yyvk6.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%2F92b320xuxdcox20yyvk6.png" alt="Browser showing " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That right there is load balancing working as intended. Two different VM instances, same IP, same Apache page — but different hostnames proving requests are being distributed across the scale set.&lt;/p&gt;




&lt;h2&gt;
  
  
  Snapshot: All Resources Created
&lt;/h2&gt;

&lt;p&gt;Here's a final look at the &lt;code&gt;azure-vmss&lt;/code&gt; resource group showing everything that was provisioned end-to-end.&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%2Fsc4oxpf4atg8u58pj5uj.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%2Fsc4oxpf4atg8u58pj5uj.png" alt="azure-vmss resource group showing all created resources — NSG, public IPs, VMSS, VMs, disks, and load balancer" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Built — At a Glance
&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;Name&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;azure-vmss&lt;/td&gt;
&lt;td&gt;Container for all resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Virtual Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;vmss-vnet&lt;/td&gt;
&lt;td&gt;Private network for VM instances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Balancer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;vmss-lb&lt;/td&gt;
&lt;td&gt;Distributes public traffic to backend VMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend IP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;frontend-vmss1&lt;/td&gt;
&lt;td&gt;Public entry point (20.87.240.113)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend Pool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;backend-vmss1&lt;/td&gt;
&lt;td&gt;Pool of VMSS instances receiving traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Health Probe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;vmsslb-health&lt;/td&gt;
&lt;td&gt;Monitors instance health via HTTP port 80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LB Rule&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;vmsslb-rule1&lt;/td&gt;
&lt;td&gt;Routes port 80 traffic to backend pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VM Scale Set&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;myvmss1&lt;/td&gt;
&lt;td&gt;Auto-scaling group of Ubuntu VMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NSG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;basicNsgvnet-...&lt;/td&gt;
&lt;td&gt;Controls inbound/outbound traffic to instances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build the load balancer before the VMSS&lt;/strong&gt; — the VMSS networking tab lets you attach directly to an existing load balancer during creation. Much cleaner than doing it after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-init custom data is powerful.&lt;/strong&gt; No SSH needed. The script runs at boot time on every instance — perfect for installing software across an entire scale set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NSGs are the silent gatekeepers.&lt;/strong&gt; Even with everything configured correctly, traffic won't flow until the NSG explicitly allows it. Always check here first if the browser isn't loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The hostname trick is a great sanity check.&lt;/strong&gt; Embedding &lt;code&gt;$(hostname)&lt;/code&gt; in the web page makes it immediately obvious when the load balancer is routing to different instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoscaling keeps costs in check.&lt;/strong&gt; With min 2, max 5 instances and CPU thresholds at 80% (scale out) and 20% (scale in), the setup only spins up extra capacity when it actually needs it.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;From here, you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;strong&gt;HTTPS&lt;/strong&gt; using an Azure Application Gateway or Let's Encrypt certificates&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;Azure Monitor&lt;/strong&gt; alerts and autoscale diagnostics&lt;/li&gt;
&lt;li&gt;Deploy a real application instead of the static Apache page&lt;/li&gt;
&lt;li&gt;Explore &lt;strong&gt;Azure Spot Instances&lt;/strong&gt; within the scale set to cut compute costs significantly&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;custom scaling schedules&lt;/strong&gt; for predictable traffic patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This was one of the most satisfying setups I've done so far in my cloud engineering journey — watching the browser rotate between two different hostnames on refresh just hits different. 😄&lt;/p&gt;

&lt;p&gt;If you followed along and ran into any issues, drop a comment. Happy to help.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keep building. ☁️&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;#azure #cloudengineering #devops #vmss #loadbalancer #linux #apache #autoscaling #100daysofcloud #beginners&lt;/em&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>From Zero to Deployed: Setting Up an Azure VM with Apache2 (Step-by-Step)</title>
      <dc:creator>Amapakabo, Joseph I.</dc:creator>
      <pubDate>Sat, 18 Apr 2026 07:01:40 +0000</pubDate>
      <link>https://dev.to/jodev001/from-zero-to-deployed-setting-up-an-azure-vm-with-apache2-step-by-step-1l1b</link>
      <guid>https://dev.to/jodev001/from-zero-to-deployed-setting-up-an-azure-vm-with-apache2-step-by-step-1l1b</guid>
      <description>&lt;h2&gt;
  
  
  A practical, beginner-friendly walkthrough of deploying an Azure Virtual Machine, configuring a Virtual Network, SSHing in, and hosting a live Apache2 web server — all from scratch.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In this post, I walk through how I deployed an Azure Virtual Machine from scratch — set up the subscription, resource group, virtual network, and finally spun up an Apache2 web server accessible via a public IP. If you're just getting into cloud engineering, this one's for you.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Cloud infrastructure isn't just for big tech anymore. Whether you're building a side project, preparing for a cloud cert, or just trying to understand what "the cloud" actually means under the hood — knowing how to spin up a virtual machine and serve traffic from it is a fundamental skill.&lt;/p&gt;

&lt;p&gt;This post documents my hands-on journey doing exactly that on &lt;strong&gt;Microsoft Azure&lt;/strong&gt;. Every step is screenshotted, so you can follow along visually.&lt;/p&gt;

&lt;p&gt;Let's get into it. 🚀&lt;/p&gt;




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

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

&lt;ul&gt;
&lt;li&gt;An active &lt;strong&gt;Microsoft Azure account&lt;/strong&gt; (free tier works fine to start)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Bash&lt;/strong&gt; installed (or any terminal that supports SSH)&lt;/li&gt;
&lt;li&gt;Basic comfort with the command line&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Create a Subscription
&lt;/h2&gt;

&lt;p&gt;Everything on Azure lives under a &lt;strong&gt;subscription&lt;/strong&gt; — think of it as your billing and organizational umbrella.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Azure portal, search for &lt;strong&gt;"Subscriptions"&lt;/strong&gt; in the top search bar and click on it.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Type your subscription name in the highlighted field (I named mine &lt;em&gt;My VM &amp;amp; Apache Setup&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; and follow through each stage.&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%2F4xh12usvwfnvodzqfg2g.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%2F4xh12usvwfnvodzqfg2g.png" alt="Creating a subscription on Azure — filling in subscription name and billing details" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've gone through all the tabs, you'll land on the &lt;strong&gt;Review + Create&lt;/strong&gt; screen. Confirm the validation passes and hit &lt;strong&gt;Create&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%2Fvgg7762lz62hkocjqbn7.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%2Fvgg7762lz62hkocjqbn7.png" alt="Azure subscription Review + Create screen showing validation passed" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;If you're on the Azure free tier, a default subscription is usually already set up for you. You can skip this step and move straight to Step 2.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2: Create a Resource Group
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Resource Group&lt;/strong&gt; is a logical container for all the Azure resources that belong to a project. It keeps things tidy and makes cleanup much easier when you're done.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the left-hand menu of your subscription, select &lt;strong&gt;Resource Groups&lt;/strong&gt;, then click &lt;strong&gt;Create&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%2F0ws76cjgh3ffmui4ck11.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%2F0ws76cjgh3ffmui4ck11.png" alt="Azure portal showing the Resource Groups section under the subscription" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter the required details — your subscription, a region, and a meaningful name for the group. I used &lt;code&gt;MyVM1-setup&lt;/code&gt; and selected &lt;em&gt;(Africa) South Africa North&lt;/em&gt; as my region.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; through each section and finalize with &lt;strong&gt;Review + Create&lt;/strong&gt; → &lt;strong&gt;Create&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%2Fzq9z79kltqdweqv08uya.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%2Fzq9z79kltqdweqv08uya.png" alt="Create a resource group form with subscription, name, and region filled in" width="676" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your Resource Group is now live and ready to house all the resources we'll be creating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Create a Virtual Network (VNet)
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Virtual Network&lt;/strong&gt; is the private network your VM will operate inside. This is where you define your IP address ranges, subnets, and traffic boundaries. Think of it as building the roads before driving the car.&lt;/p&gt;

&lt;h3&gt;
  
  
  3a. Create the VNet — Basics Tab
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Search for &lt;strong&gt;"Virtual Network"&lt;/strong&gt; in the search bar and click on it.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;, then select your subscription and resource group.&lt;/li&gt;
&lt;li&gt;Give your VNet a name and proceed to the next tab.&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%2Frb0wsx1x3suiyxpei1gd.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%2Frb0wsx1x3suiyxpei1gd.png" alt="Create Virtual Network — Basics tab with subscription and resource group selected" width="698" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3b. Security Settings
&lt;/h3&gt;

&lt;p&gt;Leave the defaults in the &lt;strong&gt;Security&lt;/strong&gt; section and click &lt;strong&gt;Next&lt;/strong&gt; — no changes needed here for a basic setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  3c. Address Space &amp;amp; Subnets
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;Address Space&lt;/strong&gt; tab, you'll see a default subnet already configured. I deleted it and created my own to have full control over the IP range.&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%2Fxx28nf0sat6d6m2iqvqs.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%2Fxx28nf0sat6d6m2iqvqs.png" alt="Create Virtual Network — Address Space tab showing default subnet highlighted for deletion" width="674" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Next&lt;/strong&gt; through Tags (skip if you don't need them), then select &lt;strong&gt;Create&lt;/strong&gt; in the &lt;em&gt;Review + Create&lt;/em&gt; tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  3d. Navigate to Subnets After Deployment
&lt;/h3&gt;

&lt;p&gt;Once the VNet deploys, you'll see the success screen. Click &lt;strong&gt;Go to resource&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%2Fng0x1f515b6d9u4k5fq2.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%2Fng0x1f515b6d9u4k5fq2.png" alt="Azure VNet deployment complete — 'Your deployment is complete' screen with Go to resource button" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, in the left-hand menu under &lt;strong&gt;Settings&lt;/strong&gt;, click &lt;strong&gt;Subnets&lt;/strong&gt;. Hit the &lt;strong&gt;+ Subnet&lt;/strong&gt; button at the top to add a new one.&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%2Frd4zp95v3m1ze3ltq2g3.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%2Frd4zp95v3m1ze3ltq2g3.png" alt="VNet Subnets panel showing the + Subnet button highlighted" width="722" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3e. Add Your Subnet
&lt;/h3&gt;

&lt;p&gt;In the &lt;em&gt;Add a Subnet&lt;/em&gt; pane, enter your subnet name and configure the IP address range. I used &lt;code&gt;vm1-subnet&lt;/code&gt; with a &lt;code&gt;/24&lt;/code&gt; range (&lt;code&gt;10.0.1.0 - 10.0.1.255&lt;/code&gt; — 256 addresses). Click &lt;strong&gt;Add&lt;/strong&gt; when done.&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%2Fkfk1781enl8h61onyqft.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%2Fkfk1781enl8h61onyqft.png" alt="Add a subnet pane showing vm1-subnet name and 10.0.1.0/24 IP range configured" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Create the Virtual Machine
&lt;/h2&gt;

&lt;p&gt;Here's where the fun begins. 🎉&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for &lt;strong&gt;"Virtual Machines"&lt;/strong&gt; in the portal. You'll see the VM dashboard — currently empty.&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%2Fzngmmiigmroiooyeeviy.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%2Fzngmmiigmroiooyeeviy.png" alt="Azure Virtual Machines dashboard showing no VMs yet with a Create button" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt; and fill in all the necessary details — name, region, image (I used &lt;strong&gt;Ubuntu 24.04 LTS&lt;/strong&gt;), size, and disk (I went with a &lt;strong&gt;64 GB Standard SSD&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical step — Inbound Port Rules:&lt;/strong&gt; Make sure these two ports are open:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Port 22&lt;/strong&gt; — for SSH access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port 80&lt;/strong&gt; — for HTTP (public web access)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you're satisfied with your configuration, click &lt;strong&gt;Review + Create&lt;/strong&gt; → &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A prompt will immediately appear asking you to &lt;strong&gt;generate and download your SSH key pair&lt;/strong&gt;. This is non-negotiable — Azure does &lt;strong&gt;not&lt;/strong&gt; store the private key after this point. Download it, keep it safe.&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%2Fi80suzdo6dui3dnsw39t.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%2Fi80suzdo6dui3dnsw39t.png" alt="Generate new key pair modal with 'Download private key and create resource' button" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Download private key and create resource&lt;/strong&gt;, then &lt;strong&gt;Return to create a virtual machine&lt;/strong&gt;. Wait a few minutes for the deployment to complete.&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%2F7fl4jsih2q1r18xz4ek8.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%2F7fl4jsih2q1r18xz4ek8.png" alt="VM deployment complete screen showing Ubuntu 24.04 LTS VM successfully created" width="609" height="399"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: SSH Into Your VM
&lt;/h2&gt;

&lt;p&gt;With the VM up and running, it's time to connect to it. Open &lt;strong&gt;Git Bash&lt;/strong&gt; and run the following:&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;# Navigate to your Downloads folder (where your .pem file is)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;downloads

&lt;span class="c"&gt;# Set the correct permissions on your key file (required for SSH)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;400 vm1key.pem

&lt;span class="c"&gt;# SSH into the VM using your key, username, and public IP&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; vm1key.pem mrjoe@20.99.232.218
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔁 &lt;em&gt;Replace &lt;code&gt;vm1key.pem&lt;/code&gt; with your actual key filename and &lt;code&gt;mrjoe@20.99.232.218&lt;/code&gt; with your VM's username and public IP address. You'll find the public IP on your VM's overview page in the portal.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You'll be prompted to confirm the host fingerprint — type &lt;code&gt;yes&lt;/code&gt; and hit Enter. If the key file and username are correct, you'll be welcomed right in.&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%2Filwqcpdv174hsnzbmyiw.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%2Filwqcpdv174hsnzbmyiw.png" alt="Git Bash terminal showing successful SSH connection into the Ubuntu VM" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now update the OS to make sure everything is current:&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;apt update
&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%2Fs79rqr4akp9pe4kc2rm9.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%2Fs79rqr4akp9pe4kc2rm9.png" alt="Terminal showing sudo apt update running and fetching package lists from Azure Ubuntu repos" width="570" height="98"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&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%2Fnveoe7oxx6yxlu3fw8ug.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%2Fnveoe7oxx6yxlu3fw8ug.png" alt="Terminal showing sudo apt upgrade -y running and listing packages to be upgraded" width="575" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then install Apache2:&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;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&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%2F3l06iubdp1zz09xbszgg.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%2F3l06iubdp1zz09xbszgg.png" alt="Terminal showing sudo apt install apache2 with package dependencies listed and confirmation prompt" width="562" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apache2 starts automatically right after installation. No extra configuration needed. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Verify Apache in Your Browser — It Works! 🎉
&lt;/h2&gt;

&lt;p&gt;Open any browser and navigate to your VM's public IP over HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://20.99.232.218
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything went smoothly, you'll be greeted by the &lt;strong&gt;Apache2 Ubuntu Default Page&lt;/strong&gt; — the classic "It works!" screen that confirms your web server is live and publicly accessible.&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%2F0h81qkcxz1es6kfq73x1.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%2F0h81qkcxz1es6kfq73x1.png" alt="Browser showing the Apache2 Ubuntu Default Page at the VM's public IP address" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;Let's quickly recap what was set up end-to-end:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Billing and organizational container for all Azure resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logical grouping to manage and clean up project resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Virtual Network + Subnet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Private network environment for the VM to operate in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Virtual Machine (Ubuntu 24.04 LTS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The compute instance running our workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apache2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web server serving HTTP traffic publicly on Port 80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Networking matters first.&lt;/strong&gt; Setting up your VNet and subnets before the VM ensures your machine is dropped into the right network environment from day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open only the ports you need.&lt;/strong&gt; Port 22 for SSH and Port 80 for HTTP — nothing more. Security begins at the network layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your &lt;code&gt;.pem&lt;/code&gt; file is your key — literally.&lt;/strong&gt; Azure will not store it for you. Lose it and you lose SSH access. Treat it like a password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache2 just works.&lt;/strong&gt; For a quick web server deployment on Ubuntu, it's hard to beat — install, done, live.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;This is just the foundation. From here, you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point a &lt;strong&gt;custom domain&lt;/strong&gt; at your VM's public IP&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;HTTPS with Let's Encrypt&lt;/strong&gt; (free TLS/SSL)&lt;/li&gt;
&lt;li&gt;Deploy a &lt;strong&gt;full web application&lt;/strong&gt; instead of the default Apache page&lt;/li&gt;
&lt;li&gt;Explore &lt;strong&gt;Azure Load Balancers&lt;/strong&gt; to distribute traffic across multiple VMs&lt;/li&gt;
&lt;li&gt;Lock down your VM further with &lt;strong&gt;Azure Network Security Groups (NSGs)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The cloud is a lot less intimidating once you've actually deployed something and watched it load in your browser. If you followed along and hit any snags, drop a comment below — happy to help.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keep building. ☁️&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;#azure #cloudengineering #devops #linux #apache #virtualmachine #beginners #100daysofcloud&lt;/em&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>From Classroom to Cloud: Building My First Azure Resource Group ☁️</title>
      <dc:creator>Amapakabo, Joseph I.</dc:creator>
      <pubDate>Thu, 19 Mar 2026 15:48:34 +0000</pubDate>
      <link>https://dev.to/jodev001/from-classroom-to-cloud-building-my-first-azure-resource-group-3i12</link>
      <guid>https://dev.to/jodev001/from-classroom-to-cloud-building-my-first-azure-resource-group-3i12</guid>
      <description>&lt;p&gt;Cloud computing is often talked about in "big picture" terms, but as a student diving into the engineering side of things, I've realized it’s the small, foundational steps that really make the magic happen.&lt;/p&gt;

&lt;p&gt;In my latest cloud computing assignment, I took a deep dive into the Microsoft Azure ecosystem. Here is a breakdown of what I’m learning and a step-by-step guide on how I set up my first cloud environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📱 The Cloud Apps I Use Daily (SaaS)&lt;/strong&gt;&lt;br&gt;
Before we look under the hood, it’s important to recognize how much we already rely on the cloud. Apps like Zoom, Google Meet, Facebook, X (Twitter), and YouTube are all perfect examples of Software as a Service (SaaS).&lt;/p&gt;

&lt;p&gt;The beauty of SaaS is that I don't have to manage any infrastructure. I don't need to worry about server maintenance or database updates; I just use the service as-is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Thinking Like a Cloud Architect&lt;/strong&gt;&lt;br&gt;
When we move beyond just "using" apps and start "building" them, we have to think about infrastructure.&lt;/p&gt;

&lt;p&gt;Why should a small Fintech startup choose the Cloud?&lt;br&gt;
If a small fintech company asked for my advice, I’d tell them to skip the on-premise servers and go straight to the cloud for three main reasons:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scalability:&lt;/em&gt; They only pay for what they need to launch. As users sign up, they can scale up instantly to maintain performance without having to buy new hardware.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cost-Effectiveness:&lt;/em&gt; Starting on-premise means paying for physical space, security, cooling, and a large IT staff. In the cloud, those initial costs are reduced to nearly zero. You pay for what you use, keeping the budget lean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Redundancy:&lt;/em&gt; In fintech, data loss is a disaster. Cloud providers allow you to deploy across multiple regions. If one data center has an issue, your data is replicated elsewhere, ensuring the service stays up and running no matter what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Tutorial: Creating an Azure Resource Group&lt;/strong&gt;&lt;br&gt;
In Azure, a Resource Group is a logical container. Think of it as a folder that holds all the related resources for a specific project—like your Virtual Machines, storage, and databases.&lt;/p&gt;

&lt;p&gt;Here is the process I followed to get mine up and running:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; &lt;em&gt;Accessing the Portal&lt;/em&gt;&lt;br&gt;
I started by signing up and logging into my Azure Portal.&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%2Fv79tmr29nxm9lr5nn3nm.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%2Fv79tmr29nxm9lr5nn3nm.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; &lt;em&gt;Setting up a Subscription&lt;/em&gt;&lt;br&gt;
To build anything, you need a subscription. I searched for "Subscriptions" in the top search bar to load the management page.&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%2Fmwp6rvr2xux69vemx49v.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%2Fmwp6rvr2xux69vemx49v.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; &lt;em&gt;Adding the Subscription&lt;/em&gt;&lt;br&gt;
I clicked the + Add button and filled in the necessary billing and profile details.&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%2Fup6gq7om492myursv8u6.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%2Fup6gq7om492myursv8u6.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; &lt;em&gt;Finalizing the Plan&lt;/em&gt;&lt;br&gt;
After reviewing the details and clicking Next, I hit 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%2Fifku3189ofqj8jr7sly7.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%2Fifku3189ofqj8jr7sly7.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; &lt;em&gt;Verification&lt;/em&gt;&lt;br&gt;
I checked my Notifications (the bell icon) to ensure the deployment was successful.&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%2Frdl1zfahy7e0as3qo193.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%2Frdl1zfahy7e0as3qo193.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; &lt;em&gt;Heading to Resource Groups&lt;/em&gt;&lt;br&gt;
With the subscription active, it was time to create the container for my projects. I navigated to the Resource Groups section from the sidebar.&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%2Fjmk7aklho11nzk7vp3me.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%2Fjmk7aklho11nzk7vp3me.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; &lt;em&gt;Starting the Resource Group Process&lt;/em&gt;&lt;br&gt;
I clicked Create to launch the setup wizard.&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%2F5ej563fpjahjll66856d.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%2F5ej563fpjahjll66856d.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8:&lt;/strong&gt; &lt;em&gt;Configuring the Group&lt;/em&gt;&lt;br&gt;
I named my resource group Assignment-1 and chose the (US) East US region to keep my resources centralized.&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%2Fbib91zt08qbeygc3j2sg.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%2Fbib91zt08qbeygc3j2sg.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9:&lt;/strong&gt; &lt;em&gt;Success!&lt;/em&gt;&lt;br&gt;
A quick check of the notifications confirmed that my Assignment-1 group was successfully created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10:&lt;/strong&gt; &lt;em&gt;The Result&lt;/em&gt;&lt;br&gt;
Now, I have a clean workspace ready for my Virtual Machines and other cloud resources.&lt;/p&gt;

&lt;p&gt;🏁 &lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Getting started with Azure felt a bit intimidating at first, but once you understand the hierarchy (Subscription &amp;gt; Resource Group &amp;gt; Resources), it all starts to click. This is just the beginning of my cloud journey!&lt;/p&gt;

&lt;p&gt;Are you just starting out with Azure or AWS? Let's connect in the comments and share tips!&lt;/p&gt;

&lt;h1&gt;
  
  
  cloudcomputing #azure #microsoftazure #devops #beginners #cloudengineering #fintech
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Cloud Computing: The Good, The Bad &amp; What You Actually Need to Know</title>
      <dc:creator>Amapakabo, Joseph I.</dc:creator>
      <pubDate>Wed, 18 Mar 2026 08:56:10 +0000</pubDate>
      <link>https://dev.to/jodev001/cloud-computing-the-good-the-bad-what-you-actually-need-to-know-29pn</link>
      <guid>https://dev.to/jodev001/cloud-computing-the-good-the-bad-what-you-actually-need-to-know-29pn</guid>
      <description>&lt;p&gt;No tech jargon. No confusing buzzwords. Just a plain, honest look at what the cloud actually is — and whether it's right for you.*&lt;/p&gt;




&lt;p&gt;Wait, what even is "the cloud"?&lt;/p&gt;

&lt;p&gt;You've probably heard someone say, &lt;strong&gt;"it's saved in the cloud"&lt;/strong&gt; and nodded along without really knowing what that means. You're not alone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Think of it this way:&lt;/strong&gt; Imagine you live in a rented apartment. You don't own the house, literally — you just meet the landlord or a realtor who takes you to inspect an apartment of your choice, among several fully built apartments, then pay at the end of the month, year as the case might be. &lt;strong&gt;Cloud computing works exactly like that&lt;/strong&gt;, only instead of an apartment, it's computer power, storage, and software delivered to you over the internet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In layman terms: instead of storing your photos, documents, or running software on your own computer or a hard drive sitting on your desk, those files and programs reside on &lt;strong&gt;someone else's powerful computer&lt;/strong&gt; (called a server) — and you access them via the internet from anywhere.&lt;/p&gt;

&lt;p&gt;You know Google Drive, Netflix, Gmail, Dropbox, Facebook or even WhatsApp. Every single one of these runs on the cloud. You use it every day, anywhere and anytime without realising it.&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%2F03ze6tyge5po1s28r45c.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%2F03ze6tyge5po1s28r45c.jpg" alt=" " width="275" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the picture above is what "the cloud" actually looks like behind the hood— massive buildings filled with servers (specially dedicated supercomputers) located in different regions across the globe.*&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"The cloud is not some fluffy bubble in the sky. It's an actual physical building full of computers in a warehouse somewhere — and you're renting a tiny piece of it at will."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ Some Advantages of Cloud Computing&lt;/p&gt;

&lt;p&gt;First, with the good stuff. There are some genuinely great reasons why businesses and everyday people have adopted the cloud the cloud for their daily computing needs.&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%2Few0t4nzzftw5u3xtbjg4.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%2Few0t4nzzftw5u3xtbjg4.jpg" alt=" " width="400" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Work from a coffee shop in Port Harcourt or a beach in the Bahamas— the cloud makes location irrelevant.*&lt;/p&gt;

&lt;p&gt;💰 1. You spend less Money&lt;/p&gt;

&lt;p&gt;Purchasing physical servers and hardware is a very cost intensive venture. With the cloud, you pay only for what you use — like a pay-as-you-go phone plan. No huge upfront costs. Small businesses especially benefit a lot from this.&lt;/p&gt;

&lt;p&gt;🌍 2. Location is Irrelevant&lt;/p&gt;

&lt;p&gt;Provided you are connected to the internet, you can easily access your files, tools, and apps from your phone, laptop, or any device, and work on the go — whether you're in Lagos, Lome, or Lekki.&lt;/p&gt;

&lt;p&gt;📈 3. Easily Scales to suit your needs&lt;/p&gt;

&lt;p&gt;Running a startup or a garage store today? Now growing into a big company? Scale up instantly. You can increase or decrease your usage without buying new hardware. Fun fact... done right, this can be done automatically.&lt;/p&gt;

&lt;p&gt;🔄 4. Backups can be Automated&lt;/p&gt;

&lt;p&gt;Remember the last time your computer crashed and you lost all your important stuff? Cloud to the rescue. Cloud services automatically back up your data so your files are safe even if your laptop breaks.&lt;/p&gt;

&lt;p&gt;🤝 5. Collaborate Easily&lt;/p&gt;

&lt;p&gt;Tools like Microsoft 365 lets multiple people connect and work on projects at the same time, from different locations around the world. Guess where these documents are housed, That's the cloud making teamwork seamless.&lt;/p&gt;

&lt;p&gt;🔧 6. Less Maintenance for You&lt;/p&gt;

&lt;p&gt;The company providing the cloud service handles all the technical upkeep — updates, security patches, hardware repairs. You just use it without worrying about the engine under the hood.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🌟 &lt;strong&gt;Real-World Example:&lt;/strong&gt; When COVID-19 hit and everyone had to work from home, companies already on the cloud barely skipped a beat. Their teams just logged in from home. Companies relying on physical office servers had a much harder time.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;❌ The Disadvantages of Cloud Computing&lt;/p&gt;

&lt;p&gt;Now for the honest part. The cloud isn't perfect. Here are real problems you should know about before jumping in headfirst.&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%2Fl5d7a43vaatkxqmlax2x.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%2Fl5d7a43vaatkxqmlax2x.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No internet? No cloud. That's the trade-off you need to think about.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;📶 1. You Need Stable Internet&lt;/p&gt;

&lt;p&gt;No internet, no access. If your connection is slow or keeps cutting out, working on the cloud becomes a nightmare. This is a real challenge in many parts of Africa where connectivity can be unreliable.&lt;/p&gt;

&lt;p&gt;🔐 2. Security &amp;amp; Privacy Worries&lt;/p&gt;

&lt;p&gt;When your data lives on someone else's computer, you have to trust them. Data breaches happen, and your sensitive information could be exposed. Not every cloud provider is equally trustworthy.&lt;/p&gt;

&lt;p&gt;🏦 3. Costs Can Creep Up&lt;/p&gt;

&lt;p&gt;While you save on hardware, monthly subscription fees add up. If you're not careful, you might find yourself paying for storage and services you're not even using.&lt;/p&gt;

&lt;p&gt;⚙️ 4. Less Control Over Your Data&lt;/p&gt;

&lt;p&gt;Your data is stored in a server you don't own, in a location you may not even know. If the provider changes their terms, gets hacked, or shuts down — your data is at their mercy.&lt;/p&gt;

&lt;p&gt;🚫 5. Downtime Can Happen&lt;/p&gt;

&lt;p&gt;Even the biggest cloud providers have had outages. When Amazon Web Services went down in 2021, it took Netflix, Disney+, and hundreds of other sites with it. You're dependent on their uptime.&lt;/p&gt;

&lt;p&gt;📜 6. Compliance &amp;amp; Legal Issues&lt;/p&gt;

&lt;p&gt;Depending on your industry or country, storing sensitive data on overseas servers can create legal complications. Some sectors (like healthcare) have strict rules about where data can live.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏠 &lt;strong&gt;Think of it like renting vs. owning a house:&lt;/strong&gt; Renting is flexible and cheaper upfront — but you don't control the house. The landlord can raise the rent, change the rules, or sell the property. &lt;strong&gt;Cloud computing is essentially renting your tech infrastructure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;📊 Quick Summary Table&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;✅ Advantage&lt;/th&gt;
&lt;th&gt;❌ Disadvantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No expensive hardware upfront&lt;/td&gt;
&lt;td&gt;Monthly fees can add up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Work from anywhere&lt;/td&gt;
&lt;td&gt;Needs reliable internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic data backup&lt;/td&gt;
&lt;td&gt;Still depends on provider&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;Providers invest in security&lt;/td&gt;
&lt;td&gt;Trusting a third party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Grow or shrink instantly&lt;/td&gt;
&lt;td&gt;Over-provisioning wastes money&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provider handles all updates&lt;/td&gt;
&lt;td&gt;No control over timing of changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time team editing&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Downtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Outages affect your whole operation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;🏁 Final Verdict&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should you use the cloud?&lt;/strong&gt; For most people and most businesses — &lt;strong&gt;yes&lt;/strong&gt;. The benefits outweigh the drawbacks, especially if you're building something modern. But go in with your eyes open. Understand what you're signing up for, pick reputable providers, and always have a backup plan.&lt;/p&gt;

&lt;p&gt;The cloud is a tool — a powerful one — not a magic fix for everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Did this help you? Drop a comment below 👇 and share it with someone who's been confused about "the cloud." And if you're a developer, check out AWS, Google Cloud, and Microsoft Azure as starting points.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>techtalks</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
