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 FREEFrequently Asked Questions
Resource Management
NAT Configuration
SKU & Tier Configuration
Two SKU options are available:
- Standard - General-purpose load balancing for most scenarios
- Gateway - For network virtual appliances with tunnel interfaces using VXLAN protocol
loadBalancerFrontendIPConfiguration.High Availability & Zones
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
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).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.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
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”.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.idleTimeoutInMinutes property controls TCP idle timeout. Examples consistently use 15 minutes, which you can adjust based on your application’s connection patterns.