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 four capabilities: traffic distribution with health probes, availability zone placement, Gateway Load Balancer chaining, and outbound connectivity control.

Load balancers reference existing VNets, subnets, and public IPs. Backend pools connect to VMs or VM scale sets. The examples are intentionally small. Combine them with your own network infrastructure and compute resources.

Route traffic with health probes and NAT rules

Most deployments distribute HTTP traffic across backend VMs while providing health checks and direct RDP access to individual instances.

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 loadBalancingRules property defines how traffic flows from the frontend IP to the backend pool. The probes array configures health checks that remove unhealthy VMs from rotation. The inboundNatRules property maps specific frontend ports to individual backend VMs for direct access. The frontendIPConfigurations property places the load balancer in a subnet, while backendAddressPools defines the target VM pool.

Pin frontend IP to an availability zone

Applications requiring zone-specific placement can pin the load balancer’s frontend IP to a single availability zone.

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 the frontend IP configuration restricts placement to a specific availability zone. This requires the Standard SKU, specified in the sku property. Zone pinning reduces cross-zone latency and meets compliance requirements for data residency.

Configure Gateway Load Balancer with tunnel interfaces

Network virtual appliances that inspect or transform traffic use Gateway Load Balancers with VXLAN tunnel interfaces.

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 set to Gateway enables traffic chaining through network virtual appliances. The tunnelInterfaces array in the backend pool defines VXLAN encapsulation parameters: identifier tags traffic flows, port specifies the VXLAN port, and protocol sets the encapsulation method. Traffic flows through the appliances before reaching its final destination.

Control outbound connectivity with explicit SNAT rules

Standard SKU load balancers disable automatic outbound SNAT by default. Outbound rules explicitly define how backend VMs reach the internet.

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 outboundRules property maps backend pools to frontend IPs for outbound traffic. The disableOutboundSnat property on load balancing rules prevents automatic SNAT, requiring explicit outbound rules. This gives you control over which public IPs backend VMs use for internet access.

Beyond these examples

These snippets focus on specific load balancer features: load balancing rules and health probes, availability zone placement and Gateway Load Balancer chaining, and outbound SNAT control. They’re intentionally minimal rather than full networking solutions.

The examples reference pre-existing infrastructure such as VNets, subnets, and public IP addresses, and network virtual appliances for Gateway Load Balancer scenarios. They focus on configuring the load balancer rather than provisioning the surrounding network.

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

  • Inbound NAT pools for VM scale sets
  • Global tier for cross-region load balancing
  • Backend pool sync modes (Automatic vs Manual)
  • Multiple backend pools per rule

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 & Conflicts
Why am I seeing resource deletion conflicts with backend pools or NAT rules?
Mixing inline and standalone resources for backendAddressPools or inboundNatRules causes conflicts. Choose either inline definition within the LoadBalancer resource or standalone resources, but not both.
Can I use both inbound NAT pools and NAT rules on the same load balancer?
No, inboundNatPools and inboundNatRules are mutually exclusive. Use NAT pools for VM scale sets or NAT rules for individual VMs, but not both on the same load balancer.
SKU & Architecture Selection
What's the difference between Basic, Standard, and Gateway SKUs?
Standard SKU supports zones, outbound rules, and global tier. Gateway SKU is for Gateway Load Balancer scenarios with tunnel interfaces. Basic SKU has limited features.
How do I create a cross-region global load balancer?
Set sku.name to Standard and sku.tier to Global, then reference regional load balancers in backendAddressPools using loadBalancerFrontendIPConfiguration.
How do I configure zone redundancy for my load balancer?
Use Standard SKU and specify zones in frontendIPConfigurations (e.g., zones: ["1"]).
What's a Gateway Load Balancer and when should I use it?
Gateway Load Balancer (SKU: Gateway) enables traffic inspection scenarios. Configure tunnelInterfaces in backend pools with VXLAN protocol and reference it from consumer load balancers using gatewayLoadBalancer.
NAT Configuration
When should I use NAT pools versus NAT rules?
Use inboundNatPools for VM scale sets to define port ranges. Use inboundNatRules for individual VMs with specific port mappings. They’re mutually exclusive.
How do I configure inbound NAT for a VM scale set?
Define inboundNatPools with frontendPortRangeStart, frontendPortRangeEnd, and backendPort. The load balancer automatically creates NAT rules for each VM in the scale set.
Advanced Configuration
How do I configure explicit outbound connectivity?
Set disableOutboundSnat to true in loadBalancingRules and define outboundRules with frontend IPs and backend pools.
What health probe protocols are available?
Configure probes with protocol set to Http, Https, or Tcp. HTTP/HTTPS probes require requestPath.
What's floating IP and when should I enable it?
Set enableFloatingIP to true in load balancing rules for direct server return scenarios where the backend needs to see the original destination IP.
How do I configure connection idle timeout?
Set idleTimeoutInMinutes in load balancing rules or NAT rules. Examples show 15 minutes as a common value.

Using a different cloud?

Explore networking guides for other cloud providers: