<?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: David Cletus</title>
    <description>The latest articles on DEV Community by David Cletus (@4thman).</description>
    <link>https://dev.to/4thman</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927892%2F43aac6d7-df74-4a90-bdbe-8ba55edf1a70.jpeg</url>
      <title>DEV Community: David Cletus</title>
      <link>https://dev.to/4thman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/4thman"/>
    <language>en</language>
    <item>
      <title>From Zero to Auto-Scaling Hero: Deploying a VMSS on Azure 🚀</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Wed, 08 Jul 2026 00:03:12 +0000</pubDate>
      <link>https://dev.to/4thman/from-zero-to-auto-scaling-hero-deploying-a-vmss-on-azure-48g5</link>
      <guid>https://dev.to/4thman/from-zero-to-auto-scaling-hero-deploying-a-vmss-on-azure-48g5</guid>
      <description>&lt;h1&gt;
  
  
  From Zero to Auto-Scaling Hero: Deploying a VMSS on Azure 🚀
&lt;/h1&gt;

&lt;p&gt;Ever wondered how big websites survive a sudden rush of visitors without crashing? The secret is &lt;strong&gt;auto-scaling&lt;/strong&gt; — the server army quietly grows when traffic spikes, and shrinks back down when things calm down, so nobody pays for computers they don't need.&lt;/p&gt;

&lt;p&gt;In this post, I'm walking you through &lt;strong&gt;exactly&lt;/strong&gt; how I built that on Microsoft Azure — from a completely empty subscription to a live webpage served by &lt;strong&gt;5 auto-scaling virtual machines&lt;/strong&gt; sitting behind a load balancer. &lt;/p&gt;

&lt;p&gt;By the end, you'll have your own mini traffic-proof web app running in the cloud, and you'll know how to tear it all down without leaving a single unpaid bill behind.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;This is part of a series!&lt;/strong&gt; I've already covered the foundational pieces in earlier posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔗 &lt;a href="https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4"&gt;https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4&lt;/a&gt; — The "land and street" this project is built on&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔗 &lt;a href="https://dev.to/4thman/i-built-my-first-azure-vm-from-scratch-and-hosted-a-live-website-1ob0"&gt;https://dev.to/4thman/i-built-my-first-azure-vm-from-scratch-and-hosted-a-live-website-1ob0&lt;/a&gt; — The basics of a single server, before we multiply it into a scale set&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of the early steps below feel unfamiliar, those posts break them down in full detail. Here, I'll recap them quickly and then dive deep into the part that's new: &lt;strong&gt;auto-scaling with VMSS&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 What We're Actually Building
&lt;/h2&gt;

&lt;p&gt;Think of it like building a house, street by street:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resource Group&lt;/strong&gt; – an empty folder that holds everything we create (so we can delete it all in one click later)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Network (VNet) + Subnet&lt;/strong&gt; – the private street our servers will live on&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Machine Scale Set (VMSS)&lt;/strong&gt; – a &lt;em&gt;group&lt;/em&gt; of identical servers that can grow or shrink automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load Balancer&lt;/strong&gt; – the traffic cop that spreads visitors evenly across all the servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tiny Apache web page&lt;/strong&gt; – so we have something to actually see working in the browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the flow in one picture (in your head, for now): &lt;strong&gt;Resource Group → Network → Subnet → Scale Set → Load Balancer → 🌍 Live Website&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Before You Start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An active Azure subscription (Pay-As-You-Go or free trial both work)&lt;/li&gt;
&lt;li&gt;Nothing else! Azure gives you everything else through the portal — no local software needed for this tutorial&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;(Optional but helpful)&lt;/em&gt; A quick read of my earlier posts on &lt;a href="https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4"&gt;https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4&lt;/a&gt; — This post builds directly on top of those concepts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Say Hello to the Azure Portal 👋
&lt;/h2&gt;

&lt;p&gt;Everything starts here — &lt;a href="https://portal.azure.com" rel="noopener noreferrer"&gt;portal.azure.com&lt;/a&gt;. This is mission control for every Azure resource you'll ever 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepsdl1idimlczddzxsoq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepsdl1idimlczddzxsoq.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Azure homepage — our home base for the whole build.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Quick Recap — Resource Group, VNet &amp;amp; Subnet 📁🛣️🏘️
&lt;/h2&gt;

&lt;p&gt;I've already walked through this part step-by-step in an earlier post, so here's the short version — &lt;strong&gt;check out Setting up a Resource Group, Virtual Network &amp;amp; Subnet on Azure for the full click-by-click guide.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what happened, in a nutshell:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Created a Resource Group&lt;/strong&gt; called &lt;strong&gt;Smyles-RG&lt;/strong&gt; — the folder that holds everything in this project, so it can all be deleted in one click 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1lz4devqnd8px7uof9m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1lz4devqnd8px7uof9m.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Built a Virtual Network&lt;/strong&gt; called &lt;strong&gt;Smyles-VN&lt;/strong&gt; inside that resource group — a private, isolated network, like a gated estate for our resources.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frqfnh0jb0jd7nw5tztl3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frqfnh0jb0jd7nw5tztl3.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Carved out a Subnet&lt;/strong&gt; called &lt;strong&gt;Smyles-Subnet&lt;/strong&gt; inside the VNet — a smaller slice of that estate where our servers will actually live.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9gzgscrhb2nfn2itwy88.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9gzgscrhb2nfn2itwy88.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Simple English tip:&lt;/strong&gt; Resource Group = the folder. VNet = the private estate. Subnet = the specific street inside it. Our servers move in next.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With the land prepped, we're ready for the main event.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Create the Virtual Machine Scale Set (VMSS) 🖥️🖥️🖥️
&lt;/h2&gt;

&lt;p&gt;This is the star of the show. A &lt;strong&gt;VMSS&lt;/strong&gt; doesn't create just &lt;em&gt;one&lt;/em&gt; server — it creates a &lt;em&gt;template&lt;/em&gt; for identical servers that Azure can multiply or shrink automatically based on demand.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 — Find and open VMSS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Search &lt;strong&gt;"vmss"&lt;/strong&gt; in the top search bar and select &lt;strong&gt;Virtual machine scale sets&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6lt9dixkw5ex1x9v1iv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6lt9dixkw5ex1x9v1iv.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0ydcaieagisn1pqtf0q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0ydcaieagisn1pqtf0q.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 — Basics: name, region, and zones
&lt;/h3&gt;

