Configure Azure Load Balancers

The azure-native:network:LoadBalancer resource, part of the Pulumi Azure Native provider, defines an Azure Load Balancer that distributes traffic across backend resources using rules, probes, and NAT configurations. This guide focuses on five capabilities: internal load balancing with health probes, availability zone placement, Gateway Load Balancer for traffic inspection, global-tier cross-region distribution, and outbound connectivity rules.

Load balancers reference VNets, subnets, public IPs, and potentially other load balancers for global tier configurations. The examples are intentionally small. Combine them with your own network infrastructure and backend resources.

Configure internal load balancing with health probes

Most internal load balancers distribute HTTP or TCP traffic across backend VMs, using health probes to detect failures and remove unhealthy instances from rotation.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const loadBalancer = new azure_native.network.LoadBalancer("loadBalancer", {
    backendAddressPools: [{
        name: "be-lb",
    }],
    frontendIPConfigurations: [{
        name: "fe-lb",
        subnet: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    inboundNatPools: [],
    inboundNatRules: [{
        backendPort: 3389,
        enableFloatingIP: true,
        enableTcpReset: false,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 3389,
        idleTimeoutInMinutes: 15,
        name: "in-nat-rule",
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    loadBalancerName: "lb",
    loadBalancingRules: [{
        backendAddressPool: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        backendPort: 80,
        enableFloatingIP: true,
        enableTcpReset: false,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 80,
        idleTimeoutInMinutes: 15,
        loadDistribution: azure_native.network.LoadDistribution.Default,
        name: "rulelb",
        probe: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    location: "eastus",
    probes: [{
        intervalInSeconds: 15,
        name: "probe-lb",
        numberOfProbes: 2,
        port: 80,
        probeThreshold: 1,
        protocol: azure_native.network.ProbeProtocol.Http,
        requestPath: "healthcheck.aspx",
    }],
    resourceGroupName: "rg1",
});
import pulumi
import pulumi_azure_native as azure_native

load_balancer = azure_native.network.LoadBalancer("loadBalancer",
    backend_address_pools=[{
        "name": "be-lb",
    }],
    frontend_ip_configurations=[{
        "name": "fe-lb",
        "subnet": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    inbound_nat_pools=[],
    inbound_nat_rules=[{
        "backend_port": 3389,
        "enable_floating_ip": True,
        "enable_tcp_reset": False,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 3389,
        "idle_timeout_in_minutes": 15,
        "name": "in-nat-rule",
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    load_balancer_name="lb",
    load_balancing_rules=[{
        "backend_address_pool": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        "backend_port": 80,
        "enable_floating_ip": True,
        "enable_tcp_reset": False,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 80,
        "idle_timeout_in_minutes": 15,
        "load_distribution": azure_native.network.LoadDistribution.DEFAULT,
        "name": "rulelb",
        "probe": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    location="eastus",
    probes=[{
        "interval_in_seconds": 15,
        "name": "probe-lb",
        "number_of_probes": 2,
        "port": 80,
        "probe_threshold": 1,
        "protocol": azure_native.network.ProbeProtocol.HTTP,
        "request_path": "healthcheck.aspx",
    }],
    resource_group_name="rg1")
package main

import (
	network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := network.NewLoadBalancer(ctx, "loadBalancer", &network.LoadBalancerArgs{
			BackendAddressPools: network.BackendAddressPoolArray{
				&network.BackendAddressPoolArgs{
					Name: pulumi.String("be-lb"),
				},
			},
			FrontendIPConfigurations: network.FrontendIPConfigurationArray{
				&network.FrontendIPConfigurationArgs{
					Name: pulumi.String("fe-lb"),
					Subnet: &network.SubnetTypeArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb"),
					},
				},
			},
			InboundNatPools: network.InboundNatPoolArray{},
			InboundNatRules: network.InboundNatRuleTypeArray{
				&network.InboundNatRuleTypeArgs{
					BackendPort:      pulumi.Int(3389),
					EnableFloatingIP: pulumi.Bool(true),
					EnableTcpReset:   pulumi.Bool(false),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(3389),
					IdleTimeoutInMinutes: pulumi.Int(15),
					Name:                 pulumi.String("in-nat-rule"),
					Protocol:             pulumi.String(network.TransportProtocolTcp),
				},
			},
			LoadBalancerName: pulumi.String("lb"),
			LoadBalancingRules: network.LoadBalancingRuleArray{
				&network.LoadBalancingRuleArgs{
					BackendAddressPool: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
					},
					BackendPort:      pulumi.Int(80),
					EnableFloatingIP: pulumi.Bool(true),
					EnableTcpReset:   pulumi.Bool(false),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(80),
					IdleTimeoutInMinutes: pulumi.Int(15),
					LoadDistribution:     pulumi.String(network.LoadDistributionDefault),
					Name:                 pulumi.String("rulelb"),
					Probe: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb"),
					},
					Protocol: pulumi.String(network.TransportProtocolTcp),
				},
			},
			Location: pulumi.String("eastus"),
			Probes: network.ProbeArray{
				&network.ProbeArgs{
					IntervalInSeconds: pulumi.Int(15),
					Name:              pulumi.String("probe-lb"),
					NumberOfProbes:    pulumi.Int(2),
					Port:              pulumi.Int(80),
					ProbeThreshold:    pulumi.Int(1),
					Protocol:          pulumi.String(network.ProbeProtocolHttp),
					RequestPath:       pulumi.String("healthcheck.aspx"),
				},
			},
			ResourceGroupName: pulumi.String("rg1"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var loadBalancer = new AzureNative.Network.LoadBalancer("loadBalancer", new()
    {
        BackendAddressPools = new[]
        {
            new AzureNative.Network.Inputs.BackendAddressPoolArgs
            {
                Name = "be-lb",
            },
        },
        FrontendIPConfigurations = new[]
        {
            new AzureNative.Network.Inputs.FrontendIPConfigurationArgs
            {
                Name = "fe-lb",
                Subnet = new AzureNative.Network.Inputs.SubnetArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
                },
            },
        },
        InboundNatPools = new[] {},
        InboundNatRules = new[]
        {
            new AzureNative.Network.Inputs.InboundNatRuleArgs
            {
                BackendPort = 3389,
                EnableFloatingIP = true,
                EnableTcpReset = false,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 3389,
                IdleTimeoutInMinutes = 15,
                Name = "in-nat-rule",
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        LoadBalancerName = "lb",
        LoadBalancingRules = new[]
        {
            new AzureNative.Network.Inputs.LoadBalancingRuleArgs
            {
                BackendAddressPool = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                },
                BackendPort = 80,
                EnableFloatingIP = true,
                EnableTcpReset = false,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 80,
                IdleTimeoutInMinutes = 15,
                LoadDistribution = AzureNative.Network.LoadDistribution.Default,
                Name = "rulelb",
                Probe = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
                },
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        Location = "eastus",
        Probes = new[]
        {
            new AzureNative.Network.Inputs.ProbeArgs
            {
                IntervalInSeconds = 15,
                Name = "probe-lb",
                NumberOfProbes = 2,
                Port = 80,
                ProbeThreshold = 1,
                Protocol = AzureNative.Network.ProbeProtocol.Http,
                RequestPath = "healthcheck.aspx",
            },
        },
        ResourceGroupName = "rg1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.LoadBalancer;
import com.pulumi.azurenative.network.LoadBalancerArgs;
import com.pulumi.azurenative.network.inputs.BackendAddressPoolArgs;
import com.pulumi.azurenative.network.inputs.FrontendIPConfigurationArgs;
import com.pulumi.azurenative.network.inputs.SubnetArgs;
import com.pulumi.azurenative.network.inputs.InboundNatRuleArgs;
import com.pulumi.azurenative.network.inputs.SubResourceArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancingRuleArgs;
import com.pulumi.azurenative.network.inputs.ProbeArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var loadBalancer = new LoadBalancer("loadBalancer", LoadBalancerArgs.builder()
            .backendAddressPools(BackendAddressPoolArgs.builder()
                .name("be-lb")
                .build())
            .frontendIPConfigurations(FrontendIPConfigurationArgs.builder()
                .name("fe-lb")
                .subnet(SubnetArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb")
                    .build())
                .build())
            .inboundNatPools()
            .inboundNatRules(InboundNatRuleArgs.builder()
                .backendPort(3389)
                .enableFloatingIP(true)
                .enableTcpReset(false)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(3389)
                .idleTimeoutInMinutes(15)
                .name("in-nat-rule")
                .protocol("Tcp")
                .build())
            .loadBalancerName("lb")
            .loadBalancingRules(LoadBalancingRuleArgs.builder()
                .backendAddressPool(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .backendPort(80)
                .enableFloatingIP(true)
                .enableTcpReset(false)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(80)
                .idleTimeoutInMinutes(15)
                .loadDistribution("Default")
                .name("rulelb")
                .probe(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb")
                    .build())
                .protocol("Tcp")
                .build())
            .location("eastus")
            .probes(ProbeArgs.builder()
                .intervalInSeconds(15)
                .name("probe-lb")
                .numberOfProbes(2)
                .port(80)
                .probeThreshold(1)
                .protocol("Http")
                .requestPath("healthcheck.aspx")
                .build())
            .resourceGroupName("rg1")
            .build());

    }
}
resources:
  loadBalancer:
    type: azure-native:network:LoadBalancer
    properties:
      backendAddressPools:
        - name: be-lb
      frontendIPConfigurations:
        - name: fe-lb
          subnet:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb
      inboundNatPools: []
      inboundNatRules:
        - backendPort: 3389
          enableFloatingIP: true
          enableTcpReset: false
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 3389
          idleTimeoutInMinutes: 15
          name: in-nat-rule
          protocol: Tcp
      loadBalancerName: lb
      loadBalancingRules:
        - backendAddressPool:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          backendPort: 80
          enableFloatingIP: true
          enableTcpReset: false
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 80
          idleTimeoutInMinutes: 15
          loadDistribution: Default
          name: rulelb
          probe:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb
          protocol: Tcp
      location: eastus
      probes:
        - intervalInSeconds: 15
          name: probe-lb
          numberOfProbes: 2
          port: 80
          probeThreshold: 1
          protocol: Http
          requestPath: healthcheck.aspx
      resourceGroupName: rg1

The frontendIPConfigurations property defines the private IP that receives traffic. The loadBalancingRules property maps frontend ports to backend ports, referencing a probe that checks backend health. The probes property defines HTTP health checks against a specific path; backends that fail the check stop receiving traffic. The inboundNatRules property enables direct RDP or SSH access to individual VMs by mapping unique frontend ports to backend ports.

Pin frontend IP to an availability zone

Applications requiring zone-specific placement can pin the frontend IP to a single availability zone, ensuring the load balancer remains available even if other zones fail.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const loadBalancer = new azure_native.network.LoadBalancer("loadBalancer", {
    backendAddressPools: [{
        name: "be-lb",
    }],
    frontendIPConfigurations: [{
        name: "fe-lb",
        subnet: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
        zones: ["1"],
    }],
    inboundNatPools: [],
    inboundNatRules: [{
        backendPort: 3389,
        enableFloatingIP: true,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 3389,
        idleTimeoutInMinutes: 15,
        name: "in-nat-rule",
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    loadBalancerName: "lb",
    loadBalancingRules: [{
        backendAddressPool: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        backendPort: 80,
        enableFloatingIP: true,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 80,
        idleTimeoutInMinutes: 15,
        loadDistribution: azure_native.network.LoadDistribution.Default,
        name: "rulelb",
        probe: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    location: "eastus",
    outboundRules: [],
    probes: [{
        intervalInSeconds: 15,
        name: "probe-lb",
        numberOfProbes: 2,
        port: 80,
        probeThreshold: 1,
        protocol: azure_native.network.ProbeProtocol.Http,
        requestPath: "healthcheck.aspx",
    }],
    resourceGroupName: "rg1",
    sku: {
        name: azure_native.network.LoadBalancerSkuName.Standard,
    },
});
import pulumi
import pulumi_azure_native as azure_native

load_balancer = azure_native.network.LoadBalancer("loadBalancer",
    backend_address_pools=[{
        "name": "be-lb",
    }],
    frontend_ip_configurations=[{
        "name": "fe-lb",
        "subnet": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
        "zones": ["1"],
    }],
    inbound_nat_pools=[],
    inbound_nat_rules=[{
        "backend_port": 3389,
        "enable_floating_ip": True,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 3389,
        "idle_timeout_in_minutes": 15,
        "name": "in-nat-rule",
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    load_balancer_name="lb",
    load_balancing_rules=[{
        "backend_address_pool": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        "backend_port": 80,
        "enable_floating_ip": True,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 80,
        "idle_timeout_in_minutes": 15,
        "load_distribution": azure_native.network.LoadDistribution.DEFAULT,
        "name": "rulelb",
        "probe": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    location="eastus",
    outbound_rules=[],
    probes=[{
        "interval_in_seconds": 15,
        "name": "probe-lb",
        "number_of_probes": 2,
        "port": 80,
        "probe_threshold": 1,
        "protocol": azure_native.network.ProbeProtocol.HTTP,
        "request_path": "healthcheck.aspx",
    }],
    resource_group_name="rg1",
    sku={
        "name": azure_native.network.LoadBalancerSkuName.STANDARD,
    })
package main

import (
	network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := network.NewLoadBalancer(ctx, "loadBalancer", &network.LoadBalancerArgs{
			BackendAddressPools: network.BackendAddressPoolArray{
				&network.BackendAddressPoolArgs{
					Name: pulumi.String("be-lb"),
				},
			},
			FrontendIPConfigurations: network.FrontendIPConfigurationArray{
				&network.FrontendIPConfigurationArgs{
					Name: pulumi.String("fe-lb"),
					Subnet: &network.SubnetTypeArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb"),
					},
					Zones: pulumi.StringArray{
						pulumi.String("1"),
					},
				},
			},
			InboundNatPools: network.InboundNatPoolArray{},
			InboundNatRules: network.InboundNatRuleTypeArray{
				&network.InboundNatRuleTypeArgs{
					BackendPort:      pulumi.Int(3389),
					EnableFloatingIP: pulumi.Bool(true),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(3389),
					IdleTimeoutInMinutes: pulumi.Int(15),
					Name:                 pulumi.String("in-nat-rule"),
					Protocol:             pulumi.String(network.TransportProtocolTcp),
				},
			},
			LoadBalancerName: pulumi.String("lb"),
			LoadBalancingRules: network.LoadBalancingRuleArray{
				&network.LoadBalancingRuleArgs{
					BackendAddressPool: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
					},
					BackendPort:      pulumi.Int(80),
					EnableFloatingIP: pulumi.Bool(true),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(80),
					IdleTimeoutInMinutes: pulumi.Int(15),
					LoadDistribution:     pulumi.String(network.LoadDistributionDefault),
					Name:                 pulumi.String("rulelb"),
					Probe: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb"),
					},
					Protocol: pulumi.String(network.TransportProtocolTcp),
				},
			},
			Location:      pulumi.String("eastus"),
			OutboundRules: network.OutboundRuleArray{},
			Probes: network.ProbeArray{
				&network.ProbeArgs{
					IntervalInSeconds: pulumi.Int(15),
					Name:              pulumi.String("probe-lb"),
					NumberOfProbes:    pulumi.Int(2),
					Port:              pulumi.Int(80),
					ProbeThreshold:    pulumi.Int(1),
					Protocol:          pulumi.String(network.ProbeProtocolHttp),
					RequestPath:       pulumi.String("healthcheck.aspx"),
				},
			},
			ResourceGroupName: pulumi.String("rg1"),
			Sku: &network.LoadBalancerSkuArgs{
				Name: pulumi.String(network.LoadBalancerSkuNameStandard),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var loadBalancer = new AzureNative.Network.LoadBalancer("loadBalancer", new()
    {
        BackendAddressPools = new[]
        {
            new AzureNative.Network.Inputs.BackendAddressPoolArgs
            {
                Name = "be-lb",
            },
        },
        FrontendIPConfigurations = new[]
        {
            new AzureNative.Network.Inputs.FrontendIPConfigurationArgs
            {
                Name = "fe-lb",
                Subnet = new AzureNative.Network.Inputs.SubnetArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
                },
                Zones = new[]
                {
                    "1",
                },
            },
        },
        InboundNatPools = new[] {},
        InboundNatRules = new[]
        {
            new AzureNative.Network.Inputs.InboundNatRuleArgs
            {
                BackendPort = 3389,
                EnableFloatingIP = true,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 3389,
                IdleTimeoutInMinutes = 15,
                Name = "in-nat-rule",
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        LoadBalancerName = "lb",
        LoadBalancingRules = new[]
        {
            new AzureNative.Network.Inputs.LoadBalancingRuleArgs
            {
                BackendAddressPool = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                },
                BackendPort = 80,
                EnableFloatingIP = true,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 80,
                IdleTimeoutInMinutes = 15,
                LoadDistribution = AzureNative.Network.LoadDistribution.Default,
                Name = "rulelb",
                Probe = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
                },
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        Location = "eastus",
        OutboundRules = new[] {},
        Probes = new[]
        {
            new AzureNative.Network.Inputs.ProbeArgs
            {
                IntervalInSeconds = 15,
                Name = "probe-lb",
                NumberOfProbes = 2,
                Port = 80,
                ProbeThreshold = 1,
                Protocol = AzureNative.Network.ProbeProtocol.Http,
                RequestPath = "healthcheck.aspx",
            },
        },
        ResourceGroupName = "rg1",
        Sku = new AzureNative.Network.Inputs.LoadBalancerSkuArgs
        {
            Name = AzureNative.Network.LoadBalancerSkuName.Standard,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.LoadBalancer;
import com.pulumi.azurenative.network.LoadBalancerArgs;
import com.pulumi.azurenative.network.inputs.BackendAddressPoolArgs;
import com.pulumi.azurenative.network.inputs.FrontendIPConfigurationArgs;
import com.pulumi.azurenative.network.inputs.SubnetArgs;
import com.pulumi.azurenative.network.inputs.InboundNatRuleArgs;
import com.pulumi.azurenative.network.inputs.SubResourceArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancingRuleArgs;
import com.pulumi.azurenative.network.inputs.ProbeArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancerSkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var loadBalancer = new LoadBalancer("loadBalancer", LoadBalancerArgs.builder()
            .backendAddressPools(BackendAddressPoolArgs.builder()
                .name("be-lb")
                .build())
            .frontendIPConfigurations(FrontendIPConfigurationArgs.builder()
                .name("fe-lb")
                .subnet(SubnetArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb")
                    .build())
                .zones("1")
                .build())
            .inboundNatPools()
            .inboundNatRules(InboundNatRuleArgs.builder()
                .backendPort(3389)
                .enableFloatingIP(true)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(3389)
                .idleTimeoutInMinutes(15)
                .name("in-nat-rule")
                .protocol("Tcp")
                .build())
            .loadBalancerName("lb")
            .loadBalancingRules(LoadBalancingRuleArgs.builder()
                .backendAddressPool(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .backendPort(80)
                .enableFloatingIP(true)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(80)
                .idleTimeoutInMinutes(15)
                .loadDistribution("Default")
                .name("rulelb")
                .probe(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb")
                    .build())
                .protocol("Tcp")
                .build())
            .location("eastus")
            .outboundRules()
            .probes(ProbeArgs.builder()
                .intervalInSeconds(15)
                .name("probe-lb")
                .numberOfProbes(2)
                .port(80)
                .probeThreshold(1)
                .protocol("Http")
                .requestPath("healthcheck.aspx")
                .build())
            .resourceGroupName("rg1")
            .sku(LoadBalancerSkuArgs.builder()
                .name("Standard")
                .build())
            .build());

    }
}
resources:
  loadBalancer:
    type: azure-native:network:LoadBalancer
    properties:
      backendAddressPools:
        - name: be-lb
      frontendIPConfigurations:
        - name: fe-lb
          subnet:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb
          zones:
            - '1'
      inboundNatPools: []
      inboundNatRules:
        - backendPort: 3389
          enableFloatingIP: true
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 3389
          idleTimeoutInMinutes: 15
          name: in-nat-rule
          protocol: Tcp
      loadBalancerName: lb
      loadBalancingRules:
        - backendAddressPool:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          backendPort: 80
          enableFloatingIP: true
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 80
          idleTimeoutInMinutes: 15
          loadDistribution: Default
          name: rulelb
          probe:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb
          protocol: Tcp
      location: eastus
      outboundRules: []
      probes:
        - intervalInSeconds: 15
          name: probe-lb
          numberOfProbes: 2
          port: 80
          probeThreshold: 1
          protocol: Http
          requestPath: healthcheck.aspx
      resourceGroupName: rg1
      sku:
        name: Standard

The zones property on frontendIPConfigurations pins the frontend to availability zone 1. The sku property must be set to Standard to enable zone support. This configuration provides zone-redundant load balancing while keeping the frontend IP in a specific zone for predictable failure domain isolation.

Configure Gateway Load Balancer with tunnel interfaces

Gateway Load Balancers enable traffic inspection by chaining network virtual appliances, encapsulating traffic in VXLAN tunnels and forwarding it to inspection backends.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const loadBalancer = new azure_native.network.LoadBalancer("loadBalancer", {
    backendAddressPools: [{
        name: "be-lb",
        tunnelInterfaces: [
            {
                identifier: 900,
                port: 15000,
                protocol: azure_native.network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                type: azure_native.network.GatewayLoadBalancerTunnelInterfaceType.Internal,
            },
            {
                identifier: 901,
                port: 15001,
                protocol: azure_native.network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                type: azure_native.network.GatewayLoadBalancerTunnelInterfaceType.Internal,
            },
        ],
    }],
    frontendIPConfigurations: [{
        name: "fe-lb",
        subnet: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    inboundNatPools: [],
    loadBalancerName: "lb",
    loadBalancingRules: [{
        backendAddressPools: [{
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        }],
        backendPort: 0,
        enableFloatingIP: true,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 0,
        idleTimeoutInMinutes: 15,
        loadDistribution: azure_native.network.LoadDistribution.Default,
        name: "rulelb",
        probe: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        protocol: azure_native.network.TransportProtocol.All,
    }],
    location: "eastus",
    outboundRules: [],
    probes: [{
        intervalInSeconds: 15,
        name: "probe-lb",
        numberOfProbes: 2,
        port: 80,
        probeThreshold: 1,
        protocol: azure_native.network.ProbeProtocol.Http,
        requestPath: "healthcheck.aspx",
    }],
    resourceGroupName: "rg1",
    sku: {
        name: azure_native.network.LoadBalancerSkuName.Gateway,
    },
});
import pulumi
import pulumi_azure_native as azure_native

load_balancer = azure_native.network.LoadBalancer("loadBalancer",
    backend_address_pools=[{
        "name": "be-lb",
        "tunnel_interfaces": [
            {
                "identifier": 900,
                "port": 15000,
                "protocol": azure_native.network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                "type": azure_native.network.GatewayLoadBalancerTunnelInterfaceType.INTERNAL,
            },
            {
                "identifier": 901,
                "port": 15001,
                "protocol": azure_native.network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                "type": azure_native.network.GatewayLoadBalancerTunnelInterfaceType.INTERNAL,
            },
        ],
    }],
    frontend_ip_configurations=[{
        "name": "fe-lb",
        "subnet": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    inbound_nat_pools=[],
    load_balancer_name="lb",
    load_balancing_rules=[{
        "backend_address_pools": [{
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        }],
        "backend_port": 0,
        "enable_floating_ip": True,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 0,
        "idle_timeout_in_minutes": 15,
        "load_distribution": azure_native.network.LoadDistribution.DEFAULT,
        "name": "rulelb",
        "probe": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        "protocol": azure_native.network.TransportProtocol.ALL,
    }],
    location="eastus",
    outbound_rules=[],
    probes=[{
        "interval_in_seconds": 15,
        "name": "probe-lb",
        "number_of_probes": 2,
        "port": 80,
        "probe_threshold": 1,
        "protocol": azure_native.network.ProbeProtocol.HTTP,
        "request_path": "healthcheck.aspx",
    }],
    resource_group_name="rg1",
    sku={
        "name": azure_native.network.LoadBalancerSkuName.GATEWAY,
    })
package main

import (
	network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := network.NewLoadBalancer(ctx, "loadBalancer", &network.LoadBalancerArgs{
			BackendAddressPools: network.BackendAddressPoolArray{
				&network.BackendAddressPoolArgs{
					Name: pulumi.String("be-lb"),
					TunnelInterfaces: network.GatewayLoadBalancerTunnelInterfaceArray{
						&network.GatewayLoadBalancerTunnelInterfaceArgs{
							Identifier: pulumi.Int(900),
							Port:       pulumi.Int(15000),
							Protocol:   pulumi.String(network.GatewayLoadBalancerTunnelProtocolVXLAN),
							Type:       pulumi.String(network.GatewayLoadBalancerTunnelInterfaceTypeInternal),
						},
						&network.GatewayLoadBalancerTunnelInterfaceArgs{
							Identifier: pulumi.Int(901),
							Port:       pulumi.Int(15001),
							Protocol:   pulumi.String(network.GatewayLoadBalancerTunnelProtocolVXLAN),
							Type:       pulumi.String(network.GatewayLoadBalancerTunnelInterfaceTypeInternal),
						},
					},
				},
			},
			FrontendIPConfigurations: network.FrontendIPConfigurationArray{
				&network.FrontendIPConfigurationArgs{
					Name: pulumi.String("fe-lb"),
					Subnet: &network.SubnetTypeArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb"),
					},
				},
			},
			InboundNatPools:  network.InboundNatPoolArray{},
			LoadBalancerName: pulumi.String("lb"),
			LoadBalancingRules: network.LoadBalancingRuleArray{
				&network.LoadBalancingRuleArgs{
					BackendAddressPools: network.SubResourceArray{
						&network.SubResourceArgs{
							Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
						},
					},
					BackendPort:      pulumi.Int(0),
					EnableFloatingIP: pulumi.Bool(true),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(0),
					IdleTimeoutInMinutes: pulumi.Int(15),
					LoadDistribution:     pulumi.String(network.LoadDistributionDefault),
					Name:                 pulumi.String("rulelb"),
					Probe: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb"),
					},
					Protocol: pulumi.String(network.TransportProtocolAll),
				},
			},
			Location:      pulumi.String("eastus"),
			OutboundRules: network.OutboundRuleArray{},
			Probes: network.ProbeArray{
				&network.ProbeArgs{
					IntervalInSeconds: pulumi.Int(15),
					Name:              pulumi.String("probe-lb"),
					NumberOfProbes:    pulumi.Int(2),
					Port:              pulumi.Int(80),
					ProbeThreshold:    pulumi.Int(1),
					Protocol:          pulumi.String(network.ProbeProtocolHttp),
					RequestPath:       pulumi.String("healthcheck.aspx"),
				},
			},
			ResourceGroupName: pulumi.String("rg1"),
			Sku: &network.LoadBalancerSkuArgs{
				Name: pulumi.String(network.LoadBalancerSkuNameGateway),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var loadBalancer = new AzureNative.Network.LoadBalancer("loadBalancer", new()
    {
        BackendAddressPools = new[]
        {
            new AzureNative.Network.Inputs.BackendAddressPoolArgs
            {
                Name = "be-lb",
                TunnelInterfaces = new[]
                {
                    new AzureNative.Network.Inputs.GatewayLoadBalancerTunnelInterfaceArgs
                    {
                        Identifier = 900,
                        Port = 15000,
                        Protocol = AzureNative.Network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                        Type = AzureNative.Network.GatewayLoadBalancerTunnelInterfaceType.Internal,
                    },
                    new AzureNative.Network.Inputs.GatewayLoadBalancerTunnelInterfaceArgs
                    {
                        Identifier = 901,
                        Port = 15001,
                        Protocol = AzureNative.Network.GatewayLoadBalancerTunnelProtocol.VXLAN,
                        Type = AzureNative.Network.GatewayLoadBalancerTunnelInterfaceType.Internal,
                    },
                },
            },
        },
        FrontendIPConfigurations = new[]
        {
            new AzureNative.Network.Inputs.FrontendIPConfigurationArgs
            {
                Name = "fe-lb",
                Subnet = new AzureNative.Network.Inputs.SubnetArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
                },
            },
        },
        InboundNatPools = new[] {},
        LoadBalancerName = "lb",
        LoadBalancingRules = new[]
        {
            new AzureNative.Network.Inputs.LoadBalancingRuleArgs
            {
                BackendAddressPools = new[]
                {
                    new AzureNative.Network.Inputs.SubResourceArgs
                    {
                        Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                    },
                },
                BackendPort = 0,
                EnableFloatingIP = true,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 0,
                IdleTimeoutInMinutes = 15,
                LoadDistribution = AzureNative.Network.LoadDistribution.Default,
                Name = "rulelb",
                Probe = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
                },
                Protocol = AzureNative.Network.TransportProtocol.All,
            },
        },
        Location = "eastus",
        OutboundRules = new[] {},
        Probes = new[]
        {
            new AzureNative.Network.Inputs.ProbeArgs
            {
                IntervalInSeconds = 15,
                Name = "probe-lb",
                NumberOfProbes = 2,
                Port = 80,
                ProbeThreshold = 1,
                Protocol = AzureNative.Network.ProbeProtocol.Http,
                RequestPath = "healthcheck.aspx",
            },
        },
        ResourceGroupName = "rg1",
        Sku = new AzureNative.Network.Inputs.LoadBalancerSkuArgs
        {
            Name = AzureNative.Network.LoadBalancerSkuName.Gateway,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.LoadBalancer;
import com.pulumi.azurenative.network.LoadBalancerArgs;
import com.pulumi.azurenative.network.inputs.BackendAddressPoolArgs;
import com.pulumi.azurenative.network.inputs.FrontendIPConfigurationArgs;
import com.pulumi.azurenative.network.inputs.SubnetArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancingRuleArgs;
import com.pulumi.azurenative.network.inputs.SubResourceArgs;
import com.pulumi.azurenative.network.inputs.ProbeArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancerSkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var loadBalancer = new LoadBalancer("loadBalancer", LoadBalancerArgs.builder()
            .backendAddressPools(BackendAddressPoolArgs.builder()
                .name("be-lb")
                .tunnelInterfaces(                
                    GatewayLoadBalancerTunnelInterfaceArgs.builder()
                        .identifier(900)
                        .port(15000)
                        .protocol("VXLAN")
                        .type("Internal")
                        .build(),
                    GatewayLoadBalancerTunnelInterfaceArgs.builder()
                        .identifier(901)
                        .port(15001)
                        .protocol("VXLAN")
                        .type("Internal")
                        .build())
                .build())
            .frontendIPConfigurations(FrontendIPConfigurationArgs.builder()
                .name("fe-lb")
                .subnet(SubnetArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb")
                    .build())
                .build())
            .inboundNatPools()
            .loadBalancerName("lb")
            .loadBalancingRules(LoadBalancingRuleArgs.builder()
                .backendAddressPools(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .backendPort(0)
                .enableFloatingIP(true)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(0)
                .idleTimeoutInMinutes(15)
                .loadDistribution("Default")
                .name("rulelb")
                .probe(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb")
                    .build())
                .protocol("All")
                .build())
            .location("eastus")
            .outboundRules()
            .probes(ProbeArgs.builder()
                .intervalInSeconds(15)
                .name("probe-lb")
                .numberOfProbes(2)
                .port(80)
                .probeThreshold(1)
                .protocol("Http")
                .requestPath("healthcheck.aspx")
                .build())
            .resourceGroupName("rg1")
            .sku(LoadBalancerSkuArgs.builder()
                .name("Gateway")
                .build())
            .build());

    }
}
resources:
  loadBalancer:
    type: azure-native:network:LoadBalancer
    properties:
      backendAddressPools:
        - name: be-lb
          tunnelInterfaces:
            - identifier: 900
              port: 15000
              protocol: VXLAN
              type: Internal
            - identifier: 901
              port: 15001
              protocol: VXLAN
              type: Internal
      frontendIPConfigurations:
        - name: fe-lb
          subnet:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb
      inboundNatPools: []
      loadBalancerName: lb
      loadBalancingRules:
        - backendAddressPools:
            - id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          backendPort: 0
          enableFloatingIP: true
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 0
          idleTimeoutInMinutes: 15
          loadDistribution: Default
          name: rulelb
          probe:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb
          protocol: All
      location: eastus
      outboundRules: []
      probes:
        - intervalInSeconds: 15
          name: probe-lb
          numberOfProbes: 2
          port: 80
          probeThreshold: 1
          protocol: Http
          requestPath: healthcheck.aspx
      resourceGroupName: rg1
      sku:
        name: Gateway

The sku property must be set to Gateway to enable tunnel interface configuration. The tunnelInterfaces property on backendAddressPools defines VXLAN encapsulation parameters: identifier, port, protocol, and type. The loadBalancingRules property uses protocol All and port 0 to forward all traffic types through the inspection chain.

Create global load balancer with regional backends

Global-tier load balancers distribute traffic across regional load balancers in different Azure regions, enabling cross-region failover and geographic distribution.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const loadBalancer = new azure_native.network.LoadBalancer("loadBalancer", {
    backendAddressPools: [{
        loadBalancerBackendAddresses: [{
            loadBalancerFrontendIPConfiguration: {
                id: "/subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb",
            },
            name: "regional-lb1-address",
        }],
        name: "be-lb",
    }],
    frontendIPConfigurations: [{
        name: "fe-lb",
        subnet: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    loadBalancerName: "lb",
    loadBalancingRules: [{
        backendAddressPool: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        backendPort: 80,
        enableFloatingIP: false,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 80,
        idleTimeoutInMinutes: 15,
        loadDistribution: azure_native.network.LoadDistribution.Default,
        name: "rulelb",
        probe: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    location: "eastus",
    probes: [{
        intervalInSeconds: 15,
        name: "probe-lb",
        numberOfProbes: 2,
        port: 80,
        probeThreshold: 1,
        protocol: azure_native.network.ProbeProtocol.Http,
        requestPath: "healthcheck.aspx",
    }],
    resourceGroupName: "rg1",
    sku: {
        name: azure_native.network.LoadBalancerSkuName.Standard,
        tier: azure_native.network.LoadBalancerSkuTier.Global,
    },
});
import pulumi
import pulumi_azure_native as azure_native

load_balancer = azure_native.network.LoadBalancer("loadBalancer",
    backend_address_pools=[{
        "load_balancer_backend_addresses": [{
            "load_balancer_frontend_ip_configuration": {
                "id": "/subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb",
            },
            "name": "regional-lb1-address",
        }],
        "name": "be-lb",
    }],
    frontend_ip_configurations=[{
        "name": "fe-lb",
        "subnet": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
        },
    }],
    load_balancer_name="lb",
    load_balancing_rules=[{
        "backend_address_pool": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        "backend_port": 80,
        "enable_floating_ip": False,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 80,
        "idle_timeout_in_minutes": 15,
        "load_distribution": azure_native.network.LoadDistribution.DEFAULT,
        "name": "rulelb",
        "probe": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    location="eastus",
    probes=[{
        "interval_in_seconds": 15,
        "name": "probe-lb",
        "number_of_probes": 2,
        "port": 80,
        "probe_threshold": 1,
        "protocol": azure_native.network.ProbeProtocol.HTTP,
        "request_path": "healthcheck.aspx",
    }],
    resource_group_name="rg1",
    sku={
        "name": azure_native.network.LoadBalancerSkuName.STANDARD,
        "tier": azure_native.network.LoadBalancerSkuTier.GLOBAL_,
    })
package main

import (
	network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := network.NewLoadBalancer(ctx, "loadBalancer", &network.LoadBalancerArgs{
			BackendAddressPools: network.BackendAddressPoolArray{
				&network.BackendAddressPoolArgs{
					LoadBalancerBackendAddresses: network.LoadBalancerBackendAddressArray{
						&network.LoadBalancerBackendAddressArgs{
							LoadBalancerFrontendIPConfiguration: &network.SubResourceArgs{
								Id: pulumi.String("/subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb"),
							},
							Name: pulumi.String("regional-lb1-address"),
						},
					},
					Name: pulumi.String("be-lb"),
				},
			},
			FrontendIPConfigurations: network.FrontendIPConfigurationArray{
				&network.FrontendIPConfigurationArgs{
					Name: pulumi.String("fe-lb"),
					Subnet: &network.SubnetTypeArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb"),
					},
				},
			},
			LoadBalancerName: pulumi.String("lb"),
			LoadBalancingRules: network.LoadBalancingRuleArray{
				&network.LoadBalancingRuleArgs{
					BackendAddressPool: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
					},
					BackendPort:      pulumi.Int(80),
					EnableFloatingIP: pulumi.Bool(false),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(80),
					IdleTimeoutInMinutes: pulumi.Int(15),
					LoadDistribution:     pulumi.String(network.LoadDistributionDefault),
					Name:                 pulumi.String("rulelb"),
					Probe: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb"),
					},
					Protocol: pulumi.String(network.TransportProtocolTcp),
				},
			},
			Location: pulumi.String("eastus"),
			Probes: network.ProbeArray{
				&network.ProbeArgs{
					IntervalInSeconds: pulumi.Int(15),
					Name:              pulumi.String("probe-lb"),
					NumberOfProbes:    pulumi.Int(2),
					Port:              pulumi.Int(80),
					ProbeThreshold:    pulumi.Int(1),
					Protocol:          pulumi.String(network.ProbeProtocolHttp),
					RequestPath:       pulumi.String("healthcheck.aspx"),
				},
			},
			ResourceGroupName: pulumi.String("rg1"),
			Sku: &network.LoadBalancerSkuArgs{
				Name: pulumi.String(network.LoadBalancerSkuNameStandard),
				Tier: pulumi.String(network.LoadBalancerSkuTierGlobal),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var loadBalancer = new AzureNative.Network.LoadBalancer("loadBalancer", new()
    {
        BackendAddressPools = new[]
        {
            new AzureNative.Network.Inputs.BackendAddressPoolArgs
            {
                LoadBalancerBackendAddresses = new[]
                {
                    new AzureNative.Network.Inputs.LoadBalancerBackendAddressArgs
                    {
                        LoadBalancerFrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                        {
                            Id = "/subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb",
                        },
                        Name = "regional-lb1-address",
                    },
                },
                Name = "be-lb",
            },
        },
        FrontendIPConfigurations = new[]
        {
            new AzureNative.Network.Inputs.FrontendIPConfigurationArgs
            {
                Name = "fe-lb",
                Subnet = new AzureNative.Network.Inputs.SubnetArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb",
                },
            },
        },
        LoadBalancerName = "lb",
        LoadBalancingRules = new[]
        {
            new AzureNative.Network.Inputs.LoadBalancingRuleArgs
            {
                BackendAddressPool = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                },
                BackendPort = 80,
                EnableFloatingIP = false,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 80,
                IdleTimeoutInMinutes = 15,
                LoadDistribution = AzureNative.Network.LoadDistribution.Default,
                Name = "rulelb",
                Probe = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
                },
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        Location = "eastus",
        Probes = new[]
        {
            new AzureNative.Network.Inputs.ProbeArgs
            {
                IntervalInSeconds = 15,
                Name = "probe-lb",
                NumberOfProbes = 2,
                Port = 80,
                ProbeThreshold = 1,
                Protocol = AzureNative.Network.ProbeProtocol.Http,
                RequestPath = "healthcheck.aspx",
            },
        },
        ResourceGroupName = "rg1",
        Sku = new AzureNative.Network.Inputs.LoadBalancerSkuArgs
        {
            Name = AzureNative.Network.LoadBalancerSkuName.Standard,
            Tier = AzureNative.Network.LoadBalancerSkuTier.Global,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.LoadBalancer;
import com.pulumi.azurenative.network.LoadBalancerArgs;
import com.pulumi.azurenative.network.inputs.BackendAddressPoolArgs;
import com.pulumi.azurenative.network.inputs.FrontendIPConfigurationArgs;
import com.pulumi.azurenative.network.inputs.SubnetArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancingRuleArgs;
import com.pulumi.azurenative.network.inputs.SubResourceArgs;
import com.pulumi.azurenative.network.inputs.ProbeArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancerSkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var loadBalancer = new LoadBalancer("loadBalancer", LoadBalancerArgs.builder()
            .backendAddressPools(BackendAddressPoolArgs.builder()
                .loadBalancerBackendAddresses(LoadBalancerBackendAddressArgs.builder()
                    .loadBalancerFrontendIPConfiguration(SubResourceArgs.builder()
                        .id("/subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb")
                        .build())
                    .name("regional-lb1-address")
                    .build())
                .name("be-lb")
                .build())
            .frontendIPConfigurations(FrontendIPConfigurationArgs.builder()
                .name("fe-lb")
                .subnet(SubnetArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb")
                    .build())
                .build())
            .loadBalancerName("lb")
            .loadBalancingRules(LoadBalancingRuleArgs.builder()
                .backendAddressPool(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .backendPort(80)
                .enableFloatingIP(false)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(80)
                .idleTimeoutInMinutes(15)
                .loadDistribution("Default")
                .name("rulelb")
                .probe(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb")
                    .build())
                .protocol("Tcp")
                .build())
            .location("eastus")
            .probes(ProbeArgs.builder()
                .intervalInSeconds(15)
                .name("probe-lb")
                .numberOfProbes(2)
                .port(80)
                .probeThreshold(1)
                .protocol("Http")
                .requestPath("healthcheck.aspx")
                .build())
            .resourceGroupName("rg1")
            .sku(LoadBalancerSkuArgs.builder()
                .name("Standard")
                .tier("Global")
                .build())
            .build());

    }
}
resources:
  loadBalancer:
    type: azure-native:network:LoadBalancer
    properties:
      backendAddressPools:
        - loadBalancerBackendAddresses:
            - loadBalancerFrontendIPConfiguration:
                id: /subscriptions/subid/resourceGroups/regional-lb-rg1/providers/Microsoft.Network/loadBalancers/regional-lb/frontendIPConfigurations/fe-rlb
              name: regional-lb1-address
          name: be-lb
      frontendIPConfigurations:
        - name: fe-lb
          subnet:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnetlb/subnets/subnetlb
      loadBalancerName: lb
      loadBalancingRules:
        - backendAddressPool:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          backendPort: 80
          enableFloatingIP: false
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 80
          idleTimeoutInMinutes: 15
          loadDistribution: Default
          name: rulelb
          probe:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb
          protocol: Tcp
      location: eastus
      probes:
        - intervalInSeconds: 15
          name: probe-lb
          numberOfProbes: 2
          port: 80
          probeThreshold: 1
          protocol: Http
          requestPath: healthcheck.aspx
      resourceGroupName: rg1
      sku:
        name: Standard
        tier: Global

The sku property includes tier set to Global, enabling cross-region load balancing. The loadBalancerBackendAddresses property references regional load balancer frontends instead of individual VMs. Traffic flows from the global load balancer to regional load balancers, which then distribute to local backends.

Control outbound connectivity with explicit rules

Standard SKU load balancers disable default outbound SNAT; outbound rules explicitly define how backend VMs access the internet using frontend public IPs.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const loadBalancer = new azure_native.network.LoadBalancer("loadBalancer", {
    backendAddressPools: [{
        name: "be-lb",
    }],
    frontendIPConfigurations: [{
        name: "fe-lb",
        publicIPAddress: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip",
        },
    }],
    inboundNatPools: [],
    inboundNatRules: [{
        backendPort: 3389,
        enableFloatingIP: true,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 3389,
        idleTimeoutInMinutes: 15,
        name: "in-nat-rule",
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    loadBalancerName: "lb",
    loadBalancingRules: [{
        backendAddressPool: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        backendPort: 80,
        disableOutboundSnat: true,
        enableFloatingIP: true,
        frontendIPConfiguration: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        frontendPort: 80,
        idleTimeoutInMinutes: 15,
        loadDistribution: azure_native.network.LoadDistribution.Default,
        name: "rulelb",
        probe: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        protocol: azure_native.network.TransportProtocol.Tcp,
    }],
    location: "eastus",
    outboundRules: [{
        backendAddressPool: {
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        frontendIPConfigurations: [{
            id: "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        }],
        name: "rule1",
        protocol: azure_native.network.LoadBalancerOutboundRuleProtocol.All,
    }],
    probes: [{
        intervalInSeconds: 15,
        name: "probe-lb",
        numberOfProbes: 2,
        port: 80,
        probeThreshold: 1,
        protocol: azure_native.network.ProbeProtocol.Http,
        requestPath: "healthcheck.aspx",
    }],
    resourceGroupName: "rg1",
    sku: {
        name: azure_native.network.LoadBalancerSkuName.Standard,
    },
});
import pulumi
import pulumi_azure_native as azure_native

load_balancer = azure_native.network.LoadBalancer("loadBalancer",
    backend_address_pools=[{
        "name": "be-lb",
    }],
    frontend_ip_configurations=[{
        "name": "fe-lb",
        "public_ip_address": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip",
        },
    }],
    inbound_nat_pools=[],
    inbound_nat_rules=[{
        "backend_port": 3389,
        "enable_floating_ip": True,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 3389,
        "idle_timeout_in_minutes": 15,
        "name": "in-nat-rule",
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    load_balancer_name="lb",
    load_balancing_rules=[{
        "backend_address_pool": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        "backend_port": 80,
        "disable_outbound_snat": True,
        "enable_floating_ip": True,
        "frontend_ip_configuration": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        },
        "frontend_port": 80,
        "idle_timeout_in_minutes": 15,
        "load_distribution": azure_native.network.LoadDistribution.DEFAULT,
        "name": "rulelb",
        "probe": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
        },
        "protocol": azure_native.network.TransportProtocol.TCP,
    }],
    location="eastus",
    outbound_rules=[{
        "backend_address_pool": {
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
        },
        "frontend_ip_configurations": [{
            "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
        }],
        "name": "rule1",
        "protocol": azure_native.network.LoadBalancerOutboundRuleProtocol.ALL,
    }],
    probes=[{
        "interval_in_seconds": 15,
        "name": "probe-lb",
        "number_of_probes": 2,
        "port": 80,
        "probe_threshold": 1,
        "protocol": azure_native.network.ProbeProtocol.HTTP,
        "request_path": "healthcheck.aspx",
    }],
    resource_group_name="rg1",
    sku={
        "name": azure_native.network.LoadBalancerSkuName.STANDARD,
    })
package main

import (
	network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := network.NewLoadBalancer(ctx, "loadBalancer", &network.LoadBalancerArgs{
			BackendAddressPools: network.BackendAddressPoolArray{
				&network.BackendAddressPoolArgs{
					Name: pulumi.String("be-lb"),
				},
			},
			FrontendIPConfigurations: network.FrontendIPConfigurationArray{
				&network.FrontendIPConfigurationArgs{
					Name: pulumi.String("fe-lb"),
					PublicIPAddress: &network.PublicIPAddressTypeArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip"),
					},
				},
			},
			InboundNatPools: network.InboundNatPoolArray{},
			InboundNatRules: network.InboundNatRuleTypeArray{
				&network.InboundNatRuleTypeArgs{
					BackendPort:      pulumi.Int(3389),
					EnableFloatingIP: pulumi.Bool(true),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(3389),
					IdleTimeoutInMinutes: pulumi.Int(15),
					Name:                 pulumi.String("in-nat-rule"),
					Protocol:             pulumi.String(network.TransportProtocolTcp),
				},
			},
			LoadBalancerName: pulumi.String("lb"),
			LoadBalancingRules: network.LoadBalancingRuleArray{
				&network.LoadBalancingRuleArgs{
					BackendAddressPool: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
					},
					BackendPort:         pulumi.Int(80),
					DisableOutboundSnat: pulumi.Bool(true),
					EnableFloatingIP:    pulumi.Bool(true),
					FrontendIPConfiguration: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
					},
					FrontendPort:         pulumi.Int(80),
					IdleTimeoutInMinutes: pulumi.Int(15),
					LoadDistribution:     pulumi.String(network.LoadDistributionDefault),
					Name:                 pulumi.String("rulelb"),
					Probe: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb"),
					},
					Protocol: pulumi.String(network.TransportProtocolTcp),
				},
			},
			Location: pulumi.String("eastus"),
			OutboundRules: network.OutboundRuleArray{
				&network.OutboundRuleArgs{
					BackendAddressPool: &network.SubResourceArgs{
						Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb"),
					},
					FrontendIPConfigurations: network.SubResourceArray{
						&network.SubResourceArgs{
							Id: pulumi.String("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb"),
						},
					},
					Name:     pulumi.String("rule1"),
					Protocol: pulumi.String(network.LoadBalancerOutboundRuleProtocolAll),
				},
			},
			Probes: network.ProbeArray{
				&network.ProbeArgs{
					IntervalInSeconds: pulumi.Int(15),
					Name:              pulumi.String("probe-lb"),
					NumberOfProbes:    pulumi.Int(2),
					Port:              pulumi.Int(80),
					ProbeThreshold:    pulumi.Int(1),
					Protocol:          pulumi.String(network.ProbeProtocolHttp),
					RequestPath:       pulumi.String("healthcheck.aspx"),
				},
			},
			ResourceGroupName: pulumi.String("rg1"),
			Sku: &network.LoadBalancerSkuArgs{
				Name: pulumi.String(network.LoadBalancerSkuNameStandard),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var loadBalancer = new AzureNative.Network.LoadBalancer("loadBalancer", new()
    {
        BackendAddressPools = new[]
        {
            new AzureNative.Network.Inputs.BackendAddressPoolArgs
            {
                Name = "be-lb",
            },
        },
        FrontendIPConfigurations = new[]
        {
            new AzureNative.Network.Inputs.FrontendIPConfigurationArgs
            {
                Name = "fe-lb",
                PublicIPAddress = new AzureNative.Network.Inputs.PublicIPAddressArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip",
                },
            },
        },
        InboundNatPools = new[] {},
        InboundNatRules = new[]
        {
            new AzureNative.Network.Inputs.InboundNatRuleArgs
            {
                BackendPort = 3389,
                EnableFloatingIP = true,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 3389,
                IdleTimeoutInMinutes = 15,
                Name = "in-nat-rule",
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        LoadBalancerName = "lb",
        LoadBalancingRules = new[]
        {
            new AzureNative.Network.Inputs.LoadBalancingRuleArgs
            {
                BackendAddressPool = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                },
                BackendPort = 80,
                DisableOutboundSnat = true,
                EnableFloatingIP = true,
                FrontendIPConfiguration = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                },
                FrontendPort = 80,
                IdleTimeoutInMinutes = 15,
                LoadDistribution = AzureNative.Network.LoadDistribution.Default,
                Name = "rulelb",
                Probe = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb",
                },
                Protocol = AzureNative.Network.TransportProtocol.Tcp,
            },
        },
        Location = "eastus",
        OutboundRules = new[]
        {
            new AzureNative.Network.Inputs.OutboundRuleArgs
            {
                BackendAddressPool = new AzureNative.Network.Inputs.SubResourceArgs
                {
                    Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb",
                },
                FrontendIPConfigurations = new[]
                {
                    new AzureNative.Network.Inputs.SubResourceArgs
                    {
                        Id = "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb",
                    },
                },
                Name = "rule1",
                Protocol = AzureNative.Network.LoadBalancerOutboundRuleProtocol.All,
            },
        },
        Probes = new[]
        {
            new AzureNative.Network.Inputs.ProbeArgs
            {
                IntervalInSeconds = 15,
                Name = "probe-lb",
                NumberOfProbes = 2,
                Port = 80,
                ProbeThreshold = 1,
                Protocol = AzureNative.Network.ProbeProtocol.Http,
                RequestPath = "healthcheck.aspx",
            },
        },
        ResourceGroupName = "rg1",
        Sku = new AzureNative.Network.Inputs.LoadBalancerSkuArgs
        {
            Name = AzureNative.Network.LoadBalancerSkuName.Standard,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.LoadBalancer;
import com.pulumi.azurenative.network.LoadBalancerArgs;
import com.pulumi.azurenative.network.inputs.BackendAddressPoolArgs;
import com.pulumi.azurenative.network.inputs.FrontendIPConfigurationArgs;
import com.pulumi.azurenative.network.inputs.PublicIPAddressArgs;
import com.pulumi.azurenative.network.inputs.InboundNatRuleArgs;
import com.pulumi.azurenative.network.inputs.SubResourceArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancingRuleArgs;
import com.pulumi.azurenative.network.inputs.OutboundRuleArgs;
import com.pulumi.azurenative.network.inputs.ProbeArgs;
import com.pulumi.azurenative.network.inputs.LoadBalancerSkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var loadBalancer = new LoadBalancer("loadBalancer", LoadBalancerArgs.builder()
            .backendAddressPools(BackendAddressPoolArgs.builder()
                .name("be-lb")
                .build())
            .frontendIPConfigurations(FrontendIPConfigurationArgs.builder()
                .name("fe-lb")
                .publicIPAddress(PublicIPAddressArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip")
                    .build())
                .build())
            .inboundNatPools()
            .inboundNatRules(InboundNatRuleArgs.builder()
                .backendPort(3389)
                .enableFloatingIP(true)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(3389)
                .idleTimeoutInMinutes(15)
                .name("in-nat-rule")
                .protocol("Tcp")
                .build())
            .loadBalancerName("lb")
            .loadBalancingRules(LoadBalancingRuleArgs.builder()
                .backendAddressPool(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .backendPort(80)
                .disableOutboundSnat(true)
                .enableFloatingIP(true)
                .frontendIPConfiguration(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .frontendPort(80)
                .idleTimeoutInMinutes(15)
                .loadDistribution("Default")
                .name("rulelb")
                .probe(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb")
                    .build())
                .protocol("Tcp")
                .build())
            .location("eastus")
            .outboundRules(OutboundRuleArgs.builder()
                .backendAddressPool(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb")
                    .build())
                .frontendIPConfigurations(SubResourceArgs.builder()
                    .id("/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb")
                    .build())
                .name("rule1")
                .protocol("All")
                .build())
            .probes(ProbeArgs.builder()
                .intervalInSeconds(15)
                .name("probe-lb")
                .numberOfProbes(2)
                .port(80)
                .probeThreshold(1)
                .protocol("Http")
                .requestPath("healthcheck.aspx")
                .build())
            .resourceGroupName("rg1")
            .sku(LoadBalancerSkuArgs.builder()
                .name("Standard")
                .build())
            .build());

    }
}
resources:
  loadBalancer:
    type: azure-native:network:LoadBalancer
    properties:
      backendAddressPools:
        - name: be-lb
      frontendIPConfigurations:
        - name: fe-lb
          publicIPAddress:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/publicIPAddresses/pip
      inboundNatPools: []
      inboundNatRules:
        - backendPort: 3389
          enableFloatingIP: true
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 3389
          idleTimeoutInMinutes: 15
          name: in-nat-rule
          protocol: Tcp
      loadBalancerName: lb
      loadBalancingRules:
        - backendAddressPool:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          backendPort: 80
          disableOutboundSnat: true
          enableFloatingIP: true
          frontendIPConfiguration:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          frontendPort: 80
          idleTimeoutInMinutes: 15
          loadDistribution: Default
          name: rulelb
          probe:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/probes/probe-lb
          protocol: Tcp
      location: eastus
      outboundRules:
        - backendAddressPool:
            id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/backendAddressPools/be-lb
          frontendIPConfigurations:
            - id: /subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/loadBalancers/lb/frontendIPConfigurations/fe-lb
          name: rule1
          protocol: All
      probes:
        - intervalInSeconds: 15
          name: probe-lb
          numberOfProbes: 2
          port: 80
          probeThreshold: 1
          protocol: Http
          requestPath: healthcheck.aspx
      resourceGroupName: rg1
      sku:
        name: Standard

The disableOutboundSnat property on loadBalancingRules disables automatic outbound connectivity. The outboundRules property defines explicit outbound behavior: which backend pool uses which frontend IPs for internet access. This gives you control over outbound IP addresses and port allocation for backend VMs.

Beyond these examples

These snippets focus on specific load balancer features: internal and public load balancing, availability zones and global tier, Gateway Load Balancer with tunnel interfaces, and outbound rules and NAT configuration. They’re intentionally minimal rather than full network architectures.

The examples may reference pre-existing infrastructure such as VNets, subnets, public IP addresses, and regional load balancers (for global tier). They focus on configuring the load balancer rather than provisioning the surrounding network.

To keep things focused, common load balancer patterns are omitted, including:

  • Backend pool synchronization modes (syncMode property)
  • Inbound NAT pools for VM scale sets
  • Multiple backend pools per rule
  • Extended location configuration

These omissions are intentional: the goal is to illustrate how each load balancer feature is wired, not provide drop-in networking modules. See the LoadBalancer resource reference for all available configuration options.

Let's configure Azure Load Balancers

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Resource Management
Can I mix inline and standalone resources for backend pools and NAT rules?
No, mixing inline and standalone resources causes conflicts and resource deletion. Choose one approach consistently: either define backend address pools and inbound NAT rules inline within the load balancer resource, or manage them as separate standalone resources.
NAT Configuration
What's the difference between inbound NAT pools and inbound NAT rules?
Inbound NAT pools and rules are mutually exclusive. NAT pools define a port range for VM scale sets (e.g., ports 8080-8085 mapping to backend 8888), while NAT rules define specific port mappings for individual VMs. Use pools for scale sets or rules for individual VMs, but not both on the same load balancer.
SKU & Tier Configuration
What are the SKU options and when should I use each?

Two SKU options are available:

  1. Standard - General-purpose load balancing for most scenarios
  2. Gateway - For network virtual appliances with tunnel interfaces using VXLAN protocol
What's the difference between Regional and Global tier?
Regional tier (default) operates within a single region, while Global tier enables cross-region load balancing. Global tier load balancers can have regional load balancers in their backend pools using loadBalancerFrontendIPConfiguration.
High Availability & Zones
How do I configure zone redundancy for my load balancer?
Set the zones property on frontend IP configurations. For example, zones: ["1"] deploys the frontend IP in availability zone 1. You can specify multiple zones for zone-redundant deployment.
Advanced Features
How do I configure a Gateway Load Balancer for network virtual appliances?
Set sku.name to Gateway and configure tunnelInterfaces on backend pools with VXLAN protocol, unique identifiers (e.g., 900, 901), and ports (e.g., 15000, 15001).
How do I configure custom outbound rules and disable automatic SNAT?
Set disableOutboundSnat to true on load balancing rules, then define explicit outboundRules with backend address pools and frontend IP configurations. This gives you full control over outbound connectivity.
What does enableFloatingIP do and when should I use it?
enableFloatingIP enables direct server return (DSR), where responses go directly from backend to client without passing through the load balancer. Most examples set this to true for better performance.
Health Probes & Monitoring
How do I configure health probes for my backend pool?
Define probes with protocol (Http or Tcp), port, intervalInSeconds, numberOfProbes, and requestPath (for HTTP probes). Examples typically use 15-second intervals with 2 probes checking a health endpoint like “healthcheck.aspx”.
What load distribution algorithms are available?
The loadDistribution property controls the algorithm. Examples use Default, which is a 5-tuple hash (source IP, source port, destination IP, destination port, protocol) for session affinity.
What's the default idle timeout and can I change it?
The idleTimeoutInMinutes property controls TCP idle timeout. Examples consistently use 15 minutes, which you can adjust based on your application’s connection patterns.

Using a different cloud?

Explore networking guides for other cloud providers: