Introduction

As organizations scale their cloud environments, infrastructure complexity increases. Deploying virtual networks (VNets) and load balancers with efficiency is key. This ensures high availability, security, and performance. Bicep is Azure’s Infrastructure-as-Code (IaC) language. It makes deployments easier by creating templates that are clear and modular. In this blog, we’ll show you how to deploy a virtual network. We’ll cover setting up subnets, a public load balancer, and an internal load balancer. We will also discuss key network configurations using Bicep.

Why Use Bicep for Networking Deployments?

Bicep provides several advantages when managing networking infrastructure in Azure:

  • Declarative Syntax: Simplifies resource definition compared to JSON-based ARM templates.
  • Modularity: Enables reusable components via modules.
  • Improved Readability: Reduces complexity and enhances maintainability.
  • Integration with CI/CD: Seamlessly integrates with Azure DevOps and GitHub Actions.

Architecture Overview

Our deployment will consist of the following components:

  • A Virtual Network (VNet) with many subnets.
  • A Public Load Balancer for distributing external traffic.
  • An Internal Load Balancer for private traffic distribution.
  • Network Security Groups (NSGs) to control inbound and outbound traffic.
  • A set of Virtual Machines (VMs) behind each load balancer.

Implementing the Bicep Code

We will break down the Bicep implementation into modular components to improve reusability and clarity.

Step 1: Define the Virtual Network and Subnets

param location string = resourceGroup().location
param vnetName string = 'myVNet'
param addressSpace string = '10.1.0.0/16'

param subnetPrefixes array = [
  '10.1.1.0/24'
  '10.1.2.0/24'
]

resource vnet 'Microsoft.Network/virtualNetworks@2024-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [addressSpace]
    }
    subnets: [
      for (i, prefix) in subnetPrefixes: {
        name: 'subnet_${prefix}'
        properties: {
          addressPrefix: string(i)
        }
      }
    ]
  }
}

Step 2: Deploy the Public Load Balancer

param lbName string = 'myPublicLB'
param publicIPName string = 'myPublicIP'

resource publicIP 'Microsoft.Network/publicIPAddresses@2024-05-01' = {
  name: publicIPName
  location: location
  properties: {
    publicIPAllocationMethod: 'Static'
  }
}

resource lb 'Microsoft.Network/loadBalancers@2024-05-01' = {
  name: lbName
  location: location
  properties: {
    frontendIPConfigurations: [{
      name: 'frontendConfig'
      properties: {
        publicIPAddress: {
          id: publicIP.id
        }
      }
    }]
  }
}

Step 3: Deploy the Internal Load Balancer

param internalLBName string = 'myInternalLB'

resource internalLB 'Microsoft.Network/loadBalancers@2024-05-01' = {
  name: internalLBName
  location: location
  properties: {
    frontendIPConfigurations: [{
      name: 'internalFrontendConfig'
      properties: {
        subnet: {
          id: vnet.properties.subnets[1].id
        }
      }
    }]
  }
}

Step 4: Deploy Network Security Groups

param nsgName string = 'myNSG'

resource nsg 'Microsoft.Network/networkSecurityGroups@2024-05-01' = {
  name: nsgName
  location: location
  properties: {
    securityRules: [
      {
        name: 'AllowSSH'
        properties: {
          priority: 1000
          direction: 'Inbound'
          access: 'Allow'
          protocol: 'Tcp'
          sourcePortRange: '*'
          destinationPortRange: '22'
          sourceAddressPrefix: '*'
          destinationAddressPrefix: '*'
        }
      }
    ]
  }
}

Deployment

To deploy the Bicep files, use the Azure CLI:

az deployment group create --resource-group myResourceGroup --template-file main.bicep

Or, integrate it into a CI/CD pipeline with Azure DevOps or GitHub Actions.

Conclusion

Using Bicep to deploy virtual networks and load balancers makes infrastructure management easier. It also enhances maintainability. Using modular components lets you reuse networking definitions in different environments. This ensures both consistency and security. Begin using Bicep for your infrastructure deployments today. It will help you create a more scalable and efficient Azure setup.

Next Steps

  • Explore Bicep Modules to further enhance reusability.
  • Put in place Private Endpoints for extra security.
  • Automate deployments using Azure DevOps Pipelines.

Stay tuned for more Bicep best practices and real-world use cases!