&lt;p&gt;Fill in the resource group (&lt;strong&gt;Smyles-RG&lt;/strong&gt;), give the scale set a name (&lt;strong&gt;Smyles-vmms&lt;/strong&gt;), pick your region, and choose &lt;strong&gt;Zones 1, 2, 3&lt;/strong&gt; for high availability (this spreads your servers across different physical data centers, so one outage doesn't take everything down).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rohzlhhmogtzpplfxzv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rohzlhhmogtzpplfxzv.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 — Orchestration and scaling mode
&lt;/h3&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration mode: Flexible&lt;/strong&gt; — the modern, more flexible way Azure manages your servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling mode: Autoscaling&lt;/strong&gt; — this is the whole point! Let Azure decide how many servers we need based on CPU usage&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxj1mqps2mq8nef0g3tmj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxj1mqps2mq8nef0g3tmj.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 — Configure the scaling rules
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Configure&lt;/strong&gt; to fine-tune exactly &lt;em&gt;how&lt;/em&gt; the auto-scaling should behave.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1tl1psbywp1g8ldg0964.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1tl1psbywp1g8ldg0964.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Add a scaling condition&lt;/strong&gt;, name it (&lt;strong&gt;Smyles-scaling-condition&lt;/strong&gt;), and set the instance limits — I chose a &lt;strong&gt;minimum of 2&lt;/strong&gt; and a &lt;strong&gt;maximum of 5&lt;/strong&gt; servers.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jajvv2ly3vummf9254z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jajvv2ly3vummf9254z.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then define the actual trigger rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale out&lt;/strong&gt; (add a server) when CPU usage goes &lt;strong&gt;above 80%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale in&lt;/strong&gt; (remove a server) when CPU usage drops &lt;strong&gt;below 20%&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy70dj9mxlncf8k4snibp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy70dj9mxlncf8k4snibp.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save it, and you'll see both the &lt;strong&gt;Default condition&lt;/strong&gt; and our new &lt;strong&gt;Smyles-scaling-condition&lt;/strong&gt; sitting side by side.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4nwri5mows6tlm4z1rn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4nwri5mows6tlm4z1rn.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;In plain English:&lt;/strong&gt; "If the servers are working too hard (above 80% CPU), add a helper. If they're bored (below 20% CPU), send a helper home. Never go below 2 or above 5 helpers."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3.5 — Instance details: OS, size, and count
&lt;/h3&gt;

&lt;p&gt;Set the instance count to &lt;strong&gt;5&lt;/strong&gt;, choose the image — I picked &lt;strong&gt;Ubuntu Server 24.04 LTS&lt;/strong&gt; — and select a size. I went with the budget-friendly &lt;strong&gt;Standard B1ms&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93wnmlk4ucb9pn7gefqj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93wnmlk4ucb9pn7gefqj.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.6 — Admin account
&lt;/h3&gt;

&lt;p&gt;Create a login for the servers. I used the username &lt;strong&gt;smyles&lt;/strong&gt; with a password (SSH keys work too, if you prefer).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvioc4yg6a09rcghb9ctp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvioc4yg6a09rcghb9ctp.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.7 — Networking: plug into our VNet
&lt;/h3&gt;

&lt;p&gt;Head to the &lt;strong&gt;Networking&lt;/strong&gt; tab. Select  &lt;strong&gt;Smyles-VN&lt;/strong&gt; and &lt;strong&gt;Smyles-Subnet&lt;/strong&gt;. Click &lt;strong&gt;Create new nic&lt;/strong&gt; to set up the network card for our servers.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22cmgrsj6hqnzojugwe4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22cmgrsj6hqnzojugwe4.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name the NIC (&lt;strong&gt;Smyles-Networkinterface&lt;/strong&gt;), keep the network security group on &lt;strong&gt;Basic&lt;/strong&gt;, and allow &lt;strong&gt;HTTP (port 80)&lt;/strong&gt; so the outside world can actually reach our website.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiionqivpm76cnyimgs3l.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiionqivpm76cnyimgs3l.png" alt=" " width="799" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.8 — Add a Load Balancer
&lt;/h3&gt;

&lt;p&gt;Still on the Networking tab, choose &lt;strong&gt;Azure load balancer&lt;/strong&gt;, then click &lt;strong&gt;Create a load balancer&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F36rmi0crjhcu2thucc64.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F36rmi0crjhcu2thucc64.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name it &lt;strong&gt;Smyles-loadbalancer&lt;/strong&gt;, set the type to &lt;strong&gt;Public&lt;/strong&gt; (so it has an internet-facing address), and the protocol to &lt;strong&gt;TCP&lt;/strong&gt;. 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7b3t43ifunc2jlcv9nce.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7b3t43ifunc2jlcv9nce.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Simple English tip:&lt;/strong&gt; A load balancer is like a receptionist. Visitors don't talk to individual servers — they talk to the receptionist, who quietly sends them to whichever server is free.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3.9 — Health monitoring
&lt;/h3&gt;

&lt;p&gt;Switch to the &lt;strong&gt;Health&lt;/strong&gt; tab and enable &lt;strong&gt;Application health monitoring&lt;/strong&gt;. This lets Azure automatically detect and replace any server that stops responding.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwlbyuefgbc8cwhx1rzke.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwlbyuefgbc8cwhx1rzke.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Configure&lt;/strong&gt; and set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol: &lt;strong&gt;HTTP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Port: &lt;strong&gt;80&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Request path: &lt;strong&gt;/&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqb8614u5fa19rusd8flb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqb8614u5fa19rusd8flb.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.10 — Custom Data (the magic script)
&lt;/h3&gt;

&lt;p&gt;This is where the servers get their personality. In the &lt;strong&gt;Advanced&lt;/strong&gt; tab, under &lt;strong&gt;Custom data and cloud-init&lt;/strong&gt;, I pasted a small Bash script that automatically installs a web server and creates a webpage — the moment each server boots up, it's already ready to greet visitors.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnglb3v7cpybe6z0j1fxv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnglb3v7cpybe6z0j1fxv.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the exact script I used:&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="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&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="nb"&gt;sudo &lt;/span&gt;systemctl start apache2
&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="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;body style="font-family:Arial;text-align:center;padding-top:100px;background:#f4f4f4"&amp;gt;
&amp;lt;h1 style="color:#0078D4"&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 VMSS 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="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this script does, in plain English:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apt-get update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Refreshes the list of available software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apt-get install apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Installs Apache — a popular web server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;systemctl enable/start apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turns the web server on, and keeps it on after reboots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HOSTNAME=$(hostname)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grabs the unique name of &lt;em&gt;this particular&lt;/em&gt; server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF ... EOF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes a simple HTML webpage that greets visitors with the server's own name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;systemctl restart apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restarts the web server so the new page shows up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cool part? Because this script runs on &lt;strong&gt;every single instance&lt;/strong&gt; in the scale set, each server will proudly display its &lt;strong&gt;own unique name&lt;/strong&gt; — so when we later refresh the load balancer's page, we can literally watch traffic bounce between different servers!&lt;/p&gt;

&lt;h3&gt;
  
  
  3.11 — Review and create
&lt;/h3&gt;

&lt;p&gt;With everything configured, click &lt;strong&gt;Review + create&lt;/strong&gt;. Wait for the green &lt;strong&gt;"Validation passed"&lt;/strong&gt; banner, then 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3nbvu7zbljzhxxf5hv7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3nbvu7zbljzhxxf5hv7.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sit back and relax while Azure spins up &lt;strong&gt;5 identical virtual machines&lt;/strong&gt; for you. ☕&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffsb821tsgmxfqmvxzuov.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffsb821tsgmxfqmvxzuov.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: See It Come Alive 🌍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 — Grab the load balancer's address
&lt;/h3&gt;

&lt;p&gt;Open your new scale set (&lt;strong&gt;Smyles-vmss&lt;/strong&gt;) and go to &lt;strong&gt;Networking → Load balancing&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F209evmauux6qtv5au63g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F209evmauux6qtv5au63g.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the &lt;strong&gt;Frontend IP address&lt;/strong&gt; — this is the single public address that represents &lt;em&gt;all five&lt;/em&gt; of your servers.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fudke3gwffdu390vayoqi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fudke3gwffdu390vayoqi.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 — Paste it in your browser
&lt;/h3&gt;

&lt;p&gt;Paste that IP address into a new browser tab and hit enter...&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewnif5d0xa4rx12bonny.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewnif5d0xa4rx12bonny.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Hello from smyles-vmR4TV8G"&lt;/strong&gt; — a real, working, auto-scaling web app, built entirely from the ground up! Refresh the page a few times and watch the hostname change as the load balancer sends you to different servers behind the scenes. That's auto-scaling infrastructure in action. 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Clean Up — Don't Leave the Lights On! 💡
&lt;/h2&gt;

&lt;p&gt;Cloud resources cost money for every hour they exist, even if nobody's visiting your website. Once you're done experimenting, tear it all down — and thanks to our Resource Group trick from Step 2 (or see the full explanation in my earlier Resource Group post), this takes seconds.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go back to &lt;strong&gt;Resource groups&lt;/strong&gt; and open &lt;strong&gt;Smyles-RG&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4gxazdjd6d4lzfj0dwsf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4gxazdjd6d4lzfj0dwsf.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Delete resource group&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnninyxawcuexe3i5vsfm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnninyxawcuexe3i5vsfm.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Type the resource group name to confirm (Azure double-checks so you don't delete anything by accident), then click &lt;strong&gt;Delete&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fionxvzgalnjdl26k2ys0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fionxvzgalnjdl26k2ys0.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And just like that — the VMs, load balancer, network, subnet, and everything else vanish, and your billing stops. One folder in, one folder out. Also do the same for &lt;strong&gt;&lt;em&gt;NetworkWatcherRG&lt;/em&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjf6emgmz1rnaiuptl9dg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjf6emgmz1rnaiuptl9dg.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What We Actually Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resource Groups&lt;/strong&gt; keep your projects tidy and easy to delete&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Networks &amp;amp; Subnets&lt;/strong&gt; give your servers a private, controlled space to live in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMSS with Autoscaling&lt;/strong&gt; means your infrastructure grows and shrinks with real demand — you stop paying for idle servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load Balancers&lt;/strong&gt; spread traffic so no single server gets overwhelmed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Data / cloud-init&lt;/strong&gt; lets you automate server setup completely — no manual SSH-ing into five different machines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health monitoring&lt;/strong&gt; keeps your app resilient by auto-replacing unhealthy instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the entire journey — from an empty Azure subscription to a self-healing, self-scaling website, torn down responsibly at the end. If you followed along, you didn't just read about cloud infrastructure — you built it. 🙌&lt;/p&gt;

&lt;p&gt;Got questions or stuck somewhere? &lt;strong&gt;Drop a comment below&lt;/strong&gt; — happy to help troubleshoot!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more hands-on Azure and cloud engineering walkthroughs, straight from my own learning journey.&lt;/em&gt; ☁️&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>developer</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built My First Azure Virtual Machine From Scratch and Hosted a Website Using Apache2 🌐</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Sat, 20 Jun 2026 15:15:00 +0000</pubDate>
      <link>https://dev.to/4thman/i-built-my-first-azure-vm-from-scratch-and-hosted-a-live-website-1ob0</link>
      <guid>https://dev.to/4thman/i-built-my-first-azure-vm-from-scratch-and-hosted-a-live-website-1ob0</guid>
      <description>&lt;h1&gt;
  
  
  Building My First Azure Virtual Machine From the Ground Up 🚀
&lt;/h1&gt;

&lt;p&gt;In this post, I'll walk you through &lt;strong&gt;exactly&lt;/strong&gt; how I went from an empty Azure subscription to a live Ubuntu VM running Apache, complete with every screen I clicked through. No skipped steps, no "and then magic happens."&lt;/p&gt;

&lt;p&gt;By the end, you'll be able to do this yourself in under 20 minutes. Let's go! 👇&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Heads up:&lt;/strong&gt; This is a follow-along tutorial. Grab a coffee, open a second tab with your Azure portal, and build alongside me.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ What You'll Build
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[x] A &lt;strong&gt;Resource Group&lt;/strong&gt; to hold everything together&lt;/li&gt;
&lt;li&gt;[x] A &lt;strong&gt;Virtual Network (VNet)&lt;/strong&gt; with a custom address space&lt;/li&gt;
&lt;li&gt;[x] A &lt;strong&gt;Subnet&lt;/strong&gt; inside that VNet&lt;/li&gt;
&lt;li&gt;[x] A &lt;strong&gt;Virtual Machine&lt;/strong&gt; (Ubuntu 24.04 LTS) deployed into that subnet&lt;/li&gt;
&lt;li&gt;[x] SSH access into the VM from VS Code's terminal&lt;/li&gt;
&lt;li&gt;[x] A live &lt;strong&gt;Apache2 web server&lt;/strong&gt; you can visit in your browser&lt;/li&gt;
&lt;li&gt;[x] A clean teardown so you don't get billed for forgetting it 💸&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;An Azure account (free tier works fine)&lt;/li&gt;
&lt;li&gt;A terminal — I used &lt;strong&gt;VS Code's integrated terminal (bash/Git Bash)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;15–20 minutes and a bit of curiosity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🗺️ The Architecture (in plain English)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resource Group  (the folder that holds everything)
   └── Virtual Network   (10.0.0.0/16)
         └── Subnet      (10.0.0.0/24)
               └── Virtual Machine  (Ubuntu 24.04, public IP, SSH + HTTP open)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resource Group first, then network, then subnet, then the actual VM goes &lt;em&gt;into&lt;/em&gt; that subnet. Let's build it top-down.&lt;/p&gt;




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

&lt;p&gt;A Resource Group is basically a folder in Azure — it keeps every resource for this project (network, VM, disks, IP) organized together so you can manage or delete them as one unit.&lt;/p&gt;

&lt;p&gt;Firstly I login into the Azure Homepage via &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;https://portal.azure.com/&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fep8vflamlqtcb9czzj7w.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fep8vflamlqtcb9czzj7w.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Azure homepage, I searched for &lt;strong&gt;Resource Groups&lt;/strong&gt; 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnurg5w70jjv925g5nmw9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnurg5w70jjv925g5nmw9.png" alt=" " width="800" height="361"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0iznoswc7nlth37lza3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0iznoswc7nlth37lza3.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I named mine &lt;code&gt;VM-RG-Test&lt;/code&gt; and picked &lt;strong&gt;France Central&lt;/strong&gt; as my region — pick whatever region is closest to you.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe97gel88sr93jk6weh5x.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe97gel88sr93jk6weh5x.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While on the Review + Create page, I clicked Create after reviewing the details of the Resource Group.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flehbeipofkmukowhc7ys.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flehbeipofkmukowhc7ys.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few seconds later — 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3xpi6kc7nwxl062mbfh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3xpi6kc7nwxl062mbfh.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Whatever region you pick here is the one you should use for &lt;em&gt;every&lt;/em&gt; resource in this tutorial. Mixing regions adds latency and (sometimes) extra cost.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Next, your VM needs a network to live in. I searched for &lt;strong&gt;Virtual networks&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0iiaukk7xivjpqkwz0a.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0iiaukk7xivjpqkwz0a.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and clicked &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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmkheezg9c1b38woo79cc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmkheezg9c1b38woo79cc.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I assigned it to my &lt;code&gt;VM-RG-Test&lt;/code&gt; resource group and named it &lt;code&gt;VM-Virtual-Network&lt;/code&gt;, same region as before.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6aiup8jtz8rjaad1ckgv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6aiup8jtz8rjaad1ckgv.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the &lt;strong&gt;Address space&lt;/strong&gt; tab, Azure gives you a default &lt;code&gt;10.0.0.0/16&lt;/code&gt; range with a default subnet already attached. I deleted that default subnet — I want to create my own with a name that actually makes sense — then hit &lt;strong&gt;Review + 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficrin7j0g7b75uz8qhe1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficrin7j0g7b75uz8qhe1.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Validation passed, so I clicked &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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8h9hqlbxf36zn7x9528g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8h9hqlbxf36zn7x9528g.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the deployment finished, I clicked &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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flir6qyndnjxtm7fjvgkb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flir6qyndnjxtm7fjvgkb.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Add a Subnet 🧩
&lt;/h2&gt;

&lt;p&gt;A VNet without a subnet is just an empty container — the subnet is where your VM's network card actually attaches.&lt;/p&gt;

&lt;p&gt;Inside the VNet, I went to &lt;strong&gt;Settings → Subnets&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy7cojm2kntabspkarozj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy7cojm2kntabspkarozj.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And clicked &lt;strong&gt;Create&lt;/strong&gt; on the &lt;strong&gt;subnet&lt;/strong&gt; 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9262iz41eis9ukzyyc2b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9262iz41eis9ukzyyc2b.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I named it &lt;code&gt;VM-Sub-Net&lt;/code&gt;, left the default &lt;code&gt;10.0.0.0/24&lt;/code&gt; range (251 usable IPs — plenty for one VM), and clicked &lt;strong&gt;Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb33sw282vps8ln6zhtjt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb33sw282vps8ln6zhtjt.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there it is — one ready-to-use subnet.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr6wvthba96v5rsr7uq38.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr6wvthba96v5rsr7uq38.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;This is the main event. I searched for &lt;strong&gt;Virtual machines&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6prl1bjaoh81x5zxyx1j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6prl1bjaoh81x5zxyx1j.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And clicked &lt;strong&gt;Create&lt;/strong&gt;, then selected the first option, which is &lt;strong&gt;Virtual Machine.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqep9q160cppi5gyx2gi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqep9q160cppi5gyx2gi.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 — Basics: name, region, resource group
&lt;/h3&gt;

&lt;p&gt;I dropped this VM into my existing &lt;code&gt;VM-RG-Test&lt;/code&gt; resource group and named it &lt;code&gt;VM-Test&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijk8tmusoatqtlgme7d2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijk8tmusoatqtlgme7d2.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 — Image, size, and authentication
&lt;/h3&gt;

&lt;p&gt;For the image, I went with &lt;strong&gt;Ubuntu Server 24.04 LTS - x64 Gen2&lt;/strong&gt;, kept the size small (&lt;code&gt;Standard_B1ls&lt;/code&gt;) to keep costs minimal, and chose &lt;strong&gt;SSH public key&lt;/strong&gt; as the authentication method instead of a password — much safer.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7bo4rqgc73dsci37lozq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7bo4rqgc73dsci37lozq.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 — Username, SSH key, and inbound ports
&lt;/h3&gt;

&lt;p&gt;I set my username to &lt;code&gt;VM-David&lt;/code&gt;, let Azure &lt;strong&gt;generate a new SSH key pair&lt;/strong&gt; for me, named the key &lt;code&gt;VM-Test_key&lt;/code&gt;, and allowed inbound traffic on &lt;strong&gt;HTTP (80)&lt;/strong&gt; and &lt;strong&gt;SSH (22)&lt;/strong&gt; — HTTP so I can later view my website, SSH so I can connect and manage the server.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwa7aq1q2u45rzamqkexk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwa7aq1q2u45rzamqkexk.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Allowing SSH from "any IP" is fine for a quick test like this, but for production you'd lock it down to your own IP address using the Advanced networking controls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.4 — Disks
&lt;/h3&gt;

&lt;p&gt;I kept the default &lt;strong&gt;Standard SSD&lt;/strong&gt; for the OS disk — good enough for a test server, no need for Premium SSD here.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw2jw0aoekzm6ln0nzdw2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw2jw0aoekzm6ln0nzdw2.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 — Networking: plugging it into our VNet/Subnet
&lt;/h3&gt;

&lt;p&gt;This is where everything we built earlier comes together — I selected my &lt;code&gt;VM-Virtual-Network&lt;/code&gt; and &lt;code&gt;VM-Sub-Net&lt;/code&gt;, let Azure create a new public IP, and chose &lt;strong&gt;HTTP (80), SSH (22)&lt;/strong&gt; as the allowed inbound ports.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6udoeuttrnrzylynfnd2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6udoeuttrnrzylynfnd2.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also checked &lt;strong&gt;"Delete public IP and NIC when VM is deleted"&lt;/strong&gt; — a small checkbox that saves you from leaving orphaned (and billable!) resources behind later.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv2q77sxkc7zg5i4ub0xi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv2q77sxkc7zg5i4ub0xi.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.6 — Review + Create
&lt;/h3&gt;

&lt;p&gt;Validation passed (estimated cost: under $8/month for this tiny config 🙌), so I 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mjejuptlor8s94g4hcp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mjejuptlor8s94g4hcp.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Azure immediately prompted me to &lt;strong&gt;download the private key&lt;/strong&gt; — this is your &lt;em&gt;only&lt;/em&gt; chance to grab it, since Azure never stores the private half of the key pair.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fghiloy51kbgxam4sbxm8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fghiloy51kbgxam4sbxm8.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there's my &lt;code&gt;.pem&lt;/code&gt; key, safely sitting in my Downloads folder.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwkztrs6w2it0tdpcp3d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwkztrs6w2it0tdpcp3d.png" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔐 &lt;strong&gt;Don't lose this file.&lt;/strong&gt; Without it, you can't SSH into your VM. Treat it like a password.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A minute or two later, the deployment finished.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9tl6fej0xwubshhprva.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9tl6fej0xwubshhprva.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Confirm the VM Is Alive ✅
&lt;/h2&gt;

&lt;p&gt;On the VM's overview page, I could see its public IP, private IP, region, and size — and the status read &lt;strong&gt;Running&lt;/strong&gt;.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Step 6: SSH In and Install Apache 🔧
&lt;/h2&gt;

&lt;p&gt;Time to actually log into the server. I opened VS Code's terminal then swicthed to Bash from Powershell(you can use Git-bash also), navigated to my Downloads folder (where the key lives), locked down the key's permissions, and connected.&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;# 1. Go to where the key was downloaded&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;Downloads

&lt;span class="c"&gt;# 2. Restrict permissions on the key (required by SSH)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;400 VM-Test_key.pem
&lt;span class="c"&gt;# (chmod 600 also works on most systems)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Connect to the VM using the key, username, and public IP&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; VM-Test_key.pem VM-David@98.66.137.84

&lt;span class="c"&gt;# 4. Update package lists&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update

&lt;span class="c"&gt;# 5. Install Apache2 web server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time you connect, SSH will ask if you trust the host's fingerprint — type &lt;code&gt;yes&lt;/code&gt; to continue. Running &lt;code&gt;whoami&lt;/code&gt; afterward confirmed I was logged in successfully.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2x8488jtvd5664iie0vs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2x8488jtvd5664iie0vs.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After updating, I installed Apache2:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxyp8v31ufynmwyp59m3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxyp8v31ufynmwyp59m3.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: See It Live in the Browser 🌍
&lt;/h2&gt;

&lt;p&gt;With Apache installed and running, I opened a browser and typed in the VM's &lt;strong&gt;public IP address&lt;/strong&gt;. And there it was — the Apache2 default "It works!" page, served straight from my own Azure VM.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9jhwg2cl2cxdbq12g2ax.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9jhwg2cl2cxdbq12g2ax.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was honestly the most satisfying part — seeing a page load from infrastructure I built myself, end to end. 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Clean Up — Delete the Resource Group 🧹
&lt;/h2&gt;

&lt;p&gt;Azure bills you for running resources, so once I was done testing, I deleted the whole resource group. Because everything (VM, disk, NIC, public IP, SSH key, VNet) was inside &lt;code&gt;VM-RG-Test&lt;/code&gt;, &lt;strong&gt;one deletion removes it all&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F45tyub1lmha8yhad6rvt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F45tyub1lmha8yhad6rvt.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👀 Spot the extra one? There's also a NetworkWatcherRG sitting in that list. Azure creates this automatically the first time you use any network diagnostics feature in a region — I didn't make it on purpose. It doesn't cost anything by itself, but since I was cleaning house, I deleted it too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Azure shows you exactly what's about to be deleted — 7 resources in my case — and makes you type the resource group's name to confirm. No accidental deletions here.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0s7zrzp93jimmv5jupw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0s7zrzp93jimmv5jupw.png" alt=" " width="799" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A couple minutes later, it was gone — clean slate, zero ongoing cost.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbk6fu4jhv0lwe327ef5g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbk6fu4jhv0lwe327ef5g.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Recap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What Happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Created a Resource Group (&lt;code&gt;VM-RG-Test&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Created a Virtual Network (&lt;code&gt;VM-Virtual-Network&lt;/code&gt;, &lt;code&gt;10.0.0.0/16&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Added a Subnet (&lt;code&gt;VM-Sub-Net&lt;/code&gt;, &lt;code&gt;10.0.0.0/24&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Deployed an Ubuntu VM into that subnet with an SSH key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Connected via SSH from VS Code's terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Installed and ran Apache2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Visited the live page in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Deleted everything to avoid surprise charges&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🗣️ Over to you
&lt;/h3&gt;

&lt;p&gt;Drop a comment below 👇 — and if this helped you, a like/follow goes a long way! 🙌&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Inside Azure Networking: How I Created a Virtual Network with Custom Subnets</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Thu, 04 Jun 2026 23:54:09 +0000</pubDate>
      <link>https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4</link>
      <guid>https://dev.to/4thman/inside-azure-networking-how-i-created-a-virtual-network-with-custom-subnets-35g4</guid>
      <description>&lt;p&gt;If you've ever stared at the Azure portal wondering where to even begin with networking, you're not alone. I was right there a few weeks ago. In this post, I'm walking you through exactly what I did — from creating a resource group to building a virtual network with three custom subnets. No fluff, just real steps with real screenshots.&lt;br&gt;
Let's get into it.&lt;/p&gt;

&lt;p&gt;Head over to portal.azure.com&lt;br&gt;
Once logged 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%2F7hq3gbn9sc4ccouc6ddd.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%2F7hq3gbn9sc4ccouc6ddd.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Search for Resource Groups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first thing you want to do is head to the Azure portal and use the search bar at the top to look up "resource group". You'll see it pop up under Services — click on Resource groups.&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%2F0ehdhzvsvwh82om5ixty.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%2F0ehdhzvsvwh82om5ixty.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Quick note: &lt;em&gt;I covered resource group creation in a previous blog too, but I'm including the steps here again so this post is fully self-contained. No jumping around needed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Create a New Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you're on the Resource Groups page, you'll see a list of any existing groups or an empty list with a create button visible on the page. To create a new one, click the + Create button at the top left.&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%2Fugt25ehdlmhw5ni9zesc.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%2Fugt25ehdlmhw5ni9zesc.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Fill in the Resource Group Details&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the creation form, you need to fill in three things:&lt;/p&gt;

&lt;p&gt;Subscription — select your active subscription (mine is Azure subscription 1)&lt;br&gt;
Resource group name — I named mine Netaccess&lt;br&gt;
Region — I chose (Africa) South Africa North since that's closest to me&lt;/p&gt;

&lt;p&gt;Once filled in, click Review + 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%2Ft3nt44ao99c0qvbzvcrd.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%2Ft3nt44ao99c0qvbzvcrd.png" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Review and Create the Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You'll be taken to a summary screen. Confirm the details look right — subscription, name, and region. Then hit the Create button at the bottom.&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%2Fmbvxamym9bwrtp5qdps6.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%2Fmbvxamym9bwrtp5qdps6.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Resource Group Created!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once Azure finishes provisioning (it's pretty fast — usually a few seconds), you'll see a notification on the right confirming that the resource group was created successfully. Your new Netaccess group will now appear in the list.&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%2Fxconcxza0wj7kfmjtbw6.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%2Fxconcxza0wj7kfmjtbw6.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6 — Search for Virtual Networks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that our resource group is ready, it's time to create a Virtual Network inside it. Use the top search bar again and type "virtual networks". Click on Virtual networks from the Services 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%2Fm3i1chajv1rvyu86qhpo.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%2Fm3i1chajv1rvyu86qhpo.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7 — Create a Virtual Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You'll land on the Virtual Networks overview page. Since we don't have any yet, it'll say "No virtual networks to display." Click the + Create button (either at the top or the one in the centre of the 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%2F2f48yti6ivsqp8z4c57g.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%2F2f48yti6ivsqp8z4c57g.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8 — Fill in the Virtual Network Basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the Basics tab of the creation wizard, configure the following:&lt;/p&gt;

&lt;p&gt;Subscription — Azure subscription 1&lt;br&gt;
Resource group — Select the Netaccess group we just created&lt;br&gt;
Virtual network name — I named it Netaccess-VM&lt;br&gt;
Region — (Africa) South Africa North&lt;/p&gt;

&lt;p&gt;Then click Next to move to the next tab.&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%2Ftxhndetaowch5f2i18ab.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%2Ftxhndetaowch5f2i18ab.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9 — Configure Address Space and Delete the Default Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skip past the Security tab (leave everything as default) and head to the Address space tab. Here Azure has already set up a default address space of 10.0.0.0/16 — that gives us 65,536 IP addresses, which is way more than enough.&lt;br&gt;
Now here's the important part: Azure also pre-creates a default subnet with the range 10.0.0.0 - 10.0.0.255 (/24). We're going to delete this because we want to create our own subnets with custom names and IP ranges.&lt;br&gt;
Click the trash/delete icon on the right side of the default subnet row to remove 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%2Ffvm925y995eb51lox0e2.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%2Ffvm925y995eb51lox0e2.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why delete the default subnet? Because accepting defaults means Azure names and organises things on your behalf. When you create your own subnets from scratch, you control the naming convention, IP ranges, and how traffic is logically segmented. Clean slate = cleaner architecture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10 — Review and Create the Virtual Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click through to the Review + create tab. You'll see a green "Validation passed" banner at the top — Azure confirming everything looks good. Take a moment to review the summary:&lt;/p&gt;

&lt;p&gt;Subscription: Azure subscription 1 ✅&lt;br&gt;
Resource Group: Netaccess ✅&lt;br&gt;
Name: Netaccess-VM ✅&lt;br&gt;
Region: South Africa North ✅&lt;br&gt;
Security (Bastion, Firewall, DDoS): all Disabled ✅&lt;/p&gt;

&lt;p&gt;Hit the Create button at the bottom.&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%2Fbbp18o2z0lgi7efks97g.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%2Fbbp18o2z0lgi7efks97g.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 11 — Deployment Complete — Click "Go to Resource"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Azure will now provision your virtual network. It usually takes just a minute or less. Once done, you'll land on the deployment overview showing "Your deployment is complete" with a green checkmark.&lt;br&gt;
Click Go to resource to open your newly created Netaccess-VM virtual network.&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%2Fi07578ekvm5g13vqer3z.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%2Fi07578ekvm5g13vqer3z.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 12 — Explore the VNet Overview and Navigate to Subnets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You're now inside the Netaccess-VM virtual network overview page. You can see all the essentials — resource group, location, address space (10.0.0.0/16), and notice it currently shows 0 subnets (because we deleted the default one earlier).&lt;br&gt;
&lt;em&gt;&lt;strong&gt;In the left sidebar under Settings, click on Subnets.&lt;/strong&gt;&lt;/em&gt; This is where we'll build all three of our custom subnets.&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%2F3t3f7vlyqxidbjyh3kep.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%2F3t3f7vlyqxidbjyh3kep.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 13 — Click "+ Subnet" to Start Adding Subnets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you're on the Subnets page, you'll see "No items found" — exactly as expected. Click the + Subnet button at the top of the page to open the "Add a subnet" panel on the right side.&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%2Fx7dh1mpss08bfzbs5ixc.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%2Fx7dh1mpss08bfzbs5ixc.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 14 — Add Subnet 1 (Netaccess-subnet1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "Add a subnet" panel slides in from the right. Fill in the following:&lt;/p&gt;

&lt;p&gt;Subnet purpose — Default&lt;br&gt;
Name — Netaccess-subnet1&lt;br&gt;
IPv4 address range — 10.0.0.0/16 (this is auto-populated from your VNet address space)&lt;br&gt;
Starting address — 10.0.0.0&lt;br&gt;
Size — /24 (256 addresses)&lt;/p&gt;

&lt;p&gt;This creates a subnet range of 10.0.0.0 - 10.0.0.255. Leave IPv6 unchecked and scroll down to click Add.&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%2Fpr7j5kn32anjacasfkb0.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%2Fpr7j5kn32anjacasfkb0.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 15 — Add Subnet 2 (Netaccess-subnet2)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click + Subnet again to add the second subnet. You'll notice the panel now shows the existing subnet1 listed on the left — that's just confirmation it was saved. Fill in the new details:&lt;/p&gt;

&lt;p&gt;Name — Netaccess-subnet2&lt;br&gt;
Starting address — 10.0.1.0&lt;br&gt;
Size — /24 (256 addresses)&lt;/p&gt;

&lt;p&gt;Subnet range: 10.0.1.0 - 10.0.1.255. Click 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%2Fpno3tel2g0g36fe213op.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%2Fpno3tel2g0g36fe213op.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice how we moved the third octet from .0.0 to .1.0 for the second subnet — that's how we keep each subnet in its own separate IP block within the same /16 space. No overlap, no conflict, no headaches so we do the same to create Netaccess-subnet3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 16 — All Three Subnets Created Successfully&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeat the same process one final time for the third subnet:&lt;/p&gt;

&lt;p&gt;Name — Netaccess-subnet3&lt;br&gt;
Starting address — 10.0.2.0&lt;br&gt;
Size — /24&lt;/p&gt;

&lt;p&gt;After saving, your Subnets page will now show all three subnets neatly listed with their IPv4 ranges highlighted:&lt;br&gt;
NameIPv4 RangeAvailable IPsNetaccess-subnet110.0.0.0/24251Netaccess-subnet210.0.1.0/24251Netaccess-subnet310.0.2.0/24251&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%2F9mwalupb6xdkqo6o1ycc.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%2F9mwalupb6xdkqo6o1ycc.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each subnet has 251 usable IP addresses — When a resource is created, it uses one IP address from its subnet, and that IP is no longer available in the virtual network's address range. However, IP usage is managed at the subnet level, so a subnet can run out of addresses while the virtual network still has many unused IPs available in other subnets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup — Deleting the Resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once I was done with the lab, I cleaned everything up to avoid unnecessary charges. Here's how:&lt;br&gt;
Delete the Netaccess Resource Group&lt;br&gt;
Go back to Resource groups, select Netaccess, click Delete resource group, type the name to confirm, and hit Delete.&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%2F0gozx30n2bfk9q1k86gz.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%2F0gozx30n2bfk9q1k86gz.png" alt=" " width="800" height="361"&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%2Fubgvipa7gzrln8cszmh4.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%2Fubgvipa7gzrln8cszmh4.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delete the NetworkWatcherRG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Azure automatically creates a NetworkWatcherRG resource group when you deploy networking resources. Delete this one too — same process: select it, click Delete resource group, type the name, confirm.&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%2Fy41turp9hcn1y9hst16q.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%2Fy41turp9hcn1y9hst16q.png" alt=" " width="800" height="362"&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%2Fgm67fswtldp47qtg5soo.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%2Fgm67fswtldp47qtg5soo.png" alt=" " width="799" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All Resource Groups Deleted&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once both are gone, your resource groups list is clean again — back to just the ones you had before (in my case, only Je-mega-soft remains).&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%2F5eu0jx82kaqiyup9390c.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%2F5eu0jx82kaqiyup9390c.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the full recap of what we did:&lt;/p&gt;

&lt;p&gt;✅ Searched for and opened Resource Groups&lt;br&gt;
✅ Created the Netaccess resource group in South Africa North&lt;br&gt;
✅ Searched for and navigated to Virtual Networks&lt;br&gt;
✅ Filled in VNet Basics — name Netaccess-VM, resource group Netaccess&lt;br&gt;
✅ On the Address space tab, deleted the auto-generated default subnet&lt;br&gt;
✅ Reviewed and created the Virtual Network (validation passed)&lt;br&gt;
✅ Deployment completed — clicked Go to resource&lt;br&gt;
✅ Navigated to the Subnets section inside the VNet&lt;br&gt;
✅ Clicked + Subnet to start adding custom subnets&lt;br&gt;
✅ Created Netaccess-subnet1 → 10.0.0.0/24&lt;br&gt;
✅ Created Netaccess-subnet2 → 10.0.1.0/24&lt;br&gt;
✅ Created Netaccess-subnet3 → 10.0.2.0/24&lt;br&gt;
✅ Cleaned up both Netaccess and NetworkWatcherRG resource groups&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Understanding how to manually structure your subnets gives you real control over how traffic flows in your cloud environment. Instead of accepting defaults, you're deliberately choosing IP ranges — which becomes crucial when you start doing things like:&lt;/p&gt;

&lt;p&gt;Separating frontend and backend application tiers&lt;br&gt;
Connecting on-premises networks via VPN Gateway or ExpressRoute&lt;br&gt;
Setting up Network Security Groups (NSGs) with rules per subnet&lt;br&gt;
Deploying services that require dedicated subnets (like Azure Bastion or App Gateway)&lt;/p&gt;

&lt;p&gt;This is foundational Azure networking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If this helped you, drop a ❤️ or leave a comment — especially if you ran into something different in your own setup. I'd love to hear about it.&lt;br&gt;
Until next time — keep building! 🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>devops</category>
      <category>networking</category>
    </item>
    <item>
      <title>How I Hosted a Free Website on Azure Blob Storage (No Server Needed!)</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Wed, 03 Jun 2026 07:33:07 +0000</pubDate>
      <link>https://dev.to/4thman/how-i-hosted-a-free-website-on-azure-blob-storage-no-server-needed-188</link>
      <guid>https://dev.to/4thman/how-i-hosted-a-free-website-on-azure-blob-storage-no-server-needed-188</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;So I wanted to host a website without paying for a web server or dealing with complex configurations. Turns out, Azure Blob Storage has a brilliant feature called Static Website Hosting that lets you serve HTML, CSS, and JavaScript files directly from a storage container — kind of like having a mini web host built into your cloud storage.&lt;br&gt;
In this post, I'll walk you through exactly what I did, step by step, with screenshots. The website template I used is called Nexus Brew — a cyberpunk-themed cafe website from Tooplate.com, which offers free HTML templates.&lt;br&gt;
By the end of this guide, your site will be live at a URL like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jewebs.blob.core.windows.net/$web/index.html" rel="noopener noreferrer"&gt;https://jewebs.blob.core.windows.net/$web/index.html&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Step 1 — Download the Nexus Brew Template from Tooplate&lt;br&gt;
Before jumping into Azure, the first thing I did was grab the website template.&lt;br&gt;
I went to tooplate.com — a site that offers clean, modern, free HTML templates built with Bootstrap and CSS. They have over 80 templates for startups, small businesses, and portfolios.&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%2F9oaul8dvl3lpde1dbvy0.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%2F9oaul8dvl3lpde1dbvy0.png" alt=" " width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I searched for and found the Nexus Brew 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%2Fwo95sy46nf0hytyl7slu.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%2Fwo95sy46nf0hytyl7slu.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a dark, cyberpunk-style cafe website template with features like:&lt;/p&gt;

&lt;p&gt;A hero banner section&lt;br&gt;
A tabbed menu showcase&lt;br&gt;
An about section with content and images&lt;br&gt;
A contact form&lt;br&gt;
Social media links&lt;br&gt;
Smooth scroll navigation and hover effects&lt;/p&gt;

&lt;p&gt;It looks super cool — very futuristic and modern. Perfect for learning!&lt;br&gt;
I clicked the Download button on the template page to grab the zip file.&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%2Fbf2l6t3knaps0uii1c3g.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%2Fbf2l6t3knaps0uii1c3g.png" alt=" " width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The downloaded file was named 2146_nexus_brew.zip and it landed in my Downloads folder.&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%2F7iqfc0x73sypl5lw9a74.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%2F7iqfc0x73sypl5lw9a74.png" alt=" " width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2 — Extract the Zip File&lt;br&gt;
After downloading, &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%2Fhool87a0qgc4xtub3d19.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%2Fhool87a0qgc4xtub3d19.png" alt=" " width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I extracted the zip file. Inside the 2146_nexus_brew folder, you'll find these files:&lt;/p&gt;

&lt;p&gt;index.html — the main HTML page&lt;br&gt;
tooplate-nexus-brew.css — the stylesheet&lt;br&gt;
tooplate-nexus-scripts.js — the JavaScript file&lt;br&gt;
ABOUT THIS TEMPLATE.txt — info about the template&lt;br&gt;
images/ — a folder containing all the images used on the site&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%2F63945xkf8uy1nhqbnpml.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%2F63945xkf8uy1nhqbnpml.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are all the files I'll need to upload to Azure later.&lt;/p&gt;

&lt;p&gt;Step 3 — Find Resource Groups in the Azure Portal&lt;br&gt;
Now it's time to head over to portal.azure.com.&lt;br&gt;
Once logged 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%2Flpdk03oaelvhox71cxx2.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%2Flpdk03oaelvhox71cxx2.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used the search bar at the top and typed "resource group". In the dropdown that appeared, I clicked on Resource groups (the one listed under Services).&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%2Fkhkhagnfmrmrxs8dd2tp.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%2Fkhkhagnfmrmrxs8dd2tp.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is a Resource Group?&lt;br&gt;
Think of a Resource Group as a folder in Azure where you keep related things together. It helps you manage, organize, and delete resources (like storage accounts) as a unit.&lt;/p&gt;

&lt;p&gt;Step 4 — View the Existing Resource Group Created in the Last Blog&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%2F3onm6haapiqbvy4rvedd.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%2F3onm6haapiqbvy4rvedd.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking Resource groups, I could see my existing resource group named Je-mega-soft which was created in our last blog, located in South Africa North under Azure subscription 1.&lt;br&gt;
I clicked on it to open it.&lt;/p&gt;

&lt;p&gt;Step 5 — Search for Storage Accounts&lt;br&gt;
Inside the Resource Manager section, I used the search bar again and typed "storage account". From the suggestions, I clicked on Storage accounts (the one listed under Services — not the classic version).&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%2Fok5ejeq5n7vtmvs0g41s.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%2Fok5ejeq5n7vtmvs0g41s.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This took me to the Storage center where I could see existing storage accounts and create new ones.&lt;/p&gt;

&lt;p&gt;Step 6 — Create a New Storage Account&lt;br&gt;
On the Storage center page, I clicked the + Create button at the top to start creating a new storage account.&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%2Ff8x69t6kqeoeitvfkrut.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%2Ff8x69t6kqeoeitvfkrut.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Basics tab of the creation form, I filled in these details:&lt;/p&gt;

&lt;p&gt;Resource group: Je-mega-soft (selected from the dropdown)&lt;br&gt;
Storage account name: jewebs (this has to be globally unique — all lowercase, no special characters)&lt;br&gt;
Region: (Africa) South Africa North (I chose the region closest to me)&lt;br&gt;
Preferred storage type: Azure Blob Storage or Azure Data Lake Storage&lt;br&gt;
Performance: Standard (recommended for most use cases)&lt;br&gt;
Redundancy: Locally Redundant Storage (LRS) (the most affordable option — stores 3 copies of your data within one data center)&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%2F0wdjw1nizuxnrcj8n12j.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%2F0wdjw1nizuxnrcj8n12j.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why LRS? For a static website that's just for learning or low-traffic use, LRS is more than enough and the cheapest option. &lt;/p&gt;

&lt;p&gt;Step 7 — Enable Anonymous Access in the Security Tab&lt;br&gt;
After filling in the Basics, I clicked Next to navigate through the tabs until I reached the Security tab.&lt;br&gt;
Here, the most important setting to enable is:&lt;br&gt;
✅ Allow enabling anonymous access on individual containers&lt;br&gt;
I made sure this checkbox was ticked.&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%2Fk266z1ivbyo2u6vqpk4y.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%2Fk266z1ivbyo2u6vqpk4y.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The red arrow in my screenshot points directly to this option — don't miss it!&lt;/p&gt;

&lt;p&gt;Why is this important? Without enabling anonymous access, your static website files would be private by default. No one on the internet would be able to open your website. Enabling this allows the $web container (which Azure creates for static websites) to serve files publicly.&lt;/p&gt;

&lt;p&gt;Once done, I clicked Review + create, reviewed the settings, and clicked 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%2Fo8vue51we30iws35yd34.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%2Fo8vue51we30iws35yd34.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8 — Deployment Complete! Go to Resource&lt;br&gt;
After a few seconds, the deployment finished and I saw the "Your deployment is complete" message.&lt;br&gt;
The notification bell at the top right also showed a green checkmark saying "Deployment succeeded" — the deployment was to resource group Je-mega-soft.&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%2Fy2ok07guzoeccsw49jr6.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%2Fy2ok07guzoeccsw49jr6.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I clicked the Go to resource button (there's one in the main panel and one in the notification panel — either works) to open the newly created storage account.&lt;/p&gt;

&lt;p&gt;Step 9 — Navigate to Static Website Settings&lt;br&gt;
Now I was inside the jewebs storage account dashboard.&lt;br&gt;
On the left sidebar, I scrolled down and expanded the Data management section. Inside it, I clicked on Static website.&lt;/p&gt;

&lt;p&gt;If you don't see Data management, look for it in the left panel — it's usually collapsed. The red arrow in my screenshot points directly to 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%2Fvetja4ofyalnp2ef5sfh.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%2Fvetja4ofyalnp2ef5sfh.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 10 — Enable the Static Website Feature&lt;br&gt;
On the Static website page, by default the feature is set to Disabled.&lt;br&gt;
I clicked on Enabled to turn it on.&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%2Fatqkpysovwuekwubx8dm.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%2Fatqkpysovwuekwubx8dm.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as I enabled it, two input fields appeared:&lt;/p&gt;

&lt;p&gt;Index document name: nexus_brew.html&lt;br&gt;
Error document path: ERROR-404.html&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%2Flgycikyhx0gbbjw9kjns.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%2Flgycikyhx0gbbjw9kjns.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the page that shows when someone visits a URL that doesn't exist. You can create a simple 404 page or just use the default.&lt;/p&gt;

&lt;p&gt;After filling these in, I clicked Save.&lt;/p&gt;

&lt;p&gt;Step 11 — Settings Saved Successfully&lt;br&gt;
A green notification appeared in the top right corner saying "Successfully updated static website settings".&lt;br&gt;
On the same page, I could now see:&lt;/p&gt;

&lt;p&gt;The static website is Enabled&lt;br&gt;
A message saying: "An Azure Storage container has been created to host your static website."&lt;br&gt;
A link to the container: $web&lt;br&gt;
The Primary endpoint URL: &lt;a href="https://jewebs.z1.web.core.windows.net/" rel="noopener noreferrer"&gt;https://jewebs.z1.web.core.windows.net/&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%2Fbgob76pa9qnuomvfa3al.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%2Fbgob76pa9qnuomvfa3al.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is $web? This is a special Azure container that's automatically created when you enable static website hosting. It's where you'll upload all your website files.&lt;/p&gt;

&lt;p&gt;I clicked on $web to open that container.&lt;/p&gt;

&lt;p&gt;Step 12 — Upload Files to the $web Container&lt;br&gt;
Inside the $web container, it was empty — showing "No items found".&lt;br&gt;
I clicked the Upload button at the top to open the Upload blob panel on the right side.&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%2Fmd1zvn3pbhg336kd9xk6.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%2Fmd1zvn3pbhg336kd9xk6.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I then selected all the files from the extracted Nexus Brew folder:&lt;/p&gt;

&lt;p&gt;index.html&lt;br&gt;
tooplate-nexus-brew.css&lt;br&gt;
tooplate-nexus-scripts.js&lt;br&gt;
ABOUT THIS TEMPLATE.txt&lt;br&gt;
The images folder&lt;/p&gt;

&lt;p&gt;The upload panel showed "7 file(s) selected" (the images folder contains multiple image files, so the total count goes up).&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%2Fzx7yk6j6i55gz02w7pce.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%2Fzx7yk6j6i55gz02w7pce.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I clicked the Upload button in the panel to start the upload.&lt;/p&gt;

&lt;p&gt;Important tip: Make sure to upload the contents of the folder, not the folder itself. Azure Blob Storage needs the files at the root level of $web for the static website to work correctly. If you upload a folder as a subfolder, your index page won't load properly.&lt;/p&gt;

&lt;p&gt;Step 13 — Files Successfully Uploaded&lt;br&gt;
After the upload completed, the $web container now showed all my files:&lt;br&gt;
NameTypeSizeimagesFolder—ABOUT THIS TEMPLATE.txtBlock blob557 Bindex.htmlBlock blob16.8 KiBtooplate-nexus-brew.cssBlock blob24.78 KiBtooplate-nexus-scripts.jsBlock blob3.52 KiB&lt;br&gt;
All 5 items were now visible and available in the container — uploaded on 6/2/2026 at 10:38 PM.&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%2Fx529ia06dk6tmty6mot5.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%2Fx529ia06dk6tmty6mot5.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 14 — Copy the URL of the Index File&lt;br&gt;
To get the direct URL of the uploaded index.html file, I:&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%2Ffrubzql0xzz50s5cesza.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%2Ffrubzql0xzz50s5cesza.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicked the three-dot menu (...) next to index.html&lt;br&gt;
Selected Copy URL from the context menu&lt;/p&gt;

&lt;p&gt;The URL I got was:&lt;br&gt;
&lt;a href="https://jewebs.blob.core.windows.net/$web/index.html" rel="noopener noreferrer"&gt;https://jewebs.blob.core.windows.net/$web/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: There are actually two URLs you can use:&lt;/p&gt;

&lt;p&gt;Blob URL (direct file): &lt;a href="https://jewebs.blob.core.windows.net/$web/index.html" rel="noopener noreferrer"&gt;https://jewebs.blob.core.windows.net/$web/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Static website URL (cleaner): &lt;a href="https://jewebs.z1.web.core.windows.net/" rel="noopener noreferrer"&gt;https://jewebs.z1.web.core.windows.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Website Is Live! 🎉&lt;/p&gt;

&lt;p&gt;That's it! The Nexus Brew template is now hosted live on Azure Blob Storage as a static website.&lt;br&gt;
You can visit it at:&lt;br&gt;
👉 &lt;a href="https://jewebs.blob.core.windows.net/$web/index.html" rel="noopener noreferrer"&gt;https://jewebs.blob.core.windows.net/$web/index.html&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%2F7f0kr6g51hytz5hgpya5.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%2F7f0kr6g51hytz5hgpya5.png" alt=" " width="800" height="407"&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%2Fsoqwtum6shyrtstktf8a.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%2Fsoqwtum6shyrtstktf8a.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           Quick Summary of All Steps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here's a quick recap of everything we did:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloaded the Nexus Brew free HTML template from tooplate.com&lt;/li&gt;
&lt;li&gt;Extracted the zip file and noted the files inside&lt;/li&gt;
&lt;li&gt;Open the Azure Portal and search for Resource groups in the Azure portal&lt;/li&gt;
&lt;li&gt;Opened the existing Je-mega-soft resource group which was previously showed on our last blog how to create.&lt;/li&gt;
&lt;li&gt;Searched for Storage accounts and clicked Create&lt;/li&gt;
&lt;li&gt;Configured the storage account with name jewebs, region South Africa North, Standard performance, and LRS redundancy&lt;/li&gt;
&lt;li&gt;In the Security tab, enabled Allow anonymous access on containers&lt;/li&gt;
&lt;li&gt;Deployed and clicked Go to resource&lt;/li&gt;
&lt;li&gt;Navigated to Data management → Static website&lt;/li&gt;
&lt;li&gt;Enabled static website hosting and set the index document name&lt;/li&gt;
&lt;li&gt;Saved settings and noted the $web container and primary endpoint URL&lt;/li&gt;
&lt;li&gt;Opened the $web container and uploaded all website files&lt;/li&gt;
&lt;li&gt;Confirmed all files were uploaded successfully&lt;/li&gt;
&lt;li&gt;Copied the URL and opened the live websit
e&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why I Loved This Approach&lt;/p&gt;

&lt;p&gt;Honestly, this whole setup took less than 15 minutes and didn't require me to set up a web server, configure Nginx or Apache, deal with SSL certificates manually, or pay for a VM. Azure handles everything for you and even gives you HTTPS for free through the static website endpoint.&lt;br&gt;
For simple websites — portfolios, landing pages, documentation sites, or just practice — this is one of the easiest and cheapest ways to get something live on the internet.&lt;/p&gt;

&lt;p&gt;Resources Used:&lt;/p&gt;

&lt;p&gt;Tooplate.com — Free HTML templates&lt;br&gt;
Azure Static Website Hosting Docs&lt;br&gt;
Azure Account.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Step-by-Step Guide to Azure Blob Storage: Uploading Files, Enabling Public Access, and Secure SAS Link Generation</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Thu, 28 May 2026 22:09:47 +0000</pubDate>
      <link>https://dev.to/4thman/step-by-step-guide-to-azure-blob-storage-uploading-files-enabling-public-access-and-secure-sas-21lm</link>
      <guid>https://dev.to/4thman/step-by-step-guide-to-azure-blob-storage-uploading-files-enabling-public-access-and-secure-sas-21lm</guid>
      <description>&lt;p&gt;In this article, I will walk through how I created an Azure Storage account, configured Blob Storage, uploaded a file, made it publicly accessible, and finally generated a Shared Access Signature (SAS) link for secure access.&lt;/p&gt;

&lt;p&gt;This is part of my hands-on learning journey in Cloud Computing and DevOps using Microsoft Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating the Azure Storage Account&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%2F292c1x73zol1n02flu2f.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%2F292c1x73zol1n02flu2f.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first step was to create a Storage Account in Microsoft Azure. This is the core service that provides a scalable location for storing files such as images, videos, documents, and backups.&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%2Fv3rqaa8u9tfctb2tztmk.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%2Fv3rqaa8u9tfctb2tztmk.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configuration used:&lt;br&gt;
Resource Group: je-mega-soft&lt;br&gt;
Storage Account Name: prodjemegastorage1&lt;br&gt;
Region: Africa (South Africa North)&lt;br&gt;
Primary Service: Azure Blob Storage&lt;br&gt;
Performance: Standard&lt;br&gt;
Redundancy: Locally Redundant Storage (LRS)&lt;br&gt;
Access Tier: Hot&lt;br&gt;
Allow Blob Public Access: Enabled (on container level)&lt;br&gt;
Explanation of each choice:&lt;/p&gt;

&lt;p&gt;Resource Group (je-mega-soft):&lt;br&gt;
A resource group is simply a logical container in Azure that holds related resources. I used this to group everything related to my project for easy management and cleanup.&lt;/p&gt;

&lt;p&gt;Storage Account Name (prodjemegastorage1):&lt;br&gt;
This must be globally unique across Azure. I used a structured name to represent a production-style storage setup.&lt;/p&gt;

&lt;p&gt;Region (Africa – South Africa North):&lt;br&gt;
I selected this region because it is geographically closer to my location, which reduces latency and improves performance when accessing resources.&lt;/p&gt;

&lt;p&gt;Primary Service (Blob Storage):&lt;br&gt;
Blob Storage is designed for storing unstructured data like images, videos, logs, and backups. It is the best choice for this type of project.&lt;/p&gt;

&lt;p&gt;Performance (Standard):&lt;br&gt;
Standard performance was chosen because this is a learning/demo project. It is cost-effective and suitable for general-purpose storage. Premium would only be needed for high-speed enterprise workloads.&lt;/p&gt;

&lt;p&gt;Redundancy (Locally Redundant Storage - LRS):&lt;br&gt;
LRS stores data in a single data center but keeps multiple copies within that facility. I chose this because it is the cheapest option and perfect for testing and learning purposes.&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%2Finvo9pynj3bcm2fk23ah.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%2Finvo9pynj3bcm2fk23ah.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Access Tier (Hot):&lt;br&gt;
The Hot tier is used for data that is accessed frequently. Since I planned to upload and access the file during testing and sharing, this was the best fit.&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%2Fdxaampdlyienp7lritnw.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%2Fdxaampdlyienp7lritnw.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public Access Enabled:&lt;br&gt;
I enabled public access at the container level because I wanted the uploaded file to be accessible via a URL without authentication.&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%2F09ooc2xjtlwa1bju3eu3.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%2F09ooc2xjtlwa1bju3eu3.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After reviewing all settings, I clicked Create and waited for 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%2Fbzmnpeal1ahvqkoj6c8o.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%2Fbzmnpeal1ahvqkoj6c8o.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;After the storage account was successfully created, I moved to the next step which is creating a container.&lt;/p&gt;

&lt;p&gt;Path:&lt;br&gt;
Storage Account → Data Storage → Containers → + Add Container&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%2F4gzu7t4q2ee7027f4unl.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%2F4gzu7t4q2ee7027f4unl.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Container configuration:&lt;br&gt;
Name: jemega-img-vid&lt;br&gt;
Public Access Level: Container (anonymous read access for containers and blobs)&lt;br&gt;
Why I used this container name:&lt;/p&gt;

&lt;p&gt;I chose jemega-img-vid because:&lt;/p&gt;

&lt;p&gt;“jemega” represents my personal/project brand name&lt;br&gt;
“img-vid” clearly indicates the container is meant for images and videos&lt;br&gt;
It is short, readable, and meaningful for future scaling&lt;br&gt;
Public Access Level explanation:&lt;/p&gt;

&lt;p&gt;Setting the access level to Container means:&lt;/p&gt;

&lt;p&gt;Files inside the container can be publicly accessed&lt;br&gt;
Anyone with the link can view blobs without authentication&lt;br&gt;
This is useful for demos, static file hosting, and learning scenarios&lt;br&gt;
About the $logs container:&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%2Fqp4sw7xu37kylm5zfp0g.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%2Fqp4sw7xu37kylm5zfp0g.png" alt=" " width="799" height="358"&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%2Fqxhg1zuzdlltdjhmb3ii.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%2Fqxhg1zuzdlltdjhmb3ii.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During setup, Azure automatically created a container called $logs.&lt;/p&gt;

&lt;p&gt;This container is used for system-generated logs such as:&lt;/p&gt;

&lt;p&gt;Storage analytics logs&lt;br&gt;
Request tracking logs&lt;br&gt;
Diagnostic monitoring data&lt;/p&gt;

&lt;p&gt;It is not meant for user files, so I did not modify or use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uploading the File to Blob Storage&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%2F8o550f0qqwk6ho6bygma.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%2F8o550f0qqwk6ho6bygma.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I uploaded a file into the container.&lt;/p&gt;

&lt;p&gt;File uploaded:&lt;br&gt;
just me.png&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;p&gt;Opened the container (jemega-img-vid)&lt;br&gt;
Clicked on Upload&lt;br&gt;
Selected the file from my local system&lt;br&gt;
Clicked Upload to store it in Azure Blob Storage&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%2F2mztiaqqh2zq3gujounx.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%2F2mztiaqqh2zq3gujounx.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once uploaded, Azure automatically generated a unique URL for the file.&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%2Fuy5qck2ho69oaqr3l9h2.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%2Fuy5qck2ho69oaqr3l9h2.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blob URL generated:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://prodjemegastorage1.blob.core.windows.net/jemega-img-vid/just%20me.png" rel="noopener noreferrer"&gt;https://prodjemegastorage1.blob.core.windows.net/jemega-img-vid/just%20me.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;This URL directly points to the file inside the container. Because public access was enabled, the file can be accessed in a browser without authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generating a Shared Access Signature (SAS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To improve security while still allowing temporary access, I generated a Shared Access Signature (SAS).&lt;/p&gt;

&lt;p&gt;What is SAS?&lt;/p&gt;

&lt;p&gt;A SAS token is a secure way to grant limited access to storage resources without exposing your account keys. It allows you to define:&lt;/p&gt;

&lt;p&gt;What can be accessed&lt;br&gt;
How long access is valid&lt;br&gt;
What permissions are allowed&lt;br&gt;
Why I used Key 1:&lt;/p&gt;

&lt;p&gt;I used Key 1 from the storage account because it is one of the primary access keys used to generate SAS tokens. These keys should be protected because they grant full control over the storage account.&lt;/p&gt;

&lt;p&gt;SAS configuration used:&lt;br&gt;
Start Time: Today at 10:30 PM&lt;br&gt;
Expiry Time: 31st of this month at 12:03 PM&lt;br&gt;
Permissions: Read (sp=r)&lt;br&gt;
Protocol: HTTPS only&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%2Frn83pekint3jg5ejxhxj.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%2Frn83pekint3jg5ejxhxj.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why SAS is important:&lt;/p&gt;

&lt;p&gt;SAS provides:&lt;/p&gt;

&lt;p&gt;Temporary access instead of permanent public exposure&lt;br&gt;
Better security control over shared files&lt;br&gt;
Ability to revoke access by changing keys or expiry&lt;br&gt;
Fine-grained permissions (read, write, delete, etc.)&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Final SAS URL (Secure Access Link)&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Here is the final link generated using SAS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://prodjemegastorage1.blob.core.windows.net/jemega-img-vid/just%20me.png?sp=r&amp;amp;st=2026-05-28T21:12:08Z&amp;amp;se=2026-05-31T11:03:08Z&amp;amp;spr=https&amp;amp;sv=2026-02-06&amp;amp;sr=b&amp;amp;sig=SseErml92AKi5t60kVuYCN8DNP%2BBkKm4CaXtHwhTqwo%3D" rel="noopener noreferrer"&gt;https://prodjemegastorage1.blob.core.windows.net/jemega-img-vid/just%20me.png?sp=r&amp;amp;st=2026-05-28T21:12:08Z&amp;amp;se=2026-05-31T11:03:08Z&amp;amp;spr=https&amp;amp;sv=2026-02-06&amp;amp;sr=b&amp;amp;sig=SseErml92AKi5t60kVuYCN8DNP%2BBkKm4CaXtHwhTqwo%3D&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This walkthrough helped me understand the basics of Azure Blob Storage, from creating a storage account and container to uploading a file and generating a SAS link for controlled access. I also learned how key settings like redundancy, access tier, and public access affect cost, performance, and security. Overall, it made cloud storage concepts clearer and gave me a solid foundation for working with Azure storage services going forward.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Created an Azure User, Gave It Global Admin Access, Revoked It, and Tested Azure IAM — Here’s What I Learned</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Fri, 22 May 2026 01:20:29 +0000</pubDate>
      <link>https://dev.to/4thman/i-created-an-azure-user-gave-it-global-admin-access-revoked-it-and-tested-azure-iam-heres-3p6p</link>
      <guid>https://dev.to/4thman/i-created-an-azure-user-gave-it-global-admin-access-revoked-it-and-tested-azure-iam-heres-3p6p</guid>
      <description>&lt;p&gt;As part of my Cloud Engineering and DevOps learning journey, I recently decided to go beyond theory and start practicing Identity and Access Management (IAM) directly inside Microsoft Azure.&lt;/p&gt;

&lt;p&gt;I wanted to understand how organizations manage users, permissions, administrative access, and security in real cloud environments. Instead of just reading about Microsoft Entra ID and RBAC, I performed a complete hands-on lab from start to finish.&lt;/p&gt;

&lt;p&gt;In this lab, I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;created a new Azure user&lt;/li&gt;
&lt;li&gt;configured Microsoft Authenticator&lt;/li&gt;
&lt;li&gt;assigned administrative roles&lt;/li&gt;
&lt;li&gt;logged into the new account using an incognito browser&lt;/li&gt;
&lt;li&gt;created another user using delegated access&lt;/li&gt;
&lt;li&gt;revoked the permissions&lt;/li&gt;
&lt;li&gt;tested whether the account could still perform administrative actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This exercise gave me a much deeper understanding of how cloud identity management works in enterprise environments.&lt;/p&gt;

&lt;p&gt;The screenshots attached throughout this post document the entire process step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting From the Default Directory
&lt;/h2&gt;

&lt;p&gt;I began by logging into the Azure Portal using my main administrator account inside the default directory.&lt;/p&gt;

&lt;p&gt;From there, I navigated to:&lt;/p&gt;

&lt;p&gt;Microsoft Entra ID → Users → All Users&lt;/p&gt;

&lt;p&gt;This section contains every identity managed inside the Azure environment, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;groups&lt;/li&gt;
&lt;li&gt;applications&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, I already had administrative privileges, which allowed me to create and manage other users.&lt;/p&gt;

&lt;p&gt;One thing I’m beginning to understand about cloud platforms is that structure and organization are extremely important. Without proper identity management, large organizations would struggle to control access securely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the “Immortel” User
&lt;/h2&gt;

&lt;p&gt;The next step was creating a new user account named “Immortel.”&lt;/p&gt;

&lt;p&gt;During the setup process, I configured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;display name&lt;/li&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;password settings&lt;/li&gt;
&lt;li&gt;account information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After creating the account successfully, the new user appeared immediately inside the Azure users list.&lt;/p&gt;

&lt;p&gt;This helped me understand how organizations onboard employees into Microsoft Entra ID environments.&lt;/p&gt;

&lt;p&gt;At this stage, the account existed but had limited permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logging Into the Immortel Account Using Incognito Mode
&lt;/h2&gt;

&lt;p&gt;Instead of signing out from my main administrator account, I opened a new incognito browser window and logged into the Immortel account separately.&lt;/p&gt;

&lt;p&gt;This allowed me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remain logged into my administrator account&lt;/li&gt;
&lt;li&gt;test the Immortel account independently&lt;/li&gt;
&lt;li&gt;simulate how multiple administrators may work simultaneously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using incognito mode was actually very useful because it helped me manage both accounts side by side without interrupting my existing Azure session.&lt;/p&gt;

&lt;p&gt;At this stage, the Immortel account still had very limited access because no elevated administrative roles had been assigned yet.&lt;/p&gt;

&lt;p&gt;This demonstrated an important cloud security principle known as:&lt;/p&gt;

&lt;p&gt;Least Privilege Access&lt;/p&gt;

&lt;p&gt;This means users should only receive the minimum permissions necessary for their tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Microsoft Authenticator (MFA)
&lt;/h2&gt;

&lt;p&gt;While logging into the Immortel account, Azure required Multi-Factor Authentication (MFA) setup using Microsoft Authenticator.&lt;/p&gt;

&lt;p&gt;This process involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scanning a QR code&lt;/li&gt;
&lt;li&gt;linking the account to the Authenticator app&lt;/li&gt;
&lt;li&gt;approving sign-in requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was one of the most practical parts of the exercise because it showed me how organizations secure user accounts beyond just passwords.&lt;/p&gt;

&lt;p&gt;I now understand why MFA is considered one of the most important security practices in cloud computing. Even if a password gets compromised, unauthorized users still cannot access the account without the additional verification step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assigning Global Administrator and Global Reader Roles
&lt;/h2&gt;

&lt;p&gt;After setting up the Immortel account successfully, I returned to my original administrator session inside the default directory and assigned two important roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global Administrator&lt;/li&gt;
&lt;li&gt;Global Reader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This introduced me to Azure Role-Based Access Control (RBAC).&lt;/p&gt;

&lt;p&gt;Before this exercise, RBAC sounded theoretical while reading documentation. But seeing it work practically made everything much clearer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Global Administrator Role
&lt;/h2&gt;

&lt;p&gt;Global Administrator is one of the highest privileged roles inside Microsoft Entra ID.&lt;/p&gt;

&lt;p&gt;A user with this role can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create and manage users&lt;/li&gt;
&lt;li&gt;assign permissions&lt;/li&gt;
&lt;li&gt;manage identity settings&lt;/li&gt;
&lt;li&gt;configure security&lt;/li&gt;
&lt;li&gt;reset passwords&lt;/li&gt;
&lt;li&gt;control administrative settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In simple terms, this role has broad control over the Azure identity environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Global Reader Role
&lt;/h2&gt;

&lt;p&gt;Global Reader works differently.&lt;/p&gt;

&lt;p&gt;Users with this role can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;view configurations&lt;/li&gt;
&lt;li&gt;monitor environments&lt;/li&gt;
&lt;li&gt;review settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;but they cannot make administrative changes.&lt;/p&gt;

&lt;p&gt;This role is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auditors&lt;/li&gt;
&lt;li&gt;compliance teams&lt;/li&gt;
&lt;li&gt;monitoring personnel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;who need visibility without modification access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logging Back Into the Immortel Session
&lt;/h2&gt;

&lt;p&gt;After assigning the roles, I refreshed and continued working inside the incognito browser session already logged into the Immortel account.&lt;/p&gt;

&lt;p&gt;The difference was immediately noticeable.&lt;/p&gt;

&lt;p&gt;The account now had elevated privileges and could access administrative capabilities that were unavailable earlier.&lt;/p&gt;

&lt;p&gt;This demonstrated how permissions in Azure are controlled dynamically through assigned roles.&lt;/p&gt;

&lt;p&gt;It also showed me how powerful RBAC is in enterprise cloud environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Another User Named “Dare”
&lt;/h2&gt;

&lt;p&gt;To confirm the permissions were working correctly, I used the Immortel account to create another user named “Dare.”&lt;/p&gt;

&lt;p&gt;The creation process was successful.&lt;/p&gt;

&lt;p&gt;This confirmed that the Global Administrator privileges assigned earlier were active and functioning properly.&lt;/p&gt;

&lt;p&gt;At this point, I fully understood how delegated administration works in Azure environments.&lt;/p&gt;

&lt;p&gt;Organizations can temporarily assign elevated permissions to specific users without permanently granting full administrative control to everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revoking the Administrative Access
&lt;/h2&gt;

&lt;p&gt;After completing the delegated administration test, I returned to my original administrator session inside the default directory.&lt;/p&gt;

&lt;p&gt;I then removed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global Administrator access&lt;/li&gt;
&lt;li&gt;Global Reader access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;from the Immortel account.&lt;/p&gt;

&lt;p&gt;This part of the exercise taught me another important IAM concept:&lt;/p&gt;

&lt;p&gt;Permissions can be granted and revoked at any time.&lt;/p&gt;

&lt;p&gt;This is critical in real-world environments for situations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;employee resignation&lt;/li&gt;
&lt;li&gt;temporary contractors&lt;/li&gt;
&lt;li&gt;security incidents&lt;/li&gt;
&lt;li&gt;role changes&lt;/li&gt;
&lt;li&gt;access reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing the Revoked Account
&lt;/h2&gt;

&lt;p&gt;To confirm the permissions were truly removed, I returned to the incognito browser session using the Immortel account and attempted to create another user named “John.”&lt;/p&gt;

&lt;p&gt;This time, the operation failed.&lt;/p&gt;

&lt;p&gt;The account no longer had sufficient privileges to perform administrative tasks.&lt;/p&gt;

&lt;p&gt;This final test clearly demonstrated how Azure immediately enforces permission changes once access is revoked.&lt;/p&gt;

&lt;p&gt;It was satisfying seeing the entire IAM workflow function exactly as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Lab Taught Me
&lt;/h2&gt;

&lt;p&gt;This hands-on exercise helped me better understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID&lt;/li&gt;
&lt;li&gt;Identity and Access Management (IAM)&lt;/li&gt;
&lt;li&gt;RBAC&lt;/li&gt;
&lt;li&gt;Multi-Factor Authentication (MFA)&lt;/li&gt;
&lt;li&gt;delegated administration&lt;/li&gt;
&lt;li&gt;access control&lt;/li&gt;
&lt;li&gt;permission revocation&lt;/li&gt;
&lt;li&gt;cloud security principles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, it helped me realize that identity management is one of the most critical aspects of cloud security.&lt;/p&gt;

&lt;p&gt;Without proper IAM controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unauthorized access becomes easier&lt;/li&gt;
&lt;li&gt;security risks increase&lt;/li&gt;
&lt;li&gt;governance becomes difficult&lt;/li&gt;
&lt;li&gt;compliance becomes harder to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This was one of the most valuable Azure labs I’ve completed so far because it moved beyond theory into practical identity administration and security management.&lt;/p&gt;

&lt;p&gt;As I continue learning Cloud Engineering and DevOps, I’m beginning to appreciate how important hands-on practice is. Reading documentation is useful, but actually performing these tasks inside a real cloud environment creates a completely different level of understanding.&lt;/p&gt;

&lt;p&gt;I still have a long way to go, but each lab continues to build my confidence and understanding step by step.&lt;/p&gt;

&lt;p&gt;I’ll continue documenting my learning journey, projects, and hands-on experiences as I grow in cloud engineering and DevOps.&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%2F0354s6du370j94aoqq4s.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%2F0354s6du370j94aoqq4s.png" alt=" " width="799" height="351"&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%2Fogrogpzpm4vuwzixs3hz.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%2Fogrogpzpm4vuwzixs3hz.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrfncpv26biyw0vp1few.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%2Flrfncpv26biyw0vp1few.png" alt=" " width="799" height="357"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ndaikyji8ld9q76wxft.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%2F9ndaikyji8ld9q76wxft.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hnd362cy3vm6s2x7wr5.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%2F4hnd362cy3vm6s2x7wr5.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9bqdtau01aj3jzmto0k.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%2Fq9bqdtau01aj3jzmto0k.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11pkpka72ndmootlvwwr.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%2F11pkpka72ndmootlvwwr.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fel7d0f14cxfxlnwr3ltn.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%2Fel7d0f14cxfxlnwr3ltn.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fksf7g86ihc5kem0naf66.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%2Fksf7g86ihc5kem0naf66.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb09cl7owdix7held8aiy.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%2Fb09cl7owdix7held8aiy.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgib11lmqo3cz2hcpah8.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%2Fdgib11lmqo3cz2hcpah8.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hwhawzv5cwlncarztmm.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%2F0hwhawzv5cwlncarztmm.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmueal9dsoammha3qa0xw.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%2Fmueal9dsoammha3qa0xw.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau4711jka113w07wjqlq.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%2Fau4711jka113w07wjqlq.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbn63efxx93vrq56tnlz.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%2Fvbn63efxx93vrq56tnlz.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9h67wtwax86s3vo0c4g.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%2Fz9h67wtwax86s3vo0c4g.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnklk2zh86z4040r4s1kt.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%2Fnklk2zh86z4040r4s1kt.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Thu, 14 May 2026 20:23:27 +0000</pubDate>
      <link>https://dev.to/4thman/-2cg4</link>
      <guid>https://dev.to/4thman/-2cg4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj" class="crayons-story__hidden-navigation-link"&gt;Creating My First Azure Resource Group as I Begin My Journey Into Cloud Engineering and DevOps&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/4thman" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927892%2F43aac6d7-df74-4a90-bdbe-8ba55edf1a70.jpeg" alt="4thman profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/4thman" class="crayons-story__secondary fw-medium m:hidden"&gt;
              David Cletus
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                David Cletus
                
              
              &lt;div id="story-author-preview-content-3671755" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/4thman" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927892%2F43aac6d7-df74-4a90-bdbe-8ba55edf1a70.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;David Cletus&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj" id="article-link-3671755"&gt;
          Creating My First Azure Resource Group as I Begin My Journey Into Cloud Engineering and DevOps
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/azure"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;azure&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Creating My First Azure Resource Group as I Begin My Journey Into Cloud Engineering and DevOps</title>
      <dc:creator>David Cletus</dc:creator>
      <pubDate>Thu, 14 May 2026 20:18:29 +0000</pubDate>
      <link>https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj</link>
      <guid>https://dev.to/4thman/creating-my-first-azure-resource-group-as-i-begin-my-journey-into-cloud-engineering-and-devops-1cjj</guid>
      <description>&lt;p&gt;Today I took another practical step in my Cloud Engineering and DevOps learning journey by creating my first Resource Group on Microsoft Azure.&lt;/p&gt;

&lt;p&gt;As someone currently learning cloud computing and DevOps from scratch, this may seem like a small task, but it actually helped me understand how cloud infrastructure is organized in real-world environments.&lt;/p&gt;

&lt;p&gt;In the screenshot above, I was working inside the Azure Portal while creating a Resource Group called “Hagital-Resource-Group” and selecting the “South Africa North” region.&lt;/p&gt;

&lt;p&gt;This simple setup exposed me to important cloud concepts such as subscriptions, regions, resource organization, and infrastructure management.&lt;/p&gt;

&lt;p&gt;What is a Resource Group?&lt;/p&gt;

&lt;p&gt;A Resource Group in Azure acts like a container that holds related cloud resources together.&lt;/p&gt;

&lt;p&gt;For example, a company can keep:&lt;/p&gt;

&lt;p&gt;virtual machines&lt;br&gt;
databases&lt;br&gt;
storage accounts&lt;br&gt;
applications&lt;br&gt;
virtual networks&lt;/p&gt;

&lt;p&gt;inside one Resource Group instead of managing them separately.&lt;/p&gt;

&lt;p&gt;This makes resources easier to organize, monitor, secure, and manage.&lt;/p&gt;

&lt;p&gt;A simple way to think about it is like creating a folder on your computer for a particular project where all related files are stored together.&lt;/p&gt;

&lt;p&gt;What I Learned During This Setup&lt;/p&gt;

&lt;p&gt;While creating this Resource Group, I learned a few important things about how cloud platforms work.&lt;/p&gt;

&lt;p&gt;Subscriptions&lt;/p&gt;

&lt;p&gt;Azure uses subscriptions to manage billing and cloud services. Every resource created inside Azure belongs to a subscription.&lt;/p&gt;

&lt;p&gt;Regions&lt;/p&gt;

&lt;p&gt;Cloud providers do not keep all their infrastructure in one location. They build data centers across different countries and locations around the world called regions.&lt;/p&gt;

&lt;p&gt;I selected the “South Africa North” region because it is geographically closer to Africa and can help improve performance and reduce latency for users in this region.&lt;/p&gt;

&lt;p&gt;Resource Organization&lt;/p&gt;

&lt;p&gt;I also learned how organizations group cloud resources based on projects, departments, or applications. This becomes very important in large environments where thousands of resources may exist.&lt;/p&gt;

&lt;p&gt;Why I Started Learning Cloud Engineering and DevOps&lt;/p&gt;

&lt;p&gt;Technology is moving heavily toward cloud infrastructure and automation. Many organizations now rely on cloud providers like Microsoft Azure, AWS, and Google Cloud to run their systems and applications.&lt;/p&gt;

&lt;p&gt;I decided to start learning cloud engineering and DevOps because I want to understand modern infrastructure, automation, and how scalable systems are built and managed.&lt;/p&gt;

&lt;p&gt;Right now, I’m learning:&lt;/p&gt;

&lt;p&gt;cloud fundamentals&lt;br&gt;
Microsoft Azure&lt;br&gt;
Linux&lt;br&gt;
networking&lt;br&gt;
DevOps concepts&lt;br&gt;
virtual machines&lt;br&gt;
resource management&lt;/p&gt;

&lt;p&gt;I also plan to learn tools like Docker, Git, Kubernetes, Terraform, and CI/CD pipelines as I continue growing in this field.&lt;/p&gt;

&lt;p&gt;What I Learned Today&lt;/p&gt;

&lt;p&gt;Some of the key things I learned from this exercise include:&lt;/p&gt;

&lt;p&gt;how Azure Resource Groups work&lt;br&gt;
how subscriptions are used in Azure&lt;br&gt;
the importance of regions in cloud computing&lt;br&gt;
how cloud infrastructure is organized globally&lt;br&gt;
the value of hands-on practice while learning technology&lt;br&gt;
Final Thoughts&lt;/p&gt;

&lt;p&gt;This is still the beginning of my journey, but I’ve realized that small practical steps are important when learning cloud technologies.&lt;/p&gt;

&lt;p&gt;I plan to continue documenting my progress, sharing what I learn, and building projects along the way.&lt;/p&gt;

&lt;p&gt;There is still a lot to learn, but I’m excited about the process and looking forward to improving consistently over time.&lt;/p&gt;

&lt;h1&gt;
  
  
  cloudcomputing #azure #devops #cloudengineering #learninginpublic
&lt;/h1&gt;

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