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 FREEFrequently Asked Questions
Resource Management & Conflicts
backendAddressPools or inboundNatRules causes conflicts. Choose either inline definition within the LoadBalancer resource or standalone resources, but not both.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
sku.name to Standard and sku.tier to Global, then reference regional load balancers in backendAddressPools using loadBalancerFrontendIPConfiguration.zones in frontendIPConfigurations (e.g., zones: ["1"]).Gateway) enables traffic inspection scenarios. Configure tunnelInterfaces in backend pools with VXLAN protocol and reference it from consumer load balancers using gatewayLoadBalancer.NAT Configuration
inboundNatPools for VM scale sets to define port ranges. Use inboundNatRules for individual VMs with specific port mappings. They’re mutually exclusive.inboundNatPools with frontendPortRangeStart, frontendPortRangeEnd, and backendPort. The load balancer automatically creates NAT rules for each VM in the scale set.Advanced Configuration
disableOutboundSnat to true in loadBalancingRules and define outboundRules with frontend IPs and backend pools.probes with protocol set to Http, Https, or Tcp. HTTP/HTTPS probes require requestPath.enableFloatingIP to true in load balancing rules for direct server return scenarios where the backend needs to see the original destination IP.idleTimeoutInMinutes in load balancing rules or NAT rules. Examples show 15 minutes as a common value.