<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Francis Adeboye</title>
    <description>The latest articles on Forem by Francis Adeboye (@boye88).</description>
    <link>https://forem.com/boye88</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3404114%2F0782e4b2-c381-40a2-9a16-cc79456155a6.jpeg</url>
      <title>Forem: Francis Adeboye</title>
      <link>https://forem.com/boye88</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/boye88"/>
    <language>en</language>
    <item>
      <title>Automating Hub &amp; Spoke Secure Azure Networks with Terraform (IaC) &amp; Azure Firewalls</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Fri, 12 Sep 2025 20:37:33 +0000</pubDate>
      <link>https://forem.com/boye88/automating-hub-spoke-secure-azure-networks-with-terraform-iac-azure-firewalls-54l3</link>
      <guid>https://forem.com/boye88/automating-hub-spoke-secure-azure-networks-with-terraform-iac-azure-firewalls-54l3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Imagine your business’s digital assets—all your &lt;strong&gt;customer data, company secrets, and applications&lt;/strong&gt;—are stored inside a high-value property. Without security guards or locks on the doors, this property is an open invitation for &lt;strong&gt;burglars (Vulnerabilities)&lt;/strong&gt;. In the same way, an insecure cloud network is a prime target for cyber threats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud network security&lt;/strong&gt; provides those essential guards and locks &lt;strong&gt;(Virtual Network, Security Groups, Firewalls &amp;amp; Encryption)&lt;/strong&gt;, protecting your most valuable digital assets from a growing number of attackers.&lt;/p&gt;

&lt;p&gt;However, managing security in a vast and constantly changing cloud environment is nearly impossible to do manually. This is where automation becomes your most critical tool. By &lt;strong&gt;integrating smart, automated systems&lt;/strong&gt;, you can ensure every door is locked and every alarm is active, making your &lt;strong&gt;digital property secure and resilient&lt;/strong&gt; in real time.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  Hub-Spoke Network Concept
&lt;/h3&gt;

&lt;p&gt;Your network uses a Hub-Spoke model, which is a highly effective way to manage a cloud network. The Hub is your central security and connectivity point, where an Azure Firewall inspects all traffic. The Spokes are isolated networks that host your applications. This design provides centralized security, simplifies routing, and makes your network easy to scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hub VNet&lt;/strong&gt;: This is where the Azure Firewall is deployed. It's the central checkpoint for all traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App (Spoke) VNet&lt;/strong&gt;: This is where your applications are deployed. The frontend is secured using an Application Security Group (ASG), while the backend uses a Network Security Group (NSG) for granular control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DNS&lt;/strong&gt;: A Private DNS Zone is used to resolve internal names, ensuring your applications can communicate with each other securely using private records.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route Tables&lt;/strong&gt;: These are configured with User-Defined Routes (UDRs) to force all traffic from the spokes to pass through the hub's firewall.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Traffic Flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inbound Traffic&lt;/strong&gt;: Traffic from the internet goes directly to the Hub Firewall, which then forwards it to the correct application in the spoke VNet. The ASG on the frontend ensures only allowed traffic reaches the web servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Outbound Traffic&lt;/strong&gt;: Traffic from an application in the spoke VNet is sent to the Hub Firewall for inspection before it can reach the internet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DNS Flow&lt;/strong&gt;: DNS queries are handled internally via the Private DNS Zone, with the hub firewall forwarding the requests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploying Infrastructure as Code (IaC) with Terraform
&lt;/h2&gt;

&lt;p&gt;Terraform is an essential tool for implementing this architecture because it allows an organization to define its entire &lt;strong&gt;infrastructure as code (IaC)&lt;/strong&gt;. This approach offers several key benefits: it ensures &lt;strong&gt;repeatable, immutable &amp;amp; consistent deployments, makes infrastructure version-controlled (just like application code)&lt;/strong&gt; to track changes, and enables fully automated deployments.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Azure Account &amp;amp; Azure Subscription&lt;/li&gt;
&lt;li&gt;Azure CLI&lt;/li&gt;
&lt;li&gt;App Role that allows Terraform Deployment&lt;/li&gt;
&lt;li&gt;Terraform Installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/developer/terraform/configure-vs-code-extension-for-terraform?tabs=azure-cli" rel="noopener noreferrer"&gt;Azure Terraform Visual Studio code extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remote Backend (&lt;a href="https://developer.hashicorp.com/terraform/tutorials/cloud-get-started/cloud-sign-up" rel="noopener noreferrer"&gt;Hashicorp Cloud with CLI workflow&lt;/a&gt; or &lt;a href="https://learn.microsoft.com/en-us/azure/developer/terraform/store-state-in-azure-storage?tabs=azure-cli" rel="noopener noreferrer"&gt;Azure Storage Account&lt;/a&gt;): For this lab, I'll be using a HashiCorp Terraform Cloud account. This approach provides a managed, secure, and collaborative environment for storing the Terraform state file, which is often easier to set up and manage than a self-hosted Azure Storage Account for state management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make the code flexible, it is best to use variables for key settings like &lt;strong&gt;IP ranges, location, and resource group names&lt;/strong&gt;. This makes it easy to deploy the same architecture in different environments (e.g., development, staging, production) with a single command.&lt;/p&gt;

&lt;p&gt;A crucial best practice is to use &lt;strong&gt;remote state management.&lt;/strong&gt; By storing the Terraform state file in a remote backend &lt;strong&gt;(like HashiCorp Terraform Cloud or an Azure Storage Account)&lt;/strong&gt;, it &lt;strong&gt;prevents state conflicts&lt;/strong&gt;, &lt;strong&gt;enables collaboration among team members&lt;/strong&gt;, and &lt;strong&gt;ensures the state is backed up and secure&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform File Structure
&lt;/h3&gt;

&lt;p&gt;Terraform project directory for this architecture would be organized &amp;amp; created as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main.tf&lt;/code&gt;: This core file would declare the &lt;code&gt;azurerm&lt;/code&gt; provider and the Terraform remote backend configuration for state management. This ensures state is stored securely and enables team collaboration.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#############################################
# Provider &amp;amp; HCP Remote Backend Configuration
#############################################

terraform {
  cloud {
    organization = "your-organization-name"
    workspaces {
      name = "secure-network-workload"
    }
  }
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~&amp;gt;4.0"
    }

    random = {
      source  = "hashicorp/random"
      version = "~&amp;gt;3.0"
    }
  }
}

