Back to Blog
4 min read

Azure Landing Zones: Enterprise-Scale Cloud Foundation

Azure Landing Zones provide a proven architecture for setting up a scalable, secure, and well-governed Azure environment. Let’s explore how to implement enterprise-scale landing zones.

What Are Landing Zones?

A landing zone is a pre-configured Azure environment that includes:

  • Identity and access management
  • Network topology
  • Security baseline
  • Management and monitoring
  • Governance framework

Landing Zone Architecture

Management Groups
├── Root
│   ├── Platform
│   │   ├── Identity
│   │   ├── Management
│   │   └── Connectivity
│   ├── Landing Zones
│   │   ├── Corp (internal apps)
│   │   └── Online (internet-facing)
│   ├── Sandbox
│   └── Decommissioned

Deploying with Bicep

// management-groups.bicep
targetScope = 'tenant'

param rootManagementGroupId string = 'Contoso'

resource rootMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: rootManagementGroupId
  properties: {
    displayName: 'Contoso Root'
  }
}

resource platformMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-Platform'
  properties: {
    displayName: 'Platform'
    details: {
      parent: {
        id: rootMG.id
      }
    }
  }
}

resource identityMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-Identity'
  properties: {
    displayName: 'Identity'
    details: {
      parent: {
        id: platformMG.id
      }
    }
  }
}

resource connectivityMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-Connectivity'
  properties: {
    displayName: 'Connectivity'
    details: {
      parent: {
        id: platformMG.id
      }
    }
  }
}

resource landingZonesMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-LandingZones'
  properties: {
    displayName: 'Landing Zones'
    details: {
      parent: {
        id: rootMG.id
      }
    }
  }
}

resource corpMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-Corp'
  properties: {
    displayName: 'Corp'
    details: {
      parent: {
        id: landingZonesMG.id
      }
    }
  }
}

resource onlineMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: '${rootManagementGroupId}-Online'
  properties: {
    displayName: 'Online'
    details: {
      parent: {
        id: landingZonesMG.id
      }
    }
  }
}

Hub-Spoke Network Topology

// connectivity/hub-network.bicep
param location string = 'australiaeast'
param hubAddressPrefix string = '10.0.0.0/16'

resource hubVnet 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'vnet-hub-${location}'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [hubAddressPrefix]
    }
    subnets: [
      {
        name: 'GatewaySubnet'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: 'AzureFirewallSubnet'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
      {
        name: 'AzureBastionSubnet'
        properties: {
          addressPrefix: '10.0.2.0/24'
        }
      }
    ]
  }
}

resource firewall 'Microsoft.Network/azureFirewalls@2021-08-01' = {
  name: 'fw-hub-${location}'
  location: location
  properties: {
    sku: {
      name: 'AZFW_VNet'
      tier: 'Standard'
    }
    ipConfigurations: [
      {
        name: 'fw-ipconfig'
        properties: {
          subnet: {
            id: '${hubVnet.id}/subnets/AzureFirewallSubnet'
          }
          publicIPAddress: {
            id: firewallPip.id
          }
        }
      }
    ]
    firewallPolicy: {
      id: firewallPolicy.id
    }
  }
}

resource firewallPolicy 'Microsoft.Network/firewallPolicies@2021-08-01' = {
  name: 'fw-policy-hub'
  location: location
  properties: {
    sku: {
      tier: 'Standard'
    }
    threatIntelMode: 'Alert'
  }
}

resource firewallPip 'Microsoft.Network/publicIPAddresses@2021-08-01' = {
  name: 'pip-fw-hub'
  location: location
  sku: {
    name: 'Standard'
  }
  properties: {
    publicIPAllocationMethod: 'Static'
  }
}

output hubVnetId string = hubVnet.id
output firewallPrivateIp string = firewall.properties.ipConfigurations[0].properties.privateIPAddress

Spoke Network with Peering

// landing-zone/spoke-network.bicep
param location string
param spokeName string
param addressPrefix string
param hubVnetId string
param firewallPrivateIp string

resource spokeVnet 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'vnet-${spokeName}'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [addressPrefix]
    }
    subnets: [
      {
        name: 'default'
        properties: {
          addressPrefix: addressPrefix
          routeTable: {
            id: routeTable.id
          }
        }
      }
    ]
  }
}

resource routeTable 'Microsoft.Network/routeTables@2021-08-01' = {
  name: 'rt-${spokeName}'
  location: location
  properties: {
    routes: [
      {
        name: 'default-via-firewall'
        properties: {
          addressPrefix: '0.0.0.0/0'
          nextHopType: 'VirtualAppliance'
          nextHopIpAddress: firewallPrivateIp
        }
      }
    ]
  }
}

resource peeringToHub 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2021-08-01' = {
  parent: spokeVnet
  name: 'peer-to-hub'
  properties: {
    remoteVirtualNetwork: {
      id: hubVnetId
    }
    allowVirtualNetworkAccess: true
    allowForwardedTraffic: true
    useRemoteGateways: true
  }
}

Policy Assignments for Landing Zones

// governance/policy-assignments.bicep
targetScope = 'managementGroup'

param managementGroupId string

resource denyPublicIp 'Microsoft.Authorization/policyAssignments@2021-06-01' = {
  name: 'deny-public-ip'
  properties: {
    displayName: 'Deny Public IP Addresses'
    policyDefinitionId: '/providers/Microsoft.Authorization/policyDefinitions/83a86a26-fd1f-447c-b59d-e51f44264114'
    enforcementMode: 'Default'
  }
}

resource requireTags 'Microsoft.Authorization/policyAssignments@2021-06-01' = {
  name: 'require-tags'
  properties: {
    displayName: 'Require Tags on Resources'
    policyDefinitionId: '/providers/Microsoft.Authorization/policyDefinitions/871b6d14-10aa-478d-b590-94f262ecfa99'
    parameters: {
      tagName: {
        value: 'costCenter'
      }
    }
  }
}

Azure Landing Zones provide the foundation for a successful enterprise cloud journey, ensuring consistency, security, and governance from day one.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.