|
| 1 | +--- |
| 2 | +title: Deploy Azure Firewall in Azure Extended Zones |
| 3 | +description: Learn how to deploy Azure Firewall in Azure Extended Zones using ARM templates, including routing configuration, firewall rules, and deployment validation. |
| 4 | +author: svaldesgzz |
| 5 | +ms.author: svaldes |
| 6 | +ms.service: azure-extended-zones |
| 7 | +ms.topic: how-to |
| 8 | +ms.date: 03/27/2026 |
| 9 | +--- |
| 10 | + |
| 11 | +# Deploy Azure Firewall in Azure Extended Zones |
| 12 | + |
| 13 | +In this article, you learn how to deploy **Azure Firewall** in **Azure Extended Zones** using ARM templates. It provides setup instructions, including ARM template snippets and deployment validation steps. |
| 14 | + |
| 15 | +Azure Firewall in Azure Extended Zones behaves the same as Azure Firewall in global Azure regions — same SKUs (Standard and Premium), Firewall Policy and rule collections, autoscaling, and availability. The difference is in the setup and deployment. The firewall and its associated resources are created with an `extendedLocation` property, which places them in the extended zone. |
| 16 | + |
| 17 | +> [!IMPORTANT] |
| 18 | +> Do **not** create the **AzureFirewallSubnet** manually. It is created automatically by the Azure Firewall service during deployment. |
| 19 | +
|
| 20 | +## Prerequisites |
| 21 | + |
| 22 | +- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn). |
| 23 | + |
| 24 | +- Access to an Extended Zone. For more information, see [Request access to an Azure Extended Zone](request-access.md). |
| 25 | + |
| 26 | +## Architecture overview |
| 27 | + |
| 28 | +A typical Azure Firewall deployment in an Extended Zone includes the following resources: |
| 29 | + |
| 30 | +- A virtual network deployed with workload subnets. |
| 31 | +- A public IP address. |
| 32 | +- Azure Firewall associated with the public IP. |
| 33 | +- An optional Firewall Policy with rule collections. |
| 34 | +- A route table that forces traffic through the firewall via a default route. |
| 35 | + |
| 36 | +All resources that belong to the Extended Zone are deployed using the parent Azure region as the `location` and the Extended Zone name as the `extendedLocation`. For example, the **Perth** extended zone uses **Australia East** as the parent region. |
| 37 | + |
| 38 | +## ARM template deployment |
| 39 | + |
| 40 | +Use the following ARM template snippets for your own deployments. All Azure Extended Zone resources should have the same pattern: `location` is set to the parent region and `extendedLocation` specifies the extended zone name. Make sure to replace the parameter values with your own, and keep them consistent across all resources. |
| 41 | + |
| 42 | +```json |
| 43 | +{ |
| 44 | + "location": "<parent-region>", |
| 45 | + "extendedLocation": { "type": "EdgeZone", "name": "<edge-zone-name>" } |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +### Create a virtual network |
| 50 | + |
| 51 | +With the virtual network, create workload subnets only. |
| 52 | +> [!NOTE] |
| 53 | +> Do not include `AzureFirewallSubnet` in the subnets array. Azure Firewall creates and manages this subnet automatically. |
| 54 | +
|
| 55 | +```json |
| 56 | +{ |
| 57 | + "type": "Microsoft.Network/virtualNetworks", |
| 58 | + "apiVersion": "2024-05-01", |
| 59 | + "name": "[parameters('vnetName')]", |
| 60 | + "location": "[parameters('location')]", |
| 61 | + "extendedLocation": { |
| 62 | + "type": "EdgeZone", |
| 63 | + "name": "[parameters('edgeZoneName')]" |
| 64 | + }, |
| 65 | + "properties": { |
| 66 | + "addressSpace": { |
| 67 | + "addressPrefixes": [ "[parameters('vnetAddressPrefix')]" ] |
| 68 | + }, |
| 69 | + "subnets": [ |
| 70 | + { |
| 71 | + "name": "[parameters('workloadSubnetName')]", |
| 72 | + "properties": { |
| 73 | + "addressPrefix": "[parameters('workloadSubnetPrefix')]" |
| 74 | + } |
| 75 | + } |
| 76 | + ] |
| 77 | + } |
| 78 | +} |
| 79 | +``` |
| 80 | + |
| 81 | +### Create a standard public IP |
| 82 | + |
| 83 | +The IP should be Standard SKU with Static allocation method. |
| 84 | + |
| 85 | +```json |
| 86 | +{ |
| 87 | + "type": "Microsoft.Network/publicIPAddresses", |
| 88 | + "apiVersion": "2024-05-01", |
| 89 | + "name": "[parameters('publicIpName')]", |
| 90 | + "location": "[parameters('location')]", |
| 91 | + "extendedLocation": { |
| 92 | + "type": "EdgeZone", |
| 93 | + "name": "[parameters('edgeZoneName')]" |
| 94 | + }, |
| 95 | + "sku": { "name": "Standard" }, |
| 96 | + "properties": { |
| 97 | + "publicIPAllocationMethod": "Static" |
| 98 | + } |
| 99 | +} |
| 100 | +``` |
| 101 | + |
| 102 | +### Create Azure Firewall |
| 103 | + |
| 104 | +Firewall SKU can be either Standard or Premium, depending on your needs. Make sure to associate the public IP created in the previous step, and to attach the Firewall Policy (if applicable) correctly in the ARM template. |
| 105 | + |
| 106 | +We recommend using Firewall Policies to manage firewall rules in a more efficient way, but you can also use classic rules if you prefer. Make sure to attach the Firewall Policy to the firewall in the ARM template. For more information on Firewall Policies and rule collections, see [Azure Firewall Policy overview](/azure/firewall/policy-rule-sets). |
| 107 | + |
| 108 | +```json |
| 109 | +{ |
| 110 | + "type": "Microsoft.Network/azureFirewalls", |
| 111 | + "apiVersion": "2024-05-01", |
| 112 | + "name": "[parameters('firewallName')]", |
| 113 | + "location": "[parameters('location')]", |
| 114 | + "extendedLocation": { |
| 115 | + "type": "EdgeZone", |
| 116 | + "name": "[parameters('edgeZoneName')]" |
| 117 | + }, |
| 118 | + "properties": { |
| 119 | + "sku": { |
| 120 | + "name": "AZFW_VNet", |
| 121 | + "tier": "[parameters('firewallSkuTier')]" |
| 122 | + }, |
| 123 | + "firewallPolicy": { |
| 124 | + "id": "[resourceId('Microsoft.Network/firewallPolicies', parameters('firewallPolicyName'))]" |
| 125 | + }, |
| 126 | + "ipConfigurations": [ |
| 127 | + { |
| 128 | + "name": "ipconfig", |
| 129 | + "properties": { |
| 130 | + "publicIPAddress": { |
| 131 | + "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]" |
| 132 | + }, |
| 133 | + "subnet": { |
| 134 | + "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), 'AzureFirewallSubnet')]" |
| 135 | + } |
| 136 | + } |
| 137 | + } |
| 138 | + ] |
| 139 | + } |
| 140 | +} |
| 141 | +``` |
| 142 | + |
| 143 | +### Configure routing |
| 144 | + |
| 145 | +For the routing, add the following default route **0.0.0.0/0**, **VirtualAppliance** and **firewallPrivateIP** to the properties. Associate the route table to workload subnets. |
| 146 | + |
| 147 | +```json |
| 148 | +{ |
| 149 | + "type": "Microsoft.Network/routeTables", |
| 150 | + "apiVersion": "2024-05-01", |
| 151 | + "name": "[parameters('routeTableName')]", |
| 152 | + "location": "[parameters('location')]", |
| 153 | + "extendedLocation": { |
| 154 | + "type": "EdgeZone", |
| 155 | + "name": "[parameters('edgeZoneName')]" |
| 156 | + }, |
| 157 | + "properties": { |
| 158 | + "routes": [ |
| 159 | + { |
| 160 | + "name": "default-to-firewall", |
| 161 | + "properties": { |
| 162 | + "addressPrefix": "0.0.0.0/0", |
| 163 | + "nextHopType": "VirtualAppliance", |
| 164 | + "nextHopIpAddress": "[parameters('firewallPrivateIp')]" |
| 165 | + } |
| 166 | + } |
| 167 | + ] |
| 168 | + } |
| 169 | +} |
| 170 | +``` |
| 171 | + |
| 172 | +## Validate the deployment |
| 173 | + |
| 174 | +After deploying all resources, verify the following: |
| 175 | + |
| 176 | +1. Resource placement in the intended extended zone: Firewall, Public IP, and Virtual Network should all show the correct Extended Zone. |
| 177 | + |
| 178 | +2. AzureFirewallSubnet creation: after deployment, it should be visible in the virtual network's subnet list. Do not attempt to create it manually, as this may cause deployment conflicts. |
| 179 | + |
| 180 | + |
| 181 | +3. Routing configuration: route table should be associated to workload subnets; 0.0.0.0/0 routes to firewall private IP. |
| 182 | + |
| 183 | + |
| 184 | +4. Firewall rules setup: Firewall Policy (or classic ruleset) should be attached to the firewall and contain the expected rule collections and allow/deny behavior. |
| 185 | + |
| 186 | +5. Traffic flow: test that traffic from workload VMs is correctly processed by the firewall according to the configured rules. If enabled, review firewall logs/hits. |
| 187 | + |
| 188 | + |
| 189 | +## Clean up resources |
| 190 | + |
| 191 | +When no longer needed, delete the resource group and all resources it contains: |
| 192 | + |
| 193 | +1. In the search box at the top of the portal, enter ***myResourceGroup***. Select **myResourceGroup** from the search results. |
| 194 | + |
| 195 | +1. Select **Delete resource group**. |
| 196 | + |
| 197 | +1. In **Delete a resource group**, enter ***myResourceGroup***, and then select **Delete**. |
| 198 | + |
| 199 | +1. Select **Delete** to confirm the deletion of the resource group and all its resources. |
| 200 | + |
| 201 | +## Related content |
| 202 | + |
| 203 | +- [Azure Firewall documentation](/azure/firewall/overview) |
| 204 | +- [Azure Firewall Policy overview](/azure/firewall/policy-rule-sets) |
| 205 | +- [Deploy a virtual machine in an Extended Zone](deploy-vm-portal.md) |
| 206 | +- [Deploy an AKS cluster in an Extended Zone](deploy-aks-cluster.md) |
| 207 | +- [Request access to an Azure Extended Zone](request-access.md) |
| 208 | +- [Frequently asked questions](faq.md) |
0 commit comments