provider "azurerm" {
  features {
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deployments.tf&lt;/code&gt;: This is the primary file that holds all resources blocks for the deployment. This is where resource group, virtual networks, subnets, firewalls, security groups, virtual machines and other network components would be declared.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###################################
# Azure Resources for Deployment
###################################

resource "azurerm_resource_group" "resource_group" {
  name     = "${var.project_name}-${var.prefix}-RG"
  location = var.location
  tags     = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;variables.tf&lt;/code&gt;: This file contains all the input variables for the configuration. This allows for easy customization without changing the main code.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#####################################
# Variables for Deployment
#####################################
variable "prefix" {
  type    = string
}

variable "project_name" {
  type = string
}

variable "owner_name" {
  type = string

}

variable "managed_by" {
  type = string

}

variable "environment" {
  type = string
}

variable "location" {
  type = string
}
variable "tags" {
  type    = map(string)
  default = {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;outputs.tf&lt;/code&gt;: This file specifies the values that will be outputted after a successful deployment, such as the public/private IPs of the firewall or the IDs of the created subnets.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#####################################
# Deployment Outputs
#####################################
output "resource_group_name" {
  description = "Resource Group Name"
  value       = azurerm_resource_group.resource_group.name
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;terraform.tfvars&lt;/code&gt;: This file holds the actual values for the variables declared in variables.tf.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;####################################################################
# Terraform variables for Network Secure Workload Project Deployment
####################################################################

location     = "UK South"
project_name = "Hub-Spoke-Network"
environment  = "Development"
owner_name   = "Francis Adeboye"
managed_by   = "Terraform"
prefix      = "nsw-dev"

tags = {
  Owner       = "Francis Adeboye"
  Project     = "Hub-Spoke-Network"
  Contact     = "your-email-address"
  Environment = "Development"
  ManagedBy   = "Terraform"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Deployment Flow (Hands-on Lab)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Initializing Terraform&lt;/strong&gt; - Before deploying any infrastructure, the first step is to initialize the Terraform project. This is done with the &lt;code&gt;terraform init&lt;/code&gt; command. Other commands will be used subsequently during this hands-on where applicable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/strong&gt;: This command initializes the working directory, downloads the necessary provider plugins, and sets up the remote backend for state management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform fmt&lt;/code&gt;&lt;/strong&gt;: This command formats the configuration files to ensure consistent style and readability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform validate&lt;/code&gt;&lt;/strong&gt;: This command validates the syntax of the configuration, checking for errors before deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/strong&gt;: This command creates an execution plan, showing what resources will be created, modified, or destroyed, and is a crucial step for reviewing changes before deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/strong&gt;: This command applies the changes defined in the plan to the cloud provider, creating the infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/strong&gt;: This command destroys all the resources managed by the configuration, used for cleaning up the environment.&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%2Ff49gnxwqro7h7st11896.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff49gnxwqro7h7st11896.png" alt="init,fmt,validate" width="800" height="470"&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%2Ftz20gugryezi15povs0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz20gugryezi15povs0g.png" alt="plan&amp;amp;apply" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create and configure virtual networks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Resource Group&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###################################
# Azure Resource Group
###################################

resource "azurerm_resource_group" "resource_group" {
  name     = "${var.project_name}-${var.prefix}-RG"
  location = var.location
  tags     = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fig65pe07d2xxle59qvss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fig65pe07d2xxle59qvss.png" alt="planapprove" width="800" height="476"&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%2F9rjkuy6z5l6jsq3p8eln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rjkuy6z5l6jsq3p8eln.png" alt="resource_group" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Spoke (App)&lt;/strong&gt; virtual network with Subnets &lt;strong&gt;(Front &amp;amp; Back End)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###################################
# Resource Group Data Source
###################################

data "azurerm_resource_group" "resource_group" {
  name     = "${var.project_name}-${var.prefix}-RG"
}


###################################
# Spoke App Virtual Network
###################################
resource "azurerm_virtual_network" "spoke_app_vnet" {
  name                = var.spoke_app_vnet_name
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  address_space       = var.spoke_app_address_space

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}

# Subnets for Spoke App VNet
resource "azurerm_subnet" "front_end_app_subnet" {
  name                 = "front-end-app-subnet"
  resource_group_name  = data.azurerm_resource_group.resource_group.name
  virtual_network_name = azurerm_virtual_network.spoke_app_vnet.name
  address_prefixes     = [var.front-end-app]
}

resource "azurerm_subnet" "back_end_app_subnet" {
  name                 = "back-end-app-subnet"
  resource_group_name  = data.azurerm_resource_group.resource_group.name
  virtual_network_name = azurerm_virtual_network.spoke_app_vnet.name
  address_prefixes     = [var.back-end-app]
}

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

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Hub&lt;/strong&gt; Virtual network with Subnet &lt;strong&gt;(Azure Firewall)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###################################
# Hub Vnet for Azure Firewall
###################################
resource "azurerm_virtual_network" "hub_vnet" {
  name                = var.hub_vnet_name
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  address_space       = var.hub_address_space

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}

# Subnet for Azure Firewall

resource "azurerm_subnet" "firewall_subnet" {
  name                 = "AzureFirewallSubnet"
  resource_group_name = data.azurerm_resource_group.resource_group.name
  virtual_network_name = azurerm_virtual_network.hub_vnet.name
  address_prefixes     = [var.firewall-subnet]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprbtzxybvjznrivtss3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprbtzxybvjznrivtss3e.png" alt="hubfirewall" width="800" height="278"&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%2Fc7yx6xbi3pjc5ji0iwk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7yx6xbi3pjc5ji0iwk3.png" alt="Hub-Vnet" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure &lt;strong&gt;Vnet peering&lt;/strong&gt; between Hub &amp;amp; Spoke Virtual Network
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;####################################
# Vnet Peering between Hub and Spoke
####################################

resource "azurerm_virtual_network_peering" "spoke_to_hub" {
  name                      = "spoke-to-hub-vnet"
  resource_group_name       = data.azurerm_resource_group.resource_group.name
  virtual_network_name      = azurerm_virtual_network.spoke_app_vnet.name
  remote_virtual_network_id = azurerm_virtual_network.hub_vnet.id
  allow_virtual_network_access = "true"
}

resource "azurerm_virtual_network_peering" "hub_to_spoke" {
  name                      = "hub-to-spoke-vnet"
  resource_group_name       = data.azurerm_resource_group.resource_group.name
  virtual_network_name      = azurerm_virtual_network.hub_vnet.name
  remote_virtual_network_id = azurerm_virtual_network.spoke_app_vnet.id
  allow_virtual_network_access = "true"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66x4wadnfgno5hpnmwpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66x4wadnfgno5hpnmwpy.png" alt="Hub-Spoke" width="800" height="329"&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%2F3x45llvyc2sk94o2o7fu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x45llvyc2sk94o2o7fu.png" alt="Spoke-Hub" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create and configure Virtual Machines &amp;amp; network security groups (ASG &amp;amp; NSG)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;2 Virtual Machines&lt;/strong&gt; (Linux Ubuntu Server)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
#################################################################################
# Virtual Machine Deployment
#################################################################################
# Public IP Addresses
resource "azurerm_public_ip" "vm1_public_ip" {
  name                = "VM1-ip"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  allocation_method   = "Static"
  sku                = "Standard"
}

resource "azurerm_public_ip" "vm2_public_ip" {
  name                = "VM2-ip" 
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  allocation_method   = "Static"
  sku                = "Standard"
}

# Network Interfaces
resource "azurerm_network_interface" "vm1_nic" {
  name                = "VM1-nic"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name

  ip_configuration {
    name                          = "ipconfig1"
    subnet_id                     = azurerm_subnet.front_end_app_subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id         = azurerm_public_ip.vm1_public_ip.id
  }
}

resource "azurerm_network_interface" "vm2_nic" {
  name                = "VM2-nic"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name

  ip_configuration {
    name                          = "ipconfig2"
    subnet_id                     = azurerm_subnet.back_end_app_subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id         = azurerm_public_ip.vm2_public_ip.id
  }
}

# Virtual Machines
resource "azurerm_linux_virtual_machine" "vm1" {
  name                = "VM1"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  size                = "Standard_B1s"
  admin_username      = var.admin_username
  admin_password      = var.admin_password
  network_interface_ids = [
    azurerm_network_interface.vm1_nic.id
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
    disk_size_gb        = 30
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  disable_password_authentication = false
}

resource "azurerm_linux_virtual_machine" "vm2" {
  name                = "VM2"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  size                = "Standard_B1s"
  admin_username      = var.admin_username
  admin_password      = var.admin_password
  network_interface_ids = [
    azurerm_network_interface.vm2_nic.id
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
    disk_size_gb        = 30
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  disable_password_authentication = false
}

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

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Application Security Group (ASG)&lt;/strong&gt; &amp;amp; Attach to VM-1 (NIC)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###########################################################
# Application Security Group (front-end) attached to VM1 NIC
###########################################################
resource "azurerm_application_security_group" "app_front_end_asg" {
  name                = "app-front-end-asg"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}

# Attach ASG to VM1 NIC

resource "azurerm_network_interface_application_security_group_association" "vm1_nic_asg_assoc" {
  network_interface_id          = azurerm_network_interface.vm1_nic.id
  application_security_group_id = azurerm_application_security_group.app_front_end_asg.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Network Security Group (NSG)&lt;/strong&gt; &amp;amp; Associate with Backend Subnet
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###########################################################
# Network Security Group (back-end) attached to back-end subnet
###########################################################
resource "azurerm_network_security_group" "back_end_nsg" {
  name                = "app-back-end-nsg"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}
# Attach NSG to back-end subnet
resource "azurerm_subnet_network_security_group_association" "back_end_subnet_nsg_assoc" {
  subnet_id                 = azurerm_subnet.back_end_app_subnet.id
  network_security_group_id = azurerm_network_security_group.back_end_nsg.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Network Security Group&lt;/strong&gt; inbound rules filter traffic to ASG on Port 22 (ASG)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#####################################################################################################################
# NSG Rule to filter inbound/outbound traffic from anywhere on port 22 (SSH) to Application Security Group (front-end)
#####################################################################################################################
resource "azurerm_network_security_rule" "allow_ssh_inbound" {
  name                                       = "Allow-ssh-Inbound"
  priority                                   = 100
  direction                                  = "Inbound"
  access                                     = "Allow"
  protocol                                   = "Tcp"
  source_port_range                          = "*"
  source_address_prefix                      = "*"
  destination_port_range                     = "22"
  destination_application_security_group_ids = [azurerm_application_security_group.app_front_end_asg.id]
  resource_group_name                        = azurerm_resource_group.resource_group.name
  network_security_group_name                = azurerm_network_security_group.back_end_nsg.name
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Create and configure Azure Firewall
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create Azure Firewall Subnet in Spoke (App) Vnet
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###########################################################
# Azure Firewall Subnet (Spoke Vnet)
###########################################################
resource "azurerm_subnet" "spoke_firewall_subnet" {
  name                 = "AzureFirewallSubnet"
  resource_group_name  = azurerm_resource_group.resource_group.name
  virtual_network_name = azurerm_virtual_network.spoke_app_vnet.name
  address_prefixes     = [var.spoke-firewall-subnet]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Configure Azure Firewall &amp;amp; firewall policy
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;######################################################################
# Standard Firewall (Spoke App Vnet), with Firewall Policy &amp;amp; Public IP
######################################################################
resource "azurerm_public_ip" "firewall_public_ip" {
  name                = "firewall-public-ip"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  allocation_method   = "Static"
  sku                 = "Standard"

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}

resource "azurerm_firewall_policy" "firewall_policy" {
  name                = "firewall-policy"
  resource_group_name = azurerm_resource_group.resource_group.name
  location            = var.location
  sku                 = "Standard"

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}

resource "azurerm_firewall" "app_firewall" {
  name                = "firewall"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  sku_tier            = "Standard"
  sku_name            = "AZFW_VNet"
  firewall_policy_id  = azurerm_firewall_policy.firewall_policy.id

  ip_configuration {
    name                 = "firewall-ip-config"
    subnet_id            = azurerm_subnet.spoke_firewall_subnet.id
    public_ip_address_id = azurerm_public_ip.firewall_public_ip.id
  }

  tags = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Update firewall policy Collection group with application &amp;amp; network rule collection
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###########################################################
# Update Firewall Policy with Collection Group (App &amp;amp; Network Rules)
###########################################################

resource "azurerm_firewall_policy_rule_collection_group" "firewall_policy_rule_collection_group" {
  name               = "fw-policy-rule-collection-group"
  firewall_policy_id = azurerm_firewall_policy.firewall_policy.id
  priority           = 200

  application_rule_collection {
    name     = "app-vnet-fw-rule-collection"
    priority = 200
    action   = "Allow"
    rule {
      name              = "AllowAzurePipelines"
      source_addresses  = ["10.20.0.0/23"]
      destination_fqdns = ["dev.azure.com", "azure.microsoft.com"]

      protocols {
        type = "Https"
        port = 443
      }
    }
  }

  network_rule_collection {
    name     = "app-vnet-fw-nrc-dns"
    priority = 300
    action   = "Allow"
    rule {
      name                  = "AllowDns"
      protocols             = ["UDP"]
      source_addresses      = ["10.20.0.0/23"]
      destination_ports     = ["53"]
      destination_addresses = ["1.1.1.1", "1.0.0.1"]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Configure network routing to Spoke (App) Vnet Firewall
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create and configure a route table.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#####################################
# Spoke Vnet Firewall Route Table
#####################################
resource "azurerm_route_table" "spoke_firewall_route_table" {
  name                = "spoke-vnet-firewall-rt"
  location            = var.location
  resource_group_name = azurerm_resource_group.resource_group.name
  tags                = coalesce(var.tags, { Project = var.project_name, Environment = var.environment, Owner = var.owner_name, ManagedBy = var.managed_by })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Associate Route Table to Front End &amp;amp; Back End Subnet
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##################################################################
# Associate Route Table to Spoke App Subnets (front-end &amp;amp; back-end)
##################################################################
resource "azurerm_subnet_route_table_association" "front_end_app_subnet" {
  subnet_id      = azurerm_subnet.front_end_app_subnet.id
  route_table_id = azurerm_route_table.spoke_firewall_route_table.id
}

resource "azurerm_subnet_route_table_association" "back_end_app_subnet" {
  subnet_id      = azurerm_subnet.back_end_app_subnet.id
  route_table_id = azurerm_route_table.spoke_firewall_route_table.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create Route to Route Outbound traffic via Network Virtual Appliance (NVA) Firewall private IP address
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##################################################################
# Routes Outgoing Traffic via NVA Firewall using Firewall Private IP
##################################################################
resource "azurerm_route" "outbound_firewall_route" {
  name                   = "outbound-firewall-route"
  route_table_name       = azurerm_route_table.spoke_firewall_route_table.name
  resource_group_name    = azurerm_resource_group.resource_group.name
  address_prefix         = "0.0.0.0/0"
  next_hop_type          = "VirtualAppliance"
  next_hop_in_ip_address = azurerm_firewall.app_firewall.ip_configuration[0].private_ip_address
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Create DNS zones and configure DNS settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create and configure a private DNS zone.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###################################################
# Private DNS Zone private.contoso.com
###################################################
resource "azurerm_private_dns_zone" "private_dns_zone" {
  name                = "private.contoso.com"
  resource_group_name = azurerm_resource_group.resource_group.name
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Configure Virtual Network Link for Private DNS zone
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##############################################
# Private DNS Zone Vnet Link to Spoke App Vnet
###############################################
resource "azurerm_private_dns_zone_virtual_network_link" "dns_zone_vnet_link" {
  name                  = "dns-zone-vnet-link"
  resource_group_name   = azurerm_resource_group.resource_group.name
  private_dns_zone_name = azurerm_private_dns_zone.private_dns_zone.name
  virtual_network_id    = azurerm_virtual_network.spoke_app_vnet.id
  registration_enabled  = true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Create and configure DNS (A)records mapping backend (VM2)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##########################################################
# Private DNS A Record for Backend VM in Private DNS Zone
##########################################################
resource "azurerm_private_dns_a_record" "backend_vm_dns_record" {
  name                = "backend-vm"
  zone_name           = azurerm_private_dns_zone.private_dns_zone.name
  resource_group_name = azurerm_resource_group.resource_group.name
  ttl                 = 1
  records             = [azurerm_network_interface.vm2_nic.private_ip_address]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Cleaning up resources
&lt;/h3&gt;

&lt;p&gt;When you’re done testing and validating the deployment, it’s a good practice to tear down all the infrastructure you created. This avoids unnecessary costs and keeps your Azure subscription tidy.&lt;/p&gt;

&lt;p&gt;With Terraform, cleanup is simple. Just run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform destroy --auto-approve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Destroys all resources defined in your Terraform state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uses &lt;code&gt;--auto-approve&lt;/code&gt; to skip the interactive confirmation step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensures your Azure subscription is returned to a clean state.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s an example of Terraform tearing down the resources in my remote backend workspace:&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%2Fm74ks66mx0bbegk7yw0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm74ks66mx0bbegk7yw0b.png" alt="terraform workspace" width="800" height="436"&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%2F4pjyokmisu03m9rdgaao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pjyokmisu03m9rdgaao.png" alt="terraform-destroy" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs" rel="noopener noreferrer"&gt;Terraform AzureRM Provider Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/adeboyefrancis/a46b1ad08871bca7483240c45c819bfc" rel="noopener noreferrer"&gt;Terraform Deployment Files&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Using &lt;strong&gt;Terraform and Infrastructure as Code&lt;/strong&gt;, we've built a &lt;strong&gt;secure hub-and-spoke network in Azure that’s automated, consistent, and easy to scale&lt;/strong&gt;. This setup helps &lt;strong&gt;reduce manual errors and makes it simple to manage environments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One key lesson: it’s important to carefully choose where firewalls sit — whether centralized or in each spoke — and to set up DNS correctly to avoid routing issues. With smart design choices, you can create cloud networks that are both secure and flexible, ready to grow with your needs.&lt;/p&gt;

</description>
      <category>azurefirewall</category>
      <category>terraform</category>
      <category>network</category>
      <category>security</category>
    </item>
    <item>
      <title>🌍 The Dark Side of Connectivity in a Digital Age</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Sun, 31 Aug 2025 13:31:31 +0000</pubDate>
      <link>https://forem.com/boye88/the-dark-side-of-connectivity-in-a-digital-age-gje</link>
      <guid>https://forem.com/boye88/the-dark-side-of-connectivity-in-a-digital-age-gje</guid>
      <description>&lt;p&gt;The world is evolving at an unprecedented pace, driven by large-scale digital innovation. Our daily lives have become deeply digitalized—from sending emails to friends and family across the globe, to engaging in social interactions, making seamless financial transactions via mobile devices, shopping online, and even dating through digital platforms. All of these activities rely on the internet and human participation. &lt;/p&gt;

&lt;p&gt;While the internet offers a vast stage for connection and convenience, it also presents significant risks. You cannot control what others do online, but you &lt;strong&gt;can&lt;/strong&gt; take proactive steps to protect yourself from malicious actors. These threats include identity theft, malware, financial crimes, blackmail, and child exploitation. Importantly, some of these acts are not just criminal—they may also stem from compulsive or addictive behaviours, such as internet addiction, pornography dependency, or obsessive hacking.&lt;/p&gt;

&lt;p&gt;Understanding this behavioural dimension is key to prevention and rehabilitation. Security matters across every industry—from banking and healthcare to digital platforms—because it protects what we value most: our assets, our privacy, and our trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Common Digital Threats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stolen Identity&lt;/strong&gt;: Personal data can be hijacked and misused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malware Attacks&lt;/strong&gt;: Harmful software can compromise your devices and privacy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial Crimes&lt;/strong&gt;: Online scams, phishing, and fraud are increasingly sophisticated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blackmail &amp;amp; Exploitation&lt;/strong&gt;: Sensitive information can be weaponized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Child Pornography&lt;/strong&gt;: A deeply disturbing crime that requires global vigilance and zero tolerance.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Behavioural Addictions&lt;/strong&gt;: Some malicious acts may be driven by compulsive online behaviours, such as: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pornography addiction&lt;/li&gt;
&lt;li&gt;Cyberstalking or voyeurism&lt;/li&gt;
&lt;li&gt;Obsessive hacking or digital gambling&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  💥 Consequences of Digital Vulnerability
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Financial Losses&lt;/strong&gt;: From drained bank accounts to stolen assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Damaged Reputation&lt;/strong&gt;: Leaked data or false information can tarnish your public image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotional Distress&lt;/strong&gt;: Anxiety, fear, and shame can take a heavy toll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mental Health Crisis&lt;/strong&gt;: In extreme cases, emotional trauma may lead to breakdowns or suicidal thoughts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erosion of Trust&lt;/strong&gt;: When digital systems fail, public confidence in institutions and platforms suffers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛡️ Navigating the Digital World Safely
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;You can’t control what others do online—but you &lt;em&gt;can&lt;/em&gt; protect yourself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;strong, unique passwords&lt;/strong&gt; and enable &lt;strong&gt;two-factor authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep your &lt;strong&gt;software and devices updated&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Be cautious with &lt;strong&gt;unknown links, downloads, and contacts&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;reputable antivirus and privacy tools&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Stay informed about &lt;strong&gt;digital safety and emerging threats&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Recognize signs of &lt;strong&gt;compulsive digital behaviour&lt;/strong&gt;—in yourself and others—and seek support when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔁Trust Builds Organizations - Zero Trust Builds Digital Security
&lt;/h2&gt;

&lt;p&gt;In today’s digital landscape, &lt;strong&gt;trust is earned through security&lt;/strong&gt;. But true security demands a &lt;strong&gt;Zero Trust&lt;/strong&gt; mindset—one that assumes no user, device, or system is inherently safe. This approach helps organizations and individuals stay vigilant, verify everything, and minimize risk.&lt;/p&gt;

&lt;p&gt;Security isn’t just a technical requirement—it’s a social contract. It protects our identities, our relationships, and our mental well-being in a world that’s always online.&lt;/p&gt;

</description>
      <category>security</category>
      <category>digital</category>
      <category>identity</category>
      <category>zerotrust</category>
    </item>
    <item>
      <title>🚧Where Traffic Management Meets Scalability: Designing a Secure Azure Web App Architecture with VMSS and Load Balancer</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Fri, 22 Aug 2025 19:32:27 +0000</pubDate>
      <link>https://forem.com/boye88/where-traffic-management-meets-scalability-designing-a-secure-azure-web-app-architecture-with-1hb7</link>
      <guid>https://forem.com/boye88/where-traffic-management-meets-scalability-designing-a-secure-azure-web-app-architecture-with-1hb7</guid>
      <description>&lt;h2&gt;
  
  
  Why Scalability and Traffic Management Matter for Modern Web Apps ?
&lt;/h2&gt;

&lt;p&gt;Scaling web applications in the cloud doesn’t have to be complicated — but it becomes essential the moment your app starts gaining traction. Imagine launching a small MVP gaming app just for fun. You expect a few hundred players, so you host it on a single virtual machine — simple and cheap. But overnight, the game goes viral, and suddenly thousands of players are trying to connect at once. The single Virtual machine hosting the app crashes under the load, and you’re faced with the challenge every developer fears: &lt;strong&gt;scaling fast, without downtime&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is exactly the kind of problem that cloud platforms like &lt;strong&gt;Azure , AWS &amp;amp; and other CSPs&lt;/strong&gt; are designed to solve. In this demo lab, I’ll walk you through how to set up a &lt;strong&gt;scalable, secure, and monitored web infrastructure&lt;/strong&gt; using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Virtual Machine Scale Sets (VMSS)&lt;/strong&gt; for automatic scaling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public Load Balancer&lt;/strong&gt; to distribute incoming traffic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NAT Gateway&lt;/strong&gt; for secure outbound connectivity for patches and updates of Virtual Machines&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Bastion&lt;/strong&gt; to lock down admin access to VM securely&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Network Security Groups&lt;/strong&gt; to control inbound traffic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Machine Image&lt;/strong&gt; for consistent VM provisioning and fast deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Monitor&lt;/strong&gt; to track performance and health&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these services handle surging traffic by distributing requests across multiple NGINX web servers, scaling resources based on demand, and maintaining security and observability throughout.&lt;/p&gt;

&lt;p&gt;By the end of this demo, you’ll see how even a small MVP can be ready for &lt;strong&gt;going viral&lt;/strong&gt; — without breaking under pressure.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔑 Prerequisites
&lt;/h4&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An active Azure subscription&lt;/li&gt;
&lt;li&gt;A valid SSH key pair&lt;/li&gt;
&lt;li&gt;Basic knowledge of Azure VNets, NSGs, and VMs&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Before we dive into the portal, let’s map out what the solution looks like. Our goal is to keep the viral game running smoothly by spreading player traffic across multiple servers, while still keeping admin access secure and updates flowing. Here’s the big picture of how &lt;strong&gt;Azure Bastion, NAT Gateway, NSGs, VM Scale Sets, and the Load Balancer all connect seamlessly&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%2Fc4qn8xtltrx7buthya8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4qn8xtltrx7buthya8q.png" alt="End2End" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: 🌐Networking Environment Setup
&lt;/h2&gt;

&lt;p&gt;Every scalable system begins with a solid foundation.  Think of this as laying the groundwork for a new city. Before any buildings can go up, you need to map out the neighbourhoods &lt;strong&gt;(virtual networks)&lt;/strong&gt;, assign street addresses &lt;strong&gt;(IP address space)&lt;/strong&gt;, divide those streets into smaller blocks &lt;strong&gt;(subnets)&lt;/strong&gt;, and establish the rules for who can enter and exit each building &lt;strong&gt;(security groups)&lt;/strong&gt;. This structured approach provides the essential backbone where all your servers and services will reside, ensuring a &lt;strong&gt;secure and scalable environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Create a &lt;strong&gt;Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: DigitalLab-RG (or reuse existing).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Virtual Network, Subnets, NSGs, NAT Gateway for Inbound Traffic, Public Load Balancer &amp;amp; Bastion Host for Secure Access to Custom VM
&lt;/h3&gt;

&lt;p&gt;Create Virtual Network &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: vnet-webservers&lt;/li&gt;
&lt;li&gt;Address space: 10.50.0.0/16&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add Subnets (Private &amp;amp; Bastion)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;snet-custommvms-private: 10.50.10.0/24&lt;/li&gt;
&lt;li&gt;snet-vmss-private: 10.50.11.0/24&lt;/li&gt;
&lt;li&gt;AzureBastionSubnet: 10.50.9.192/26&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28hs4y07b7a3xz5rsz02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28hs4y07b7a3xz5rsz02.png" alt="Vnet/Subnet" width="800" height="530"&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%2Febnasct55ityos4s3cxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febnasct55ityos4s3cxg.png" alt="Network" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create Network Security Groups (NSG) &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nsg-customvm: Allow Port 22 from Bastion subnet&lt;/li&gt;
&lt;li&gt;nsg-vmss: Allow Port 80 from Internet, Port 22 from your IP&lt;/li&gt;
&lt;li&gt;linuxworkers-nsg: Allow Port 80 from Internet, Port 22 from your IP ( VMSS NIC)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlrwn9761g4k2tndn4lw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlrwn9761g4k2tndn4lw.png" alt="customvmnsg" width="800" height="334"&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%2Fn38pzn7aak10q2ndrsga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn38pzn7aak10q2ndrsga.png" alt="vmssnsg" width="800" height="318"&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%2Fmay75ym9ay2njdkqaoyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmay75ym9ay2njdkqaoyd.png" alt="nicnsg" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Associate NSGs to Subnets (Custom VM &amp;amp; VMSS)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;snet-custommvms-private → nsg-customvm&lt;/li&gt;
&lt;li&gt;snet-vmss-private → nsg-vmss&lt;/li&gt;
&lt;li&gt;AzureBastionSubnet → No NSG (Not need, Handled by Azure)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Create Network Address Translation Gateway (NAT GW) for Outbound Traffic &amp;amp; Associate NAT to Private Subnet.&lt;/p&gt;

&lt;p&gt;Our servers need a way to stay updated &lt;strong&gt;without exposing themselves to the internet&lt;/strong&gt;. That’s where the NAT Gateway comes in — letting the VMs &lt;strong&gt;download patches and packages securely&lt;/strong&gt;, without opening any direct inbound ports.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create NAT GW (Outbound Traffic)&lt;/li&gt;
&lt;li&gt;Attach to snet-vmss-private and snet-custommvms-private&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Deploy Bastion Host to AzureBastionSubnet&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: Jumpbox&lt;/li&gt;
&lt;li&gt;Tier: Standard&lt;/li&gt;
&lt;li&gt;Subnet: AzureBastionSubnet&lt;/li&gt;
&lt;li&gt;Public IP: vnet-webservers-ip&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgl49yfg4nll869pgg93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgl49yfg4nll869pgg93.png" alt="bastion" width="800" height="441"&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%2Fkhglc0hltokfwlbgt5da.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhglc0hltokfwlbgt5da.png" alt="jumpbox" width="800" height="510"&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%2F7j7ihi3vd8rsbitpzle7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j7ihi3vd8rsbitpzle7.png" alt="BASTION" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2:🚧 Traffic Management (Load Balancer)
&lt;/h2&gt;

&lt;p&gt;Of course, players won’t connect to servers directly. Instead, all &lt;strong&gt;traffic flows through a Public Load Balancer&lt;/strong&gt;, which evenly &lt;strong&gt;distributes requests across our VMSS instances&lt;/strong&gt;. If one VM fails or scales out, the load balancer &lt;strong&gt;keeps traffic flowing seamlessly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Create Public Load Balancer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: FrontEndLB&lt;/li&gt;
&lt;li&gt;Region: UK South&lt;/li&gt;
&lt;li&gt;SKU: Standard&lt;/li&gt;
&lt;li&gt;Type: Public&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend IP Configuration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: FrontEndIP&lt;/li&gt;
&lt;li&gt;Public IP: Create new → LoadBalancerIP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend Pool&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: LinuxWorkerNode&lt;/li&gt;
&lt;li&gt;Attach to vnet-webservers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inbound Rules&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load balancing rule: HTTP (Port 80) → Backend pool&lt;/li&gt;
&lt;li&gt;NAT rule: Map SSH access (Port 221–320) to backend VMs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx60tx3cvjlnqeyjh3hf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx60tx3cvjlnqeyjh3hf4.png" alt="Load Balancer" width="800" height="593"&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%2Fieoq7ne0t98ub81bk1je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fieoq7ne0t98ub81bk1je.png" alt="Frontend" width="800" height="306"&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%2Fn7zo5to3xqoheukehedb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7zo5to3xqoheukehedb.png" alt="Backend" width="800" height="378"&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%2Fw8tfq0rnwi4tsm59p1iy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8tfq0rnwi4tsm59p1iy.png" alt="Inbound" width="800" height="404"&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%2F6zuytm4qnz0o8nd2qmv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zuytm4qnz0o8nd2qmv3.png" alt="create" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: 🖥 Compute Setup
&lt;/h2&gt;

&lt;p&gt;Instead of manually configuring every server, we’ll start by preparing a single &lt;strong&gt;NGINX VM&lt;/strong&gt;. Once it’s patched and ready, we’ll capture it as a reusable image in the &lt;strong&gt;Azure Compute Gallery&lt;/strong&gt;. Think of this as our source of truth for every future web server for faster deployment.&lt;/p&gt;

&lt;p&gt;Create Azure Compute Gallery &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%2Fhyx464p4k6ysyj25xift.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyx464p4k6ysyj25xift.png" alt="gallery" width="800" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Virtual Machine (Linux) 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpg7x8mo8l8z9tf58k8g.png" alt="vm" width="800" height="521"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzuk9aqke05mmu0l1kbm.png" alt="vm" width="800" height="640"&gt;
&lt;/li&gt;
&lt;li&gt;Add Data Disk
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasz5pmzuubu16ja7dznj.png" alt="DataDisk" width="800" height="625"&gt;
&lt;/li&gt;
&lt;li&gt;Place Custom VM in the Private Subnet for the Network configuration
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7pcbwbs8xc1sacr9ryl.png" alt="network" width="800" height="564"&gt;
&lt;/li&gt;
&lt;li&gt;Disable Boot Diagnostic
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxcjx3g2g17b5qll4qcg.png" alt="boot" width="800" height="610"&gt;
&lt;/li&gt;
&lt;li&gt;Post Configuration user data script to Mount Data Disk, Install Azure Monitor Agent on VM and Install NGINX
&lt;/li&gt;
&lt;/ul&gt;

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

# Variables
DISK="/dev/sdb"  # Adjust if needed
PARTITION="${DISK}1"
MOUNT_POINT="/mnt/data"
HTML_FILE="/var/www/html/index.nginx-debian.html"

# Create a new partition
echo -e "n\np\n1\n\n\nw" | sudo fdisk $DISK

# Refresh partition table
sudo partprobe $DISK

# Format the partition with EXT4
sudo mkfs.ext4 $PARTITION

# Create mount point and mount the partition
sudo mkdir -p $MOUNT_POINT
sudo mount $PARTITION $MOUNT_POINT

# Make the mount persistent
echo "$PARTITION $MOUNT_POINT ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab

# Install Nginx
sudo apt update
sudo apt install -y nginx

# Replace default Nginx welcome page
sudo bash -c "cat &amp;gt; $HTML_FILE &amp;lt;&amp;lt;EOF
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Welcome to my Ubuntu 22.04 VM&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
EOF"

#  Install Azure Monitor Agent with auto-upgrade enabled
echo "Installing Azure Monitor Agent with auto-upgrade..."
if ! command -v curl &amp;amp;&amp;gt; /dev/null; then
    echo "Installing curl..."
    sudo apt install -y curl
fi
curl -s https://aka.ms/InstallAzureMonitorLinuxAgent | bash -s -- --enable-auto-upgrade

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ln5ec2z6tzyulg510wl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ln5ec2z6tzyulg510wl.png" alt="POSTCONFIG" width="800" height="565"&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%2Fro0szo0shvxcl16uxgym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro0szo0shvxcl16uxgym.png" alt="deployment" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check Azure Monitor Agent Installation for Telemetry&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%2Fnssc8vilhwi4m9x7nym5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnssc8vilhwi4m9x7nym5.png" alt="Agent" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect to Custom VM via Bastion to check Post Configuration script Installed NGINX &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzb1hcay68m4tgj0f5oj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzb1hcay68m4tgj0f5oj.png" alt="connectvm" width="800" height="447"&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%2Fi3px0y9fzm9win5tymsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3px0y9fzm9win5tymsp.png" alt="ubuntu" width="800" height="460"&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%2F2mg1eylu6jityhcwe1lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mg1eylu6jityhcwe1lf.png" alt="VM" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stop the Virtual Machine, Capture the Image of the Custom VM , Publish the Image to Azure Compute Gallery
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68sjz3tifu81zjfu6vod.png" alt="snapshot" width="800" height="386"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2pb2r0vee7zld4qc5lj.png" alt="image" width="800" height="706"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Now that NGINX is up and running smoothly on the Custom VM, let’s play it safe and delete the Bastion host, Bastion Public IP and Custom VM to avoid any extra costs before moving on to the next step&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg6p343h973x7v68dmeb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg6p343h973x7v68dmeb.png" alt="delete" width="800" height="412"&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%2F8towwx9usxq8xrynphi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8towwx9usxq8xrynphi6.png" alt="delete" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: 📈 Deploying the VM Scale Set (VMSS)
&lt;/h3&gt;

&lt;p&gt;Now comes the fun part: scaling out. Using our template image, we’ll spin up a VM Scale Set (VMSS) so Azure can automatically add or remove servers depending on traffic. This ensures the game won’t lag or crash, even if thousands of new players join.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Virtual Machine Scale Set (VMSS) using the Linux NGINX template image&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Select the image created by selecting &lt;strong&gt;see all images&lt;/strong&gt; to select shared image&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Configure the Network interface of the VMSS by placing it in the private subnet &lt;strong&gt;snet-vmss-private&lt;/strong&gt;, attach the NIC NSG created earlier &lt;strong&gt;linuxworkers-nsg&lt;/strong&gt; and disable public IP address.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Attach VMSS to Load Balancer by selecting  load balancer and the backendpool created earlier&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Disable Boot Diagnostic&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Enable &amp;amp; Configure Application Health monitoring for Health Probes&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Step 5: 🧪 Testing the Setup
&lt;/h3&gt;

&lt;p&gt;Time to put it to the test. We’ll hit the Public Load Balancer’s IP in a browser, then simulate heavy load by stressing one of the VMs gather performance logs metrics gathered by the azure monitoring agents.&lt;/p&gt;

&lt;p&gt;Get Load Balancer IP&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open in browser → Confirm NGINX landing page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qisspemivrrxak2b9xp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qisspemivrrxak2b9xp.png" alt="FIP" width="800" height="382"&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%2Fe9uz0xv9ktthbgzuvbtb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9uz0xv9ktthbgzuvbtb.png" alt="nginx" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Inbound NAT rule in Load Balancer section to see what port each VM running is mapped to for SSH access from Local source IP.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Remote into both VM with using public load balancer public ip private key
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i "your-key.pem" username@loadbalancerip -p &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Test Communication between both VMs&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%2Fppmgui9nmkm3i7s8zw6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppmgui9nmkm3i7s8zw6m.png" alt="ping" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if NGINX webserver is running , Test Webserver &amp;amp; Azure Monitor Agents on both VMs&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%2F8jgi7e2abavdifyykmx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jgi7e2abavdifyykmx6.png" alt="test" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make some changes to the content of the html file by navigating to &lt;strong&gt;/var/www/html/index.nginx-debian.html&lt;/strong&gt; directory for each server to test how traffic is being distributed by the load balancer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Refresh the Load Balancer IP on the browser, you might need to refresh a couple of times to see the changes and traffic distributed on both servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzu1r9kysm5cgxwqv19r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzu1r9kysm5cgxwqv19r.png" alt="node 1" width="800" height="282"&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%2Fhvxyicoakflzl7uu2aa9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvxyicoakflzl7uu2aa9.png" alt="node 2" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the VMs are running smoothly, Lets try to overload one of the VMs CPU usage by installing stress&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%2F9r9vdltkawsmruu351cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r9vdltkawsmruu351cv.png" alt="stress" width="800" height="218"&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%2F73dn98z1yhp7r0f0larx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73dn98z1yhp7r0f0larx.png" alt="stress" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 📊 Monitoring and Insights
&lt;/h2&gt;

&lt;p&gt;Scaling isn’t just about adding servers — it’s about visibility. With &lt;strong&gt;Azure Monitor, Log Analytics, and VM Insights&lt;/strong&gt;, we’ll track performance, scaling events, and system health in real time. This way, we can catch issues before players do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt;: central repository where the logs will be stored and analyzed&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Next Navigate to Monitor to create &lt;strong&gt;Data Collection Endpoint (DCE)&lt;/strong&gt;: This endpoint is a resource that defines a unique URL where monitoring agents send their collected data&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Data Collection Rule (DCR)&lt;/strong&gt;: This rule specifies what data to collect and where to send it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faemurfy8gv7o4q22ay6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faemurfy8gv7o4q22ay6m.png" alt="dcr" width="800" height="526"&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%2Fhw6izbc1eixcdhq5plvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw6izbc1eixcdhq5plvh.png" alt="resource" width="800" height="370"&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%2Fnolo7iurxf4c59z52l3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnolo7iurxf4c59z52l3h.png" alt="resource" width="800" height="376"&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%2Fuvnsfw33tpwvmp3g0ihw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvnsfw33tpwvmp3g0ihw.png" alt="destination" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enabling &lt;strong&gt;VM Insights&lt;/strong&gt; on the nodes allows the Azure Monitor Agents to execute the rules defined in the &lt;strong&gt;Data Collection Rule (DCR)&lt;/strong&gt;. The agents then collect data from the virtual machines and send it to the designated &lt;strong&gt;Data Collection Endpoint (DCE)&lt;/strong&gt;. This process links the monitored virtual machines to the &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt;, where the collected data is stored and can be analyzed.&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%2Fcf30ys35qtohw8j1t78r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf30ys35qtohw8j1t78r.png" alt="insight" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query logs in the Log Analytics workspace&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Monitor Performance in the VM Insight Pane of Azure Monitor&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Step 7: Cleanup (Export Before Deleting)
&lt;/h3&gt;

&lt;p&gt;Before deleting resources, export your deployment template so you can reuse it later.&lt;/p&gt;

&lt;p&gt;Export Deployment Template&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your Resource Group in the Azure Portal&lt;/li&gt;
&lt;li&gt;Select Automation → Export Template&lt;/li&gt;
&lt;li&gt;Download the template as JSON or ARM/Bicep&lt;/li&gt;
&lt;li&gt;Save it to your repo or PC for future redeployments&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This template captures your networking, VMSS, load balancer, and monitoring setup so you can redeploy quickly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Delete Unused Resources (to avoid charges)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource Group (if you don’t need the environment anymore)&lt;/li&gt;
&lt;li&gt;Public IP addresses&lt;/li&gt;
&lt;li&gt;Disks &amp;amp; Snapshots&lt;/li&gt;
&lt;li&gt;NAT Gateway &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;VMSS + Load Balancer = scalability and resilience&lt;/li&gt;
&lt;li&gt;Virtual Network + NAT + Bastion + NSGs = secure connectivity&lt;/li&gt;
&lt;li&gt;Compute Gallery + Template Image = fast, consistent deployments&lt;/li&gt;
&lt;li&gt;Azure Monitor = visibility into performance &amp;amp; scaling events&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>loadbalancer</category>
      <category>vmss</category>
      <category>azure</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>🛡️ Managing Azure Storage Accounts: Secure, Scalable, and Resilient Data Solutions with Blob Storage &amp; Azure Files</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Mon, 11 Aug 2025 18:20:59 +0000</pubDate>
      <link>https://forem.com/boye88/managing-azure-storage-accounts-secure-scalable-and-resilient-data-solutions-with-blob-2oh4</link>
      <guid>https://forem.com/boye88/managing-azure-storage-accounts-secure-scalable-and-resilient-data-solutions-with-blob-2oh4</guid>
      <description>&lt;p&gt;In today’s cloud-first world, businesses need storage solutions that are not just scalable—but secure, highly available, and resilient to failure. &lt;strong&gt;Azure Storage Accounts&lt;/strong&gt; offer exactly that: a unified platform for storing &lt;strong&gt;diverse data types—blobs (Binary Large Object), files, queues, tables, and disks—accessible globally over HTTP/HTTPS with a unique namespace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Whether you're backing up a &lt;strong&gt;public website&lt;/strong&gt;, &lt;strong&gt;managing internal documents&lt;/strong&gt;, or enabling &lt;strong&gt;shared access&lt;/strong&gt; across departments, Azure’s storage services provide the &lt;strong&gt;flexibility and control&lt;/strong&gt; needed to meet enterprise demands. With built-in &lt;strong&gt;redundancy&lt;/strong&gt; options like &lt;strong&gt;LRS, ZRS, GRS, RA-GRS and GZRS&lt;/strong&gt;, your data is protected against local failures and regional outages. And with &lt;strong&gt;encryption at rest&lt;/strong&gt;, &lt;strong&gt;network isolation&lt;/strong&gt;, and &lt;strong&gt;identity-based access&lt;/strong&gt;, &lt;strong&gt;security&lt;/strong&gt; is baked into every layer.&lt;/p&gt;

&lt;p&gt;This hands-on guide walks through five real-world scenarios, each mapped to a specific Azure storage configuration:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Provisioning Storage for IT Team Training &amp;amp; Development
&lt;/h3&gt;

&lt;p&gt;This solution requires a &lt;strong&gt;low-cost&lt;/strong&gt;, flexible storage solution for &lt;strong&gt;large files like software test builds and training videos&lt;/strong&gt;. Using Azure Blob Storage with &lt;strong&gt;Locally Redundant Storage (LRS)&lt;/strong&gt; fits the bill perfectly. This setup is ideal because it's a &lt;strong&gt;cost-effective&lt;/strong&gt; option that's designed for data that doesn't need a backup. Plus, &lt;strong&gt;all data transfers are kept secure using TLS 1.2 encryption&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%2Fienjmdxed6g4tdy86g59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fienjmdxed6g4tdy86g59.png" alt="ArchTask1" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Resource Group&lt;/strong&gt; Container for this project: &lt;strong&gt;StorageAccountLab-RG&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;I'll be using my existing Resource Group for the Demonstration&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Deploy a &lt;strong&gt;Storage Account&lt;/strong&gt; to support testing and training for the IT Team.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Use the search Bar: &lt;strong&gt;Storage Accounts&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzaw96zpgt2ip30jjjsd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzaw96zpgt2ip30jjjsd.png" alt="Search for storage account" width="800" height="456"&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%2F7spwi0fk9zbpxo6z06oj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7spwi0fk9zbpxo6z06oj.png" alt="Create" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Select Subscription -&amp;gt; Resource Group -&amp;gt; Storage Account Name ( Globally Unique) -&amp;gt; Standard -&amp;gt; Locally Redundant Storage ( LRS ) -&amp;gt; Review+Create -&amp;gt; Go to Resources&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31y0ajy075jkjp35gc00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31y0ajy075jkjp35gc00.png" alt="Fill Parameter" width="745" height="891"&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%2Fndtk2nk8l5pg7z4vj7xd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndtk2nk8l5pg7z4vj7xd.png" alt="Go to Resources" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure simple settings  for Data Redundancy , Secure Transfer , Transport Layer Security (TLS) v1.2 , Shared Keys &amp;amp; Public Access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k61l8zk04v9m0hfaied.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k61l8zk04v9m0hfaied.png" alt="Data Redundancy" width="800" height="493"&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%2Fzwfrmfdot95wvfl7ove8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwfrmfdot95wvfl7ove8.png" alt="Basic Settings" width="800" height="446"&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%2F411xc0wxm82dwsfb72ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F411xc0wxm82dwsfb72ui.png" alt="Set Public Network" width="800" height="585"&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%2F5wt47sgqbhhfbs2e7h39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wt47sgqbhhfbs2e7h39.png" alt="Enable Public Network" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Public Web Storage for Product Delivery to Global Customers
&lt;/h3&gt;

&lt;p&gt;This task sets up &lt;strong&gt;Azure Blob Storage&lt;/strong&gt; to host a public company website container with the intent to &lt;strong&gt;deliver product images and content to global users&lt;/strong&gt;. We’ll create a highly available storage account with &lt;strong&gt;RA-GRS redundancy&lt;/strong&gt;, configure &lt;strong&gt;anonymous access&lt;/strong&gt; for fast public delivery, and enable features like &lt;strong&gt;soft delete and versioning to protect and manage content&lt;/strong&gt;. The goal is to ensure quick load times, easy access, and resilience—without requiring users to log 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%2Fyixll9f75skn83edm3nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyixll9f75skn83edm3nx.png" alt="ArchTask2" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Storage account to support public website using default settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nurdmuty1rrk39zq66x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nurdmuty1rrk39zq66x.png" alt="Storage Account with HA" width="800" height="496"&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%2Fs4c3b2iledeos0lhz14b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4c3b2iledeos0lhz14b.png" alt="Enabled" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Configure High Availability that allows Read access in a Secondary Region if there is  Regional Failure&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Navigate to the &lt;strong&gt;Data Management&lt;/strong&gt; section -&amp;gt; Select &lt;strong&gt;Redundancy&lt;/strong&gt; -&amp;gt; Select &lt;strong&gt;Read-access Geo Redundant storage&lt;/strong&gt; -&amp;gt; Review the Primary &amp;amp; Secondary Location&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Enable Accessibility to public website without customer login requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Settings -&amp;gt; Configuration -&amp;gt; &lt;strong&gt;Enable Allow Blob anonymous access&lt;/strong&gt; -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Create Blob Container where images &amp;amp; product catalogues will be uploaded&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Data Storage section -&amp;gt; Select Container -&amp;gt; Name &lt;strong&gt;publicwebsite&lt;/strong&gt; -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Configure anonymous read access for the public container blobs that allows global customers to view contents without authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Select the Public website container -&amp;gt; Change access level -&amp;gt; Select &lt;strong&gt;Anonymous read access for blobs only&lt;/strong&gt; -&amp;gt; OK&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1kr8qj0t7o42jup60nb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1kr8qj0t7o42jup60nb.png" alt="change access" width="800" height="269"&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%2Fu2louitospc85plogd5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2louitospc85plogd5e.png" alt="anon read " width="800" height="152"&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%2F5lz8h4p6clj1qud74ms9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lz8h4p6clj1qud74ms9.png" alt="access tier" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload files to the public website container to test access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyt0fmrkzbkmf3s3lmja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyt0fmrkzbkmf3s3lmja.png" alt="Upload files" width="800" height="243"&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%2Fc0i6ujab5ftvolnk1w9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0i6ujab5ftvolnk1w9k.png" alt="Copy Url" width="800" height="382"&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%2Fqzgh37l8d1z5zkbljgp1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzgh37l8d1z5zkbljgp1.png" alt="Open in browser" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure Soft Delete feature to protect website contents from accidental deletion&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Navigate to Data Management -&amp;gt; &lt;strong&gt;Enable Soft Delete for blobs&lt;/strong&gt; -&amp;gt; Set retention period for 21 days -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Delete Uploaded files -&amp;gt; Select &lt;strong&gt;show active and deleted blobs&lt;/strong&gt; to display files that has been deleted from the container -&amp;gt; select &lt;strong&gt;Undelete&lt;/strong&gt; to restore file -&amp;gt; Select &lt;strong&gt;Only show active blob&lt;/strong&gt; once file has been undeleted/restored&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlxo9wk526xhxguhwbuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlxo9wk526xhxguhwbuc.png" alt="active&amp;amp;deleted" width="800" height="206"&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%2Fchi4nfj5jc4y395zr9fz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchi4nfj5jc4y395zr9fz.png" alt="undelete" width="800" height="244"&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%2F3qszzjugd2x3vgxkvhs1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qszzjugd2x3vgxkvhs1.png" alt="Test" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable versioning to keep track of changes in product documents &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Data Management -&amp;gt; Data Protection -&amp;gt; &lt;strong&gt;Select Enable versioning for blobs&lt;/strong&gt; -&amp;gt; Keep all version -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;To understand version control, upload a new version of a file with a small change. This will create a new version of the document, allowing you to easily revert to the original if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;When you attempt to upload the same file after small changes has been made, You will notice the file already exist, select &lt;strong&gt;overwrite if file exists&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdkw9ie4p5rog1tz08ac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdkw9ie4p5rog1tz08ac.png" alt="Already exist" width="800" height="228"&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%2F9kbpwrmnsyzs5ttdqg4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kbpwrmnsyzs5ttdqg4h.png" alt="Overwrite" width="800" height="208"&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%2Fu9qojobgsudgjzjuwdz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9qojobgsudgjzjuwdz1.png" alt="New upload" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;View versions -&amp;gt; Show deleted version&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcuneulkres8011htp5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcuneulkres8011htp5c.png" alt="current version" width="800" height="395"&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%2Fzr645i8mj0wca8trjs4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr645i8mj0wca8trjs4z.png" alt="versions" width="800" height="320"&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%2Fim3iy9m2p5lfxuju9egx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fim3iy9m2p5lfxuju9egx.png" alt="more versions" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Private Internal Storage for Corporate Documents - Secure, Redundant, Cost Effective &amp;amp; Controlled Access
&lt;/h3&gt;

&lt;p&gt;In this task, we’re provisioning a secure Azure Blob Storage solution for &lt;strong&gt;internal corporate documents&lt;/strong&gt;, designed to meet enterprise-grade requirements for &lt;strong&gt;availability, privacy, and operational efficiency&lt;/strong&gt;. The storage account is configured with &lt;strong&gt;Geo-Redundant Storage (GRS) to ensure high availability&lt;/strong&gt; in the event of regional outages. &lt;strong&gt;Sensitive files&lt;/strong&gt; are housed in a private container with &lt;strong&gt;no anonymous access&lt;/strong&gt;, maintaining strict internal confidentiality. We’ll handle secure file uploads and generate &lt;strong&gt;SAS tokens to enable scoped, time-bound access for external partners&lt;/strong&gt;. To &lt;strong&gt;optimize costs, lifecycle management will automatically transition blobs to the cool tier after 30 days&lt;/strong&gt;. Finally, we’ll &lt;strong&gt;replicate objects&lt;/strong&gt; from a public container into this private one, ensuring &lt;strong&gt;internal backup continuity and data resilience&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%2Fuidnt1h83ykaxbsxbnsl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuidnt1h83ykaxbsxbnsl.png" alt="Arch3" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a storage account for internal &lt;strong&gt;private&lt;/strong&gt; corporate documents with High Availability &lt;strong&gt;(GRS)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Ensure to check &lt;strong&gt;Data Management&lt;/strong&gt; section that Redundancy is set to &lt;strong&gt;GRS&lt;/strong&gt; as Read access is not required in the Secondary Region, Apologies for the error :)&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Create private storage container to store corporate document&lt;/li&gt;
&lt;li&gt;Upload a file to the private container and test its not publicly accessible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9amyf7j3bd8w0kht2tuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9amyf7j3bd8w0kht2tuu.png" alt="Private" width="800" height="466"&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%2F8pb2bab4cauvx8p89qpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pb2bab4cauvx8p89qpg.png" alt="Nonaccessible" width="800" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate a &lt;strong&gt;Shared Access Signature (SAS) Token/URL&lt;/strong&gt; that with will be used by Third Party partners for &lt;strong&gt;Read&lt;/strong&gt;/Write permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Select uploaded file -&amp;gt; click on the 3 dots -&amp;gt; Select &lt;strong&gt;Generate SAS&lt;/strong&gt;&lt;br&gt;
Set permission to Read -&amp;gt; Set Start and Expiry to 24hrs -&amp;gt; Https -&amp;gt; &lt;strong&gt;Generate Token and URL&lt;/strong&gt; -&amp;gt; Copy URL to browser to view file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3o9ewqk9voi8wplpk0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3o9ewqk9voi8wplpk0c.png" alt="SAS" width="800" height="401"&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%2Fw4ig82q4e02twgfmr737.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4ig82q4e02twgfmr737.png" alt="Read Permisson" width="800" height="437"&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%2Fy5np1u90zh2strc8j1xd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5np1u90zh2strc8j1xd.png" alt="View" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure a &lt;strong&gt;Lifecycle rule in Data Management&lt;/strong&gt; section that move blobs from Hot to Cool Tier&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Data Management -&amp;gt; Lifecycle management -&amp;gt; Add rule&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F058d97gh9asr885ek8sc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F058d97gh9asr885ek8sc.png" alt="Lifecylerule" width="800" height="367"&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%2Fn5u1oixxzqksy2q1k1n3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5u1oixxzqksy2q1k1n3.png" alt="Movetocool30" width="800" height="592"&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%2Fdamlnwvinpdyw0m4nvjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdamlnwvinpdyw0m4nvjm.png" alt="30days" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up &lt;strong&gt;Backup container&lt;/strong&gt; in the private storage account for &lt;strong&gt;object replication&lt;/strong&gt; from the public website to the private back up container.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Data Storage -&amp;gt; Add Container -&amp;gt; enter parameters for &lt;strong&gt;backup&lt;/strong&gt; and default setting -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Navigate back to the &lt;strong&gt;public website storage account&lt;/strong&gt; to set up replication rule&lt;/li&gt;
&lt;li&gt;Add Replication rule with &lt;strong&gt;Destination Storage Account(Private)&lt;/strong&gt; &lt;strong&gt;Source container (public)&lt;/strong&gt; to &lt;strong&gt;Destination container (private)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Review &lt;strong&gt;replication rule&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Upload a file into the public container&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;private container&lt;/strong&gt; to check object was replicated, This can take up to 2-5mins, so you might need to refresh a couple of times.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fox9zu0booce16wdyrt9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fox9zu0booce16wdyrt9y.png" alt="Replication" width="800" height="330"&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%2F230k4qtht3dhdrgh34ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F230k4qtht3dhdrgh34ng.png" alt="Rules" width="800" height="434"&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%2F34fg97fefipfs7reqbai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34fg97fefipfs7reqbai.png" alt="replication rule" width="800" height="302"&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%2F3hsibawf8a9xf2z24hdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hsibawf8a9xf2z24hdu.png" alt="Upload object in public object" width="800" height="201"&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%2Fcu7ufeha4989jm30wa61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu7ufeha4989jm30wa61.png" alt="Replication completed" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🗂️ Secure Shared File Storage for Finance Department Using Azure Files
&lt;/h3&gt;

&lt;p&gt;We’ll configure &lt;strong&gt;Azure Files&lt;/strong&gt; to support &lt;strong&gt;shared file storage&lt;/strong&gt; for the company’s &lt;strong&gt;finance department&lt;/strong&gt;. The solution uses a &lt;strong&gt;Premium-tier storage account with ZRS redundancy&lt;/strong&gt; to ensure &lt;strong&gt;performance and availability across zones&lt;/strong&gt;. We’ll create a dedicated file share and directory for corporate use, enable &lt;strong&gt;snapshot protection to guard against accidental deletions&lt;/strong&gt;, and test restore functionality. To secure access, we’ll restrict connectivity to a specific virtual network using &lt;strong&gt;service endpoints&lt;/strong&gt;, and switch the storage account from public to selected network access only, ensuring that file access is &lt;strong&gt;tightly controlled and compliant with internal policies&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%2Fq5u3civ2cgkf3cthcsqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5u3civ2cgkf3cthcsqt.png" alt="ArchTask4" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Zone Redundant&lt;/strong&gt; storage account for the finance department's shared files in the Resource Group **StorageAccountLab-RG".&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage accounts -&amp;gt; + Create -&amp;gt; Resource group -&amp;gt; Create new -&amp;gt; [enter name] -&amp;gt; OK -&amp;gt; Storage account name -&amp;gt; [enter name] -&amp;gt; Performance -&amp;gt; Premium -&amp;gt; Premium account type -&amp;gt; File shares -&amp;gt; Redundancy -&amp;gt; Zone-redundant storage -&amp;gt; Review -&amp;gt; Create -&amp;gt; Go to resource&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf0f7e611ojdehe0rctj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf0f7e611ojdehe0rctj.png" alt="sarg" width="800" height="300"&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%2Fjohrpn35f6ru71y4mmsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjohrpn35f6ru71y4mmsc.png" alt="sa" width="800" height="712"&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%2Fl5gq35l6cugbcr4e5lih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5gq35l6cugbcr4e5lih.png" alt="createsafile" width="702" height="873"&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%2Fzwejryds2hsislrew5qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwejryds2hsislrew5qc.png" alt="Gotoresources" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create file share for the corporate office &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;File shares&lt;/strong&gt; -&amp;gt; + File share -&amp;gt; Name -&amp;gt; [enter a name] -&amp;gt; Go to back up tab to disable backup -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qmlf8y3vgs5xoiyp079.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qmlf8y3vgs5xoiyp079.png" alt="fileshare" width="800" height="317"&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%2F1rt80hojcbr0a0h1ukin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1rt80hojcbr0a0h1ukin.png" alt="gotobackup" width="800" height="841"&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%2Fuu8bcnc8a0geskdlrnm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu8bcnc8a0geskdlrnm1.png" alt="disable backup" width="764" height="892"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure a directory for  the finance department&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Select your file share&lt;/strong&gt; -&amp;gt; + Add directory -&amp;gt; Name -&amp;gt; finance -&amp;gt; Browse -&amp;gt; [select finance directory] -&amp;gt; Upload -&amp;gt; [select a file]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmuimehhifi7zsbji4lqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmuimehhifi7zsbji4lqk.png" alt="storagebrowser" 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%2Fxqwxhrmraz1o0z3xgl78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqwxhrmraz1o0z3xgl78.png" alt="directory" width="800" height="158"&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%2Fo9a7dl943m2qfcdpk87q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9a7dl943m2qfcdpk87q.png" alt="fiance" width="800" height="172"&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%2F48o5rq4z9cbg3f52rvk9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48o5rq4z9cbg3f52rvk9.png" alt="upload" width="800" height="169"&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%2Fi01qjf0a14p6sr72t3fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi01qjf0a14p6sr72t3fo.png" alt="uploadedfile" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Snapshot of the file share to protect against accidental deletion&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Select your file share -&amp;gt; Operations -&amp;gt; Snapshots -&amp;gt; + Add snapshot -&amp;gt; OK -&amp;gt; Select your snapshot -&amp;gt; [verify file directory]&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Restore a File from a Snapshot&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Return to file share -&amp;gt; Browse -&amp;gt; [locate and select file] -&amp;gt; Properties -&amp;gt; Delete -&amp;gt; Yes -&amp;gt; Snapshots -&amp;gt; [select snapshot] -&amp;gt; [navigate to file] -&amp;gt; Restore -&amp;gt; [enter new file name] -&amp;gt; Verify&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zdlivkfmavptje1puk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zdlivkfmavptje1puk7.png" alt="DeleteOps" width="800" height="177"&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%2Fatptr1ba0vhyeasioof8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatptr1ba0vhyeasioof8.png" alt="RestoreSnap" width="800" height="163"&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%2Fs9xv2hqq2mzkigfkleve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9xv2hqq2mzkigfkleve.png" alt="retoration" width="800" height="166"&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%2Fuqp37ic9cuw28t5gy2mb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqp37ic9cuw28t5gy2mb.png" alt="res" width="800" height="220"&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%2Fn1z72h3xrsilnbgsn74n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1z72h3xrsilnbgsn74n.png" alt="completerestore" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure storage access restriction to selected Virtual Network &amp;amp; Subnet&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Virtual networks -&amp;gt; Create -&amp;gt; [select resource group] -&amp;gt; [name virtual network] -&amp;gt; Review + create -&amp;gt; Create -&amp;gt; Go to resource -&amp;gt; Settings -&amp;gt; Subnets -&amp;gt; default -&amp;gt; Service endpoints -&amp;gt; Services -&amp;gt; &lt;strong&gt;Microsoft.Storage&lt;/strong&gt; -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4v5clfg0v0rvsldflpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4v5clfg0v0rvsldflpc.png" alt="Vnet" width="800" height="729"&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%2F9z8wtkzk7hpe2kda90nz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z8wtkzk7hpe2kda90nz.png" alt="IPAddressTab" width="800" height="373"&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%2F6dtbnlb0ctpl3c3q31b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dtbnlb0ctpl3c3q31b3.png" alt="ServiceEP" width="532" height="891"&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%2F97dvxa8box1n1viptcx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97dvxa8box1n1viptcx4.png" alt="ReviewVnet" width="800" height="369"&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%2Fuufg7ff6eedtszht75az.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuufg7ff6eedtszht75az.png" alt="ValidateVnet" width="800" height="667"&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%2Fxb2we3q8lydf7j07dqnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxb2we3q8lydf7j07dqnw.png" alt="deployment complete" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restrict storage account to only access from selected Virtual Network&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Return to files storage account -&amp;gt; Security + networking -&amp;gt; Networking -&amp;gt; Public network access -&amp;gt; Enabled from selected virtual networks and IP addresses -&amp;gt; Virtual networks -&amp;gt; Add existing virtual network -&amp;gt; [select virtual network and subnet] -&amp;gt; Add -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr10mmk7cjaoqmmn43ll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr10mmk7cjaoqmmn43ll.png" alt="navigatetosa" width="800" height="234"&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%2Fqonp2ixkzntmc2nls2l0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqonp2ixkzntmc2nls2l0.png" alt="network" width="800" height="440"&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%2Fg7hzewoxq3oo14449400.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7hzewoxq3oo14449400.png" alt="SelectNetwork" width="800" height="370"&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%2Fzgc2aqef923syms9cg4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgc2aqef923syms9cg4j.png" alt="ready" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify Access Restriction&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage browser -&amp;gt; [navigate to file share] -&amp;gt; Verify message ("not authorized to perform this operation")&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h3&gt;
  
  
  🔐 Securing Azure Blob Storage for App Development Using Key Vault, Encryption, Managed Identities &amp;amp; Immutable Protection
&lt;/h3&gt;

&lt;p&gt;In this task, we’re configuring a &lt;strong&gt;Secure Azure Blob Storage&lt;/strong&gt; solution to support the development of a new internal application. The focus is on enforcing strict &lt;strong&gt;access controls using managed identities and access keys&lt;/strong&gt;, while applying &lt;strong&gt;role-based access control (RBAC)&lt;/strong&gt; to streamline permissions across development and testing environments. To safeguard critical test data, we’ll enable &lt;strong&gt;immutable blob protection&lt;/strong&gt;, ensuring that once written, data cannot be altered or deleted during retention. This setup supports secure automation, identity-driven access, and robust data integrity—ideal for modern app development workflows that demand both agility and compliance.&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%2Ftr3spko8c41kilv4ny5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr3spko8c41kilv4ny5u.png" alt="Arch5" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Storage Account with &lt;strong&gt;Infrastructure Encryption Enabled&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage accounts -&amp;gt; + Create -&amp;gt; Resource group -&amp;gt; Create new -&amp;gt; [name your resource group] -&amp;gt; OK -&amp;gt; Storage account name -&amp;gt; [enter a name] -&amp;gt; Encryption Tab -&amp;gt; Enable infrastructure encryption -&amp;gt; Review + Create -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4jjjmx04ezmqta43qkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4jjjmx04ezmqta43qkt.png" alt="StorageAccEncrypt" width="800" height="777"&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%2F9t3xk22h1cro94tbf0vb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t3xk22h1cro94tbf0vb.png" alt="Encryption" width="800" height="867"&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%2F8rittrxaswp2giojfyus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rittrxaswp2giojfyus.png" alt="Review" width="781" height="883"&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%2Fgdmrsq554ol51sie14bx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdmrsq554ol51sie14bx.png" alt="Deployment" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;User-Assigned Managed Identity&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Managed identities -&amp;gt; Create -&amp;gt; [select your resource group] -&amp;gt; Name -&amp;gt; [give it a name] -&amp;gt; Review and create -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsn9pll2kgqtjpkieedq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsn9pll2kgqtjpkieedq.png" alt="ManagedID" width="800" height="275"&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%2F2zzffglyhidkm37hn7g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zzffglyhidkm37hn7g6.png" alt="MangedID" width="800" height="363"&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%2F2v7bfvgf2ga7sulvodim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2v7bfvgf2ga7sulvodim.png" alt="ManagedID" width="800" height="662"&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%2Fkhf49th651bvxphyey7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhf49th651bvxphyey7c.png" alt="MangagedID" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Add &lt;strong&gt;Role Assignment&lt;/strong&gt; to Managed Identity&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage account -&amp;gt; Access Control (IAM) -&amp;gt; Add role assignment -&amp;gt; &lt;strong&gt;Storage Blob Data Reader&lt;/strong&gt; -&amp;gt; Members -&amp;gt; Managed identity -&amp;gt; Select members -&amp;gt; [select your managed identity] -&amp;gt; Select -&amp;gt; Review + assign -&amp;gt; Review + assign&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud6xwhi60fpqc5aqfmj2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fud6xwhi60fpqc5aqfmj2.png" alt="RoleAssignment" width="800" height="330"&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%2F1mgpvpv6mmufsf99gi0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mgpvpv6mmufsf99gi0q.png" alt="RoleAssignment" width="800" height="435"&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%2Fjq2bqepgmv8ujecicdl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq2bqepgmv8ujecicdl0.png" alt="RoleAssignment" width="800" height="410"&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%2Ftmzk1mhghfatim91gd7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmzk1mhghfatim91gd7q.png" alt="RoleAssignment" width="800" height="379"&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%2Fwls5jqhxz4gtf2e1ofox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwls5jqhxz4gtf2e1ofox.png" alt="RoleAssignment" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assign &lt;strong&gt;Key Vault Administrator&lt;/strong&gt; Role to User&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Resource groups -&amp;gt; [select your resource group] -&amp;gt; Access Control (IAM) -&amp;gt; Add role assignment -&amp;gt; Key Vault Administrator -&amp;gt; Members -&amp;gt; User, group, or service principal -&amp;gt; Select members -&amp;gt; [select your user account] -&amp;gt; Select -&amp;gt; Review + assign -&amp;gt; Review + assign  (&lt;strong&gt;Activate Role&lt;/strong&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55f94wfw5n6j7m7dbxuv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55f94wfw5n6j7m7dbxuv.png" alt="KeyADMIN" width="800" height="274"&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%2Fj0qbboq23ldxzgmtwnlj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0qbboq23ldxzgmtwnlj.png" alt="kEYaDMINROLE" width="800" height="420"&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%2Fj4cl4hu3kxg6pl9nck95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4cl4hu3kxg6pl9nck95.png" alt="KeyAdminRole" width="800" height="378"&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%2F64p2g9v5vpk4hns7khkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64p2g9v5vpk4hns7khkr.png" alt="KeyAdmin" width="800" height="616"&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%2Flrqo2t2sm1hx2n2zmh7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrqo2t2sm1hx2n2zmh7s.png" alt="Activate" 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%2F67gf4gw9g0e8o8w058w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67gf4gw9g0e8o8w058w4.png" alt="Activate" width="646" height="891"&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%2Fxwknul7q9jmxxtd82dlb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwknul7q9jmxxtd82dlb.png" alt="Activate" width="589" height="789"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Key Vault&lt;/strong&gt; to Store Access Keys&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Key vaults -&amp;gt; Create -&amp;gt; [select your resource group] -&amp;gt; Name -&amp;gt; [provide a name] -&amp;gt; Access configuration -&amp;gt; Azure role-based access control (recommended) -&amp;gt; Review + create -&amp;gt; Create -&amp;gt; Go to resource -&amp;gt; Overview -&amp;gt; [verify soft-delete and purge protection are enabled]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F218xswf9dnoo7f9u93la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F218xswf9dnoo7f9u93la.png" alt="KeyVault" width="800" height="383"&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%2Fvv9guuml4vzu737vbbmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvv9guuml4vzu737vbbmb.png" alt="KeyVault" width="800" height="339"&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%2Fpug7o8oxyxi0zg8ljt58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpug7o8oxyxi0zg8ljt58.png" alt="KeyVault" width="800" height="786"&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%2Fwrr0p9un6etg42h7ivdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrr0p9un6etg42h7ivdn.png" alt="KeyVault" width="800" height="451"&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%2F0z1s4j4qqq260n2q6wf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z1s4j4qqq260n2q6wf2.png" alt="Keyvault" width="800" height="777"&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%2Fvsj4sldiiqczaejnu89h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsj4sldiiqczaejnu89h.png" alt="KeyVault" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Customer Managed Key (CMK)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Key vault -&amp;gt; Objects -&amp;gt; Keys -&amp;gt; Generate/Import -&amp;gt; Name -&amp;gt; [name the key] -&amp;gt; Create&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe7uhlwg67niqev5fj18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe7uhlwg67niqev5fj18.png" alt="cmk" width="800" height="316"&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%2Fudn6tvc1f22mwitd4gik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudn6tvc1f22mwitd4gik.png" alt="CMK" width="800" height="469"&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%2Ft6njrk7y39rhsimhb1cs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6njrk7y39rhsimhb1cs.png" alt="CMK" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assign &lt;strong&gt;Key Vault Crypto Service Encryption User&lt;/strong&gt; Role to Managed Identity&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Resource groups -&amp;gt; [select your resource group] -&amp;gt; Access Control (IAM) -&amp;gt; Add role assignment -&amp;gt; Key Vault Crypto Service Encryption User -&amp;gt; Members -&amp;gt; Managed identity -&amp;gt; Select members -&amp;gt; [select your managed identity] -&amp;gt; Select -&amp;gt; Review + assign -&amp;gt; Review + assign&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kk1moutj1vv282f5fck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kk1moutj1vv282f5fck.png" alt="kvcs" width="800" height="352"&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%2F37ka10koaox019n54z25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37ka10koaox019n54z25.png" alt="kvcs" width="800" height="322"&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%2F124t9sdw38sk51j10gdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F124t9sdw38sk51j10gdk.png" alt="kvcs" width="800" height="405"&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%2Fo4qhrv4bxqzuaitrj5sq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4qhrv4bxqzuaitrj5sq.png" alt="kvcs" width="800" height="372"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6jldyfv0cmszo0qh1pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6jldyfv0cmszo0qh1pi.png" alt="kvcs" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure &lt;strong&gt;Encryption&lt;/strong&gt; for Storage Account to use &lt;strong&gt;Customer-Managed Keys (CMK)&lt;/strong&gt; in the Key Vault&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Return to storage account -&amp;gt; Security + networking -&amp;gt; Encryption -&amp;gt; Customer-managed keys -&amp;gt; Select a key vault and key -&amp;gt; [select your key vault and key] -&amp;gt; Identity type -&amp;gt; User-assigned -&amp;gt; Select an identity -&amp;gt; [select your managed identity] -&amp;gt; Add -&amp;gt; Save&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0bsdmctj9s84jem5w2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0bsdmctj9s84jem5w2q.png" alt="ENCMK" 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%2Fr4qywmc61phyy67wybyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4qywmc61phyy67wybyp.png" alt="ENCMK" width="800" height="693"&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%2Fhtwf46fiwcr2oxbutc1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtwf46fiwcr2oxbutc1r.png" alt="ENCMK" width="800" height="372"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v8umjiipl17vyd9irn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v8umjiipl17vyd9irn4.png" alt="ENCMK" width="800" height="408"&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%2Fdtl1nqgwx3yf2nxio3fv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtl1nqgwx3yf2nxio3fv.png" alt="ENCMK" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure an &lt;strong&gt;Immutable Policy (Time-based Retention) and Encryption Scope&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage account -&amp;gt; Data storage -&amp;gt; Containers -&amp;gt; Create container -&amp;gt; hold -&amp;gt; Create -&amp;gt; [upload a file] -&amp;gt; Settings -&amp;gt; Access policy -&amp;gt; + Add policy -&amp;gt; Policy type -&amp;gt; time-based retention -&amp;gt; Retention period -&amp;gt; 5 days -&amp;gt; Save -&amp;gt; [try to delete file] -&amp;gt; [verify "failed to delete blobs" message]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6kiblmdaeq4uz6pq07x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6kiblmdaeq4uz6pq07x.png" alt="scope" width="800" height="374"&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%2F4y3c6nf1fl4g9le3ejey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4y3c6nf1fl4g9le3ejey.png" alt="Upload" width="800" height="236"&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%2F1d2xsand1n4f3wkb17br.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1d2xsand1n4f3wkb17br.png" alt="scope" width="800" height="369"&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%2Fcur6zpf4647efwcx34wv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcur6zpf4647efwcx34wv.png" alt="scope" width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and Apply &lt;strong&gt;Encryption Scope&lt;/strong&gt; that enables infrastructure encryption to storage account&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Storage account -&amp;gt; Security + networking -&amp;gt; Encryption -&amp;gt; Encryption scopes -&amp;gt; Add -&amp;gt; Name -&amp;gt; [enter a name] -&amp;gt; Encryption type -&amp;gt; Microsoft-managed key -&amp;gt; Infrastructure encryption -&amp;gt; Enable -&amp;gt; Create -&amp;gt; [return to storage account] -&amp;gt; Create a new container -&amp;gt; Advanced -&amp;gt; Encryption scope -&amp;gt; [select your new scope]&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Clean up resources&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Resource groups -&amp;gt; [select your resource group] -&amp;gt; Delete resource group -&amp;gt; [type the resource group name] -&amp;gt; Delete&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Across these five tasks, we’ve explored how Azure Storage can be tailored to meet a wide range of enterprise needs—from public content delivery and internal document protection to secure app development and departmental file sharing. Each scenario demonstrates how thoughtful configuration—whether through redundancy models like RA-GRS and ZRS, access control via RBAC and managed identities, or data protection features like snapshots, versioning, and immutability—can transform storage from a passive resource into a strategic asset.&lt;/p&gt;

&lt;p&gt;By aligning storage architecture with business goals, security standards, and operational workflows, we not only meet technical requirements—we build solutions that scale, adapt, and protect. Whether you're designing for global reach or internal governance, Azure provides the flexibility and control to do it right.&lt;/p&gt;

</description>
      <category>storage</category>
      <category>azure</category>
      <category>blob</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>🖥️⚙️ Azure VM Provisioning &amp; Web Server Setup: Linux Nginx and Windows IIS Deployment</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Sun, 03 Aug 2025 16:38:54 +0000</pubDate>
      <link>https://forem.com/boye88/azure-vm-provisioning-web-server-setup-linux-nginx-and-windows-iis-deployment-1k2d</link>
      <guid>https://forem.com/boye88/azure-vm-provisioning-web-server-setup-linux-nginx-and-windows-iis-deployment-1k2d</guid>
      <description>&lt;p&gt;This guide outlines a practical, hands-on task involving the provisioning and configuration of Azure Virtual Machines to host two of the most popular web servers in use today. This is a foundational skill for anyone looking to work with cloud infrastructure.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What We'll Be Doing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We'll be setting up two distinct environments to get a feel for managing different server types in the cloud:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linux VM with Nginx:&lt;/strong&gt; We'll provision a Linux-based virtual machine and configure it to run &lt;strong&gt;Nginx&lt;/strong&gt;. Nginx is a lightweight, high-performance web server that is widely used for static sites, reverse proxies, and scalable microservices. You'll learn how to set up and manage a Linux server from scratch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows VM with IIS:&lt;/strong&gt; We'll provision a Windows-based virtual machine and configure it to run &lt;strong&gt;IIS (Internet Information Services)&lt;/strong&gt;. As Microsoft's integrated web server, IIS is the go-to choice for hosting .NET applications, enterprise-level solutions, and internal portals. This will give you experience with the Windows Server ecosystem.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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




&lt;h3&gt;
  
  
  &lt;strong&gt;Why This Matters for Your Career&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Engaging in this task provides a wealth of benefits that directly translate to your career and skill set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-on Mastery:&lt;/strong&gt; You'll gain practical experience with &lt;strong&gt;VM provisioning&lt;/strong&gt;, a core skill for any cloud professional. We'll walk through the process using both the Azure Portal (for a visual approach) and the Azure CLI (for automation and scripting practice).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-Platform Expertise:&lt;/strong&gt; Get comfortable working with both &lt;strong&gt;Linux and Windows server environments&lt;/strong&gt;. In today's diverse tech landscape, being proficient in both is a huge advantage, making you a more versatile and valuable asset to any team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding Cloud Concepts:&lt;/strong&gt; You'll solidify your understanding of fundamental cloud concepts like networking, security groups, public IPs, and remote access—all in a real-world context.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚀 Ready to dive in? Let's get started!
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🧱 Task 1: Installing IIS on an Azure Windows VM&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, log on to the Azure Portal.&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%2F1voe98eztnchc778l4kj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1voe98eztnchc778l4kj.png" alt="Azure Portal" width="800" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we create our VM, we'll start by creating a dedicated &lt;strong&gt;Resource Group&lt;/strong&gt;. This is a logical container that holds related resources for an Azure solution. Using a Resource Group helps with organization, cost management, and lifecycle management of your services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Azure Portal search bar, type &lt;code&gt;Resource Group&lt;/code&gt; and select it from the results.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click + Create to get started.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz5lzxp034qkns36arkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz5lzxp034qkns36arkr.png" alt="step1" width="800" height="299"&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%2Fge49aeldniduht273dgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge49aeldniduht273dgx.png" alt="step2" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subscription&lt;/strong&gt;: Select your Azure subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource group name&lt;/strong&gt;: Enter a descriptive name like &lt;strong&gt;WebServer-RG&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Region&lt;/strong&gt;: Choose a region where you want your resources to be deployed. For this demonstration, we'll use &lt;strong&gt;UK South&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt;. Your new resource group will be ready in a few moments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faryzx0sla4jerxaprabf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faryzx0sla4jerxaprabf.png" alt="step3" width="800" height="634"&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%2Frzis566scto18m9d88pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzis566scto18m9d88pr.png" alt="step4" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the Windows Virtual Machine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that our resource group is ready, let's create the Windows VM within it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Create&lt;/strong&gt; within the &lt;strong&gt;WebServer-RG&lt;/strong&gt; , then type &lt;strong&gt;Virtual Machine&lt;/strong&gt; and select &lt;strong&gt;+ Create &amp;gt; Azure Virtual Machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill out the required parameters:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource group:&lt;/strong&gt; Select the &lt;strong&gt;WebServer-RG&lt;/strong&gt; we just created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual machine name:&lt;/strong&gt; Name your VM, for example, &lt;strong&gt;WindowsVM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Region:&lt;/strong&gt; This should be the same as your resource group's region (&lt;strong&gt;UK South&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image:&lt;/strong&gt; Choose a suitable Windows Server image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size:&lt;/strong&gt; Select a VM size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administrator account:&lt;/strong&gt; Create a username and password for your VM.&lt;/li&gt;
&lt;li&gt;** Set Inbound Traffic to &lt;strong&gt;None&lt;/strong&gt;, as We will configure Network Security Group &lt;strong&gt;NSG&lt;/strong&gt; separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💰 Cost-Saving Tip:&lt;/strong&gt; For this demonstration, you can select the &lt;strong&gt;Azure Spot Discount&lt;/strong&gt; option to get a lower rate. Keep in mind that Spot VMs can be evicted if Azure needs the capacity, so they are not recommended for production workloads.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9pqwl7h2lfvl25alhjq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9pqwl7h2lfvl25alhjq.png" alt="step5" width="800" height="347"&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%2Fqy2b03eoenmnogm9jxny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy2b03eoenmnogm9jxny.png" alt="step6" width="800" height="512"&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%2F4rwmkdsjxzonj0tiyfic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rwmkdsjxzonj0tiyfic.png" alt="step7" width="800" height="644"&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%2Fj17hjr6g3woypeujdzgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj17hjr6g3woypeujdzgh.png" alt="step8" width="783" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Disks, Management &amp;amp; Tags&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disks:&lt;/strong&gt; For this guide, we'll use the default OS disk. We'll add a separate data disk later for best practice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management:&lt;/strong&gt; Disable &lt;strong&gt;Boot diagnostics&lt;/strong&gt; under the &lt;code&gt;Monitoring&lt;/code&gt; tab for more control and privacy over your data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tags:&lt;/strong&gt; Use tags for better resource management. Tags are key-value pairs that help with &lt;strong&gt;cost management&lt;/strong&gt; and &lt;strong&gt;categorization&lt;/strong&gt;. For example:
    - Key: &lt;strong&gt;Department&lt;/strong&gt;
    - Value: &lt;strong&gt;IT&lt;/strong&gt;
    - Key: &lt;strong&gt;Project&lt;/strong&gt;
    - Value: &lt;strong&gt;WebServerDemo&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiifw07bvayi04q4x3uw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiifw07bvayi04q4x3uw4.png" alt="step8" width="764" height="782"&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%2Fdkr3xy1c8v7ruzjtxw0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkr3xy1c8v7ruzjtxw0i.png" alt="step9" width="800" height="630"&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%2Ffewp8jqkg161ep0eqepe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffewp8jqkg161ep0eqepe.png" alt="step10" width="758" height="797"&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%2Ff3vjbxbeda6z5xefvbso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3vjbxbeda6z5xefvbso.png" alt="step11" width="800" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finalize and Create the VM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After reviewing all the settings, click &lt;strong&gt;Review + create&lt;/strong&gt;. Once the validation passes, click &lt;strong&gt;Create&lt;/strong&gt;. The deployment will take a few minutes.&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%2Fismee2osckcy8gcxd63t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fismee2osckcy8gcxd63t.png" alt="step12" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attach and Initialize a Data Disk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Although the &lt;strong&gt;OS disk&lt;/strong&gt; is ready, it's a best practice to keep your web content on a separate &lt;strong&gt;Data disk&lt;/strong&gt;. This makes it easier to manage backups and resize storage independently.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to your new VM's resource page.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, go to &lt;strong&gt;Disks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Create and attach a new disk&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose a size and type for your new disk, then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbk48i21ambuip8kzatd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbk48i21ambuip8kzatd3.png" alt="step13" width="800" height="416"&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%2Fz5pztdb8qx2cpxykxlbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5pztdb8qx2cpxykxlbs.png" alt="step14" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Network Security Group NSG to allow Inbound Traffic&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Networking:&lt;/strong&gt; We will configure inbound ports to allow &lt;strong&gt;RDP (port 3389)&lt;/strong&gt; for remote access and &lt;strong&gt;HTTP (port 80)&lt;/strong&gt; for web traffic.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Connect to the VM and Prepare the Disk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to connect to the VM using RDP to finalize the setup.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the VM's overview page, click &lt;strong&gt;Connect &amp;gt; RDP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for Remote Desktop on Local Machine and connect to &lt;strong&gt;WindowsVM&lt;/strong&gt; using the administrator credentials you created earlier.&lt;/li&gt;
&lt;li&gt;Inside the VM, search for &lt;strong&gt;Disk Management&lt;/strong&gt; in the Start menu.&lt;/li&gt;
&lt;li&gt;You'll see the new disk you just attached. It will be marked as "Not Initialized."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Right-click&lt;/strong&gt; the disk and select &lt;strong&gt;Initialize Disk&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Right-click&lt;/strong&gt; on the unallocated space and select &lt;strong&gt;New Simple Volume&lt;/strong&gt;. Follow the wizard to format the disk and assign it a drive letter.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06tt3txdvhnd54kcsi5y.png" alt="step16" width="800" height="359"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqts782myrkubfy6tua7.png" alt="step17" width="800" height="353"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmc88574pmx86959rpefu.png" alt="step18" width="800" height="657"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnn826tvi4sc382rnmdca.png" alt="step19" width="751" height="604"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99kyxajre6klqgq1nydt.png" alt="step20" width="499" height="396"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq50lu54adb3wvjasccf.png" alt="step21" width="501" height="396"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fveo9snvi0aj3rn35ndjq.png" alt="step22" width="498" height="392"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fie262mn77dyndfatjl9o.png" alt="step23" width="497" height="396"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35dbtya4imy56rod70c2.png" alt="step24" width="497" height="396"&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwj671iy7y8wotzuzgb9h.png" alt="step25" width="755" height="598"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install and Verify IIS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the VM ready, let's install IIS. The easiest way is with PowerShell.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch &lt;strong&gt;PowerShell as an Administrator&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Run the following command to install the web server role and its management tools:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-WindowsFeature Web-Server -IncludeManagementTools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Verify Webserver is running via Power Shell
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoke-WebRequest http://vm-public-ip-address 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once the installation is complete, you can verify it's running from your browser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find the VM's public IP address in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Open a new browser tab and navigate to &lt;code&gt;http://&amp;lt;your-vm-public-ip-address&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should see the default IIS welcome page! This confirms your web server is up and running.&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%2Fba5pibi00iel8vukd1cb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba5pibi00iel8vukd1cb.png" alt="step26" width="800" height="691"&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%2Fy1nycdcp6anyo5ngth63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1nycdcp6anyo5ngth63.png" alt="step27" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🪟 Task 2: Deploying a Web Server (NGINX) on Azure Linux VM via CLI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this section, we’ll provision an Ubuntu Linux VM using &lt;strong&gt;Azure CLI&lt;/strong&gt; and configure it as a web server by &lt;strong&gt;installing Nginx&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt;&lt;br&gt;
To demonstrate automated resource provisioning using Azure CLI and highlight its contrast with GUI-based deployment via the portal. This method offers &lt;strong&gt;transparency&lt;/strong&gt;, &lt;strong&gt;repeatability&lt;/strong&gt;, and &lt;strong&gt;control—skills&lt;/strong&gt; essential for FinOps, DevOps, and security workflows.&lt;/p&gt;

&lt;p&gt;While this guide uses Azure CLI, alternative &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; approaches like &lt;strong&gt;PowerShell, ARM templates, Bicep, and Terraform&lt;/strong&gt; can be used based on team preferences, project scale, and governance requirements.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Azure CLI installed on your local machine: You can follow the official &lt;a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI installation guide&lt;/a&gt; to get it installed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Log on to Azure portal via CLI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch Terminal or VSCode run &lt;code&gt;az login&lt;/code&gt; to connect Azure Portal&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Subscription number&lt;/strong&gt; to be used for the deployment&lt;/li&gt;
&lt;li&gt;This will prompt microsoft authentication in the browser &lt;/li&gt;
&lt;li&gt;Fill in your azure portal credentials to complete log in process&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Create or Use Existing Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the previous task, We created a Resource Group named &lt;strong&gt;WebServer-RG&lt;/strong&gt; which I will be using for the rest of this demonstration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List out existing Resource Group in Azure Account
&lt;code&gt;az group list --output table&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Deploy Azure Linux Virtual Machine (Ubuntu)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;✅ Tip:&lt;/strong&gt; --nsg-rule NONE avoids exposing inbound ports.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create azure vm
az vm create \
  --name LinuxVM \
  --resource-group WebServer-RG \
  --image Ubuntu2204 \
  --size Standard_D2s_v3 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --priority Spot \
  --eviction-policy Deallocate \
  --nsg-rule NONE \
  --tags environment="Development Lab" os="Linux" department="IT Operations" role="Cloud Administrator"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Disable Boot Diagnostics
az vm update --name LinuxVM --resource-group WebServer-RG --set diagnosticsProfile.bootDiagnosticsEnabled=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqtykk5ads071pn9qieu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqtykk5ads071pn9qieu.png" alt="VMCreate" width="800" height="329"&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%2Fs32ho2qybajdqt9filpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs32ho2qybajdqt9filpl.png" alt="vm" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create NSG to allow Inbound Traffic on Port 22(SSH) &amp;amp; Port 80(HTTP)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create NSG rule for SSH and HTTP access
az network nsg rule create --resource-group WebServer-RG --nsg-name LinuxVMNSG --name AllowSSH --protocol Tcp --priority 1000 --destination-port-range 22 --access Allow
az network nsg rule create --resource-group WebServer-RG --nsg-name LinuxVMNSG --name AllowHTTP --protocol Tcp --priority 1001 --destination-port-range 80 --access Allow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ww1qj7owig3aw9qz2oz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ww1qj7owig3aw9qz2oz.png" alt="Port22" width="800" height="275"&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%2Fne0lup5ihiv27j9ezulg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne0lup5ihiv27j9ezulg.png" alt="Port80" width="800" height="293"&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%2F5jyzh2yzn3frwlpf67rz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jyzh2yzn3frwlpf67rz.png" alt="nsg-rules" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Data Disk &amp;amp; Associate New Disk to VM&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create Data Disk and attach it to the VM
az disk create --resource-group WebServer-RG --name DataDisk1 --size-gb 8 --sku Standard_LRS
az vm disk attach --resource-group WebServer-RG --vm-name LinuxVM --name DataDisk1  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nt9kellcizuzy4kav6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nt9kellcizuzy4kav6z.png" alt="createdisk" width="800" height="379"&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%2F68h2t5kt32psgnh3domv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68h2t5kt32psgnh3domv.png" alt="disk" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to VM via Secure Shell (SSH)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the Path where the ssh key is kept, typically would be in &lt;code&gt;/.ssh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Connect to the VM using SSH
ssh -i "file-path-to-ssh-key" azureuser@&amp;lt;vm-public-ip-address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Mount Newly Created Data Disk on VM&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Switch to root user
sudo su

# Mount Disk
&amp;lt;&amp;lt; EOF
sudo fdisk /dev/sdc &amp;lt;&amp;lt; EOL
n
p
1
w
EOL
sudo mkfs.ext4 /dev/sdc1
sudo mkdir /mnt/data
sudo mount /dev/sdc1 /mnt/data
echo '/dev/sdc1 /mnt/data ext4 defaults 0 0' | sudo tee -a /etc/fstab
EOF

# List the disk in Linux VM with df command
df -h

# Show mounted disks
lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Install NGINX on Ubuntu Virtual Machine&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install NGINX on the VM
apt update
apt install -y nginx
systemctl start nginx
systemctl enable nginx

# Check NGINX status
systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06aq6ffwyuvj148cie3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06aq6ffwyuvj148cie3z.png" alt="InstallNGINX" width="800" height="295"&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%2F72f4l1hte5akdbgfbmhf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72f4l1hte5akdbgfbmhf.png" alt="Webserver" width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Up Resources&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Stop the virtual machine
az vm stop --name LinuxVM --resource-group WebServer-RG

# Delete the virtual machine
az vm delete --name LinuxVM --resource-group WebServer-RG --yes --no-wait   

# Clean up the resource group
az group delete --name WebServer-RG --yes --no-wait
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Provisioning web servers across different platforms in Azure isn’t just a technical exercise—it’s a blueprint for cloud fluency. By deploying IIS via the portal and NGINX via CLI, you’ve shown how flexible Azure can be for hybrid workflows, real-world scenarios, and secure architecture.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>virtualmachine</category>
      <category>cloudcomputing</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>🌐 Cloud Computing Basics: 7 Key Concepts You Should Know</title>
      <dc:creator>Francis Adeboye</dc:creator>
      <pubDate>Sat, 02 Aug 2025 07:31:53 +0000</pubDate>
      <link>https://forem.com/boye88/cloud-computing-basics-7-key-concepts-you-should-know-49lj</link>
      <guid>https://forem.com/boye88/cloud-computing-basics-7-key-concepts-you-should-know-49lj</guid>
      <description>&lt;p&gt;Cloud computing has revolutionized how we deploy, manage, and scale services. Whether you're in IT support, aiming for a career in cloud security, or just curious about the landscape—grasping these foundational concepts can sharpen your edge. Let's break them down.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. Virtualization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Virtualization&lt;/strong&gt; is the process of creating a virtual version of something, like a server, storage device, or network. It's the technology that allows multiple &lt;strong&gt;virtual machines (VMs)&lt;/strong&gt; to run on a single physical server, which dramatically optimizes resource usage and provides isolation. Think of it as a single computer being able to run several other computers inside of it, each with its own operating system and applications.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; refers to a system's ability to handle an increased workload by adding more resources. In cloud environments, this typically means you can increase your compute power, storage, or other services to meet growing demand without compromising performance. A good example is a website that can handle a few hundred visitors a day but can also scale up to handle thousands during a flash sale.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Agility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Agility&lt;/strong&gt; is the ability to rapidly respond to change. This could mean releasing new features, patching vulnerabilities, or quickly adjusting your infrastructure. The cloud gives teams the flexibility to experiment and innovate at a much faster pace than traditional on-premises setups. With a few clicks, you can deploy a new environment to test an idea and tear it down just as easily.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. High Availability (HA)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;High Availability&lt;/strong&gt; ensures that systems remain operational with minimal downtime, even when individual components fail. This is achieved through a combination of &lt;strong&gt;redundancy&lt;/strong&gt;, &lt;strong&gt;load balancing&lt;/strong&gt;, and &lt;strong&gt;failover mechanisms&lt;/strong&gt;. If one server goes down, another is ready to take over instantly, ensuring a seamless experience for users.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Fault Tolerance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fault tolerance&lt;/strong&gt; is the ability of a system to continue functioning even when parts of it completely fail. While high availability focuses on recovering quickly, fault-tolerant systems are designed to &lt;strong&gt;avoid downtime altogether&lt;/strong&gt; by duplicating every component. Imagine two identical systems running in parallel—if one fails, the other doesn't skip a beat. This is often more costly but crucial for mission-critical applications where even a moment of downtime is unacceptable.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Global Reach&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Global reach&lt;/strong&gt; means you can deploy applications and services across multiple geographical regions and data centers around the world. This helps improve &lt;strong&gt;latency&lt;/strong&gt; and &lt;strong&gt;user experience&lt;/strong&gt; by placing your services physically closer to your end-users. It also increases availability by distributing your application across different locations, making it more resilient to regional outages.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. Elasticity vs. Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These two terms are often used interchangeably, but there's a key difference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The ability of a system to grow over time in response to increased demand. It's a planned, strategic action.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Elasticity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The ability to &lt;strong&gt;automatically&lt;/strong&gt; adjust resources—scaling up or &lt;strong&gt;scaling down&lt;/strong&gt;—based on fluctuating demand. It's dynamic and reactive.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Think of scalability as a planned increase in your resources to meet anticipated growth, while elasticity is the system's ability to handle unexpected spikes in traffic and then shrink back down to save costs.&lt;/p&gt;




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

&lt;p&gt;These core principles are the building blocks for understanding cloud architecture and will prove invaluable as you dive deeper into areas like &lt;strong&gt;FinOps&lt;/strong&gt; (cloud financial management) and &lt;strong&gt;security&lt;/strong&gt;. Grasping these concepts will help you make smarter design decisions, optimize costs, and build more resilient applications.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>virtualization</category>
    </item>
  </channel>
</rss>
