Desafio 25: Azure Load Balancer (Standard)
45-60 minutos | ~$0.03/h (Standard LB por hora + regras) | Peso no exame: 15-20%
Cenário
A NorthWind Traders é uma empresa de e-commerce lançando uma nova loja virtual. A arquitetura requer um Standard Load Balancer público para a camada web (duas VMs executando Nginx) e um Standard Load Balancer interno para a camada de dados (duas VMs executando PostgreSQL na porta 5432). A camada web deve suportar persistência de sessão para carrinhos de compras, e os administradores precisam de acesso SSH direto a VMs individuais do back-end para solução de problemas via regras de NAT de entrada.
Sua tarefa é implantar ambos os balanceadores de carga, configurar pools de back-end, investigações de integridade, regras de balanceamento de carga, regras de NAT de entrada para SSH e verificar a conectividade de ponta a ponta.
Habilidades do exame abordadas
| Habilidade | Peso |
|---|---|
| Projetar e implementar Azure Load Balancer (Standard SKU) | Alto |
| Configurar pools de back-end (baseado em NIC e baseado em IP) | Alto |
| Configurar investigações de integridade (TCP, HTTP, HTTPS) | Alto |
| Configurar regras de balanceamento de carga | Alto |
| Configurar regras de NAT de entrada | Médio |
| Configurar persistência de sessão (afinidade de IP de origem) | Médio |
| Configurar IP flutuante | Baixo |
Pré-requisitos
- Assinatura do Azure com função de Colaborador
- Azure CLI 2.60+ ou Azure PowerShell Az 12.0+
- Conhecimento básico de TCP/IP, HTTP e conceitos de NSG
Tarefa 1: Criar infraestrutura de rede
Configure a VNet, sub-rede, NSG e prepare o ambiente para os balanceadores de carga.
Azure CLI
# Set variables
RG="rg-northwind-lb"
LOCATION="eastus2"
# Create resource group
az group create --name $RG --location $LOCATION
# Create VNet and subnets
az network vnet create \
--resource-group $RG \
--name vnet-northwind \
--location $LOCATION \
--address-prefixes 10.10.0.0/16 \
--subnet-name snet-web \
--subnet-prefixes 10.10.1.0/24
az network vnet subnet create \
--resource-group $RG \
--vnet-name vnet-northwind \
--name snet-data \
--address-prefixes 10.10.2.0/24
# Create NSG for web tier
az network nsg create \
--resource-group $RG \
--name nsg-web
# Allow HTTP and HTTPS inbound
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-web \
--name AllowHTTP \
--priority 100 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-ranges 80 443 \
--source-address-prefixes "*"
# Critical: Allow Azure Load Balancer health probe source IP
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-web \
--name AllowAzureLoadBalancer \
--priority 110 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-ranges 80 \
--source-address-prefixes 168.63.129.16
# Allow SSH for management
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-web \
--name AllowSSH \
--priority 120 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-ranges 22 \
--source-address-prefixes "*"
# Associate NSG with web subnet
az network vnet subnet update \
--resource-group $RG \
--vnet-name vnet-northwind \
--name snet-web \
--network-security-group nsg-web
Azure PowerShell
# Set variables
$rg = "rg-northwind-lb"
$location = "eastus2"
# Create resource group
New-AzResourceGroup -Name $rg -Location $location
# Create NSG rules
$ruleHTTP = New-AzNetworkSecurityRuleConfig `
-Name "AllowHTTP" `
-Priority 100 `
-Direction Inbound `
-Access Allow `
-Protocol Tcp `
-DestinationPortRange 80,443 `
-SourceAddressPrefix "*" `
-SourcePortRange "*" `
-DestinationAddressPrefix "*"
$ruleProbe = New-AzNetworkSecurityRuleConfig `
-Name "AllowAzureLoadBalancer" `
-Priority 110 `
-Direction Inbound `
-Access Allow `
-Protocol Tcp `
-DestinationPortRange 80 `
-SourceAddressPrefix "168.63.129.16" `
-SourcePortRange "*" `
-DestinationAddressPrefix "*"
$ruleSSH = New-AzNetworkSecurityRuleConfig `
-Name "AllowSSH" `
-Priority 120 `
-Direction Inbound `
-Access Allow `
-Protocol Tcp `
-DestinationPortRange 22 `
-SourceAddressPrefix "*" `
-SourcePortRange "*" `
-DestinationAddressPrefix "*"
# Create NSG
$nsg = New-AzNetworkSecurityGroup `
-ResourceGroupName $rg `
-Location $location `
-Name "nsg-web" `
-SecurityRules $ruleHTTP, $ruleProbe, $ruleSSH
# Create VNet with subnets
$snetWeb = New-AzVirtualNetworkSubnetConfig `
-Name "snet-web" `
-AddressPrefix "10.10.1.0/24" `
-NetworkSecurityGroup $nsg
$snetData = New-AzVirtualNetworkSubnetConfig `
-Name "snet-data" `
-AddressPrefix "10.10.2.0/24"
New-AzVirtualNetwork `
-ResourceGroupName $rg `
-Name "vnet-northwind" `
-Location $location `
-AddressPrefix "10.10.0.0/16" `
-Subnet $snetWeb, $snetData
Portal
- Navegue até Resource groups > Create > nomeie
rg-northwind-lb, região East US 2. - Crie uma VNet chamada
vnet-northwindcom espaço de endereço10.10.0.0/16. - Adicione as sub-redes
snet-web(10.10.1.0/24) esnet-data(10.10.2.0/24). - Crie o NSG
nsg-webcom regras de entrada para HTTP (80/443), origem da investigação de integridade (168.63.129.16 na porta 80) e SSH (22). - Associe o NSG à sub-rede
snet-web.
Tarefa 2: Criar o Standard Load Balancer público
Implante um Standard Load Balancer público para a camada web com um IP público estático com redundância de zona.
Azure CLI
# Create a Standard SKU zone-redundant public IP for the LB frontend
az network public-ip create \
--resource-group $RG \
--name pip-lb-web \
--sku Standard \
--allocation-method Static \
--zone 1 2 3
# Create the public Standard Load Balancer with frontend and backend pool
az network lb create \
--resource-group $RG \
--name lb-web-public \
--sku Standard \
--location $LOCATION \
--frontend-ip-name fe-web-public \
--public-ip-address pip-lb-web \
--backend-pool-name bp-web-nic
Azure PowerShell
# Create public IP
$pip = New-AzPublicIpAddress `
-ResourceGroupName $rg `
-Name "pip-lb-web" `
-Location $location `
-Sku Standard `
-AllocationMethod Static `
-Zone 1, 2, 3
# Create frontend IP configuration
$feConfig = New-AzLoadBalancerFrontendIpConfig `
-Name "fe-web-public" `
-PublicIpAddress $pip
# Create backend address pool
$bePool = New-AzLoadBalancerBackendAddressPoolConfig `
-Name "bp-web-nic"
# Create the load balancer
$lb = New-AzLoadBalancer `
-ResourceGroupName $rg `
-Name "lb-web-public" `
-Location $location `
-Sku Standard `
-FrontendIpConfiguration $feConfig `
-BackendAddressPool $bePool
Portal
- Navegue até Load balancers > Create.
- Defina o SKU como Standard, Tipo como Public, Camada como Regional.
- Crie um novo IP público
pip-lb-web(Standard, Static, Zone-redundant). - Nomeie o frontend
fe-web-public, pool de back-endbp-web-nic. - Selecione Review + create > Create.
Tarefa 3: Configurar investigações de integridade
Crie investigações de integridade HTTP e TCP. A investigação HTTP verifica o endpoint de integridade da aplicação; a investigação TCP valida a conectividade da porta.
Azure CLI
# HTTP health probe for web tier (checks /health endpoint)
az network lb probe create \
--resource-group $RG \
--lb-name lb-web-public \
--name probe-http-web \
--protocol Http \
--port 80 \
--path "/health" \
--interval 5 \
--probe-threshold 2
# TCP health probe (alternative for non-HTTP workloads)
az network lb probe create \
--resource-group $RG \
--lb-name lb-web-public \
--name probe-tcp-fallback \
--protocol Tcp \
--port 80 \
--interval 10 \
--probe-threshold 2
Azure PowerShell
# Get the load balancer
$lb = Get-AzLoadBalancer -ResourceGroupName $rg -Name "lb-web-public"
# Add HTTP health probe
$lb | Add-AzLoadBalancerProbeConfig `
-Name "probe-http-web" `
-Protocol Http `
-Port 80 `
-RequestPath "/health" `
-IntervalInSeconds 5 `
-ProbeCount 2
# Add TCP health probe
$lb | Add-AzLoadBalancerProbeConfig `
-Name "probe-tcp-fallback" `
-Protocol Tcp `
-Port 80 `
-IntervalInSeconds 10 `
-ProbeCount 2
# Save the configuration
$lb | Set-AzLoadBalancer
Portal
- Abra
lb-web-public> Health probes > Add. - Crie
probe-http-web: Protocolo HTTP, Porta 80, Caminho/health, Intervalo 5s, Limite de não íntegro 2. - Crie
probe-tcp-fallback: Protocolo TCP, Porta 80, Intervalo 10s, Limite de não íntegro 2.
Tarefa 4: Configurar regras de balanceamento de carga com persistência de sessão
Crie regras de balanceamento de carga que distribuem tráfego HTTP com persistência de sessão por IP de origem para afinidade do carrinho de compras.
Azure CLI
# LB rule with session persistence (SourceIP for shopping cart sessions)
az network lb rule create \
--resource-group $RG \
--lb-name lb-web-public \
--name rule-http-web \
--protocol Tcp \
--frontend-port 80 \
--backend-port 80 \
--frontend-ip-name fe-web-public \
--backend-pool-name bp-web-nic \
--probe-name probe-http-web \
--idle-timeout 15 \
--load-distribution SourceIP \
--enable-tcp-reset true
# HTTPS rule with default 5-tuple distribution (stateless API)
az network lb rule create \
--resource-group $RG \
--lb-name lb-web-public \
--name rule-https-web \
--protocol Tcp \
--frontend-port 443 \
--backend-port 443 \
--frontend-ip-name fe-web-public \
--backend-pool-name bp-web-nic \
--probe-name probe-http-web \
--idle-timeout 4 \
--load-distribution Default \
--enable-tcp-reset true
Azure PowerShell
$lb = Get-AzLoadBalancer -ResourceGroupName $rg -Name "lb-web-public"
$feConfig = $lb.FrontendIpConfigurations[0]
$bePool = $lb.BackendAddressPools[0]
$probe = $lb.Probes | Where-Object { $_.Name -eq "probe-http-web" }
# Add LB rule with SourceIP session persistence
$lb | Add-AzLoadBalancerRuleConfig `
-Name "rule-http-web" `
-Protocol Tcp `
-FrontendPort 80 `
-BackendPort 80 `
-FrontendIpConfiguration $feConfig `
-BackendAddressPool $bePool `
-Probe $probe `
-IdleTimeoutInMinutes 15 `
-LoadDistribution SourceIP `
-EnableTcpReset
# Add HTTPS rule with default (5-tuple) distribution
$lb | Add-AzLoadBalancerRuleConfig `
-Name "rule-https-web" `
-Protocol Tcp `
-FrontendPort 443 `
-BackendPort 443 `
-FrontendIpConfiguration $feConfig `
-BackendAddressPool $bePool `
-Probe $probe `
-IdleTimeoutInMinutes 4 `
-LoadDistribution Default `
-EnableTcpReset
$lb | Set-AzLoadBalancer
Portal
- Abra
lb-web-public> Load balancing rules > Add. - Crie
rule-http-web: Protocolo TCP, Porta frontend 80, Porta backend 80, Pool de back-endbp-web-nic, Investigação de integridadeprobe-http-web, Persistência de sessão Client IP, Tempo limite de ociosidade 15 min, TCP reset Habilitado. - Crie
rule-https-web: Protocolo TCP, portas 443/443, Persistência de sessão None, Tempo limite de ociosidade 4 min.
Tarefa 5: Configurar regras de NAT de entrada para acesso SSH
Crie regras de NAT de entrada para encaminhar portas frontend exclusivas para SSH (porta 22) em VMs individuais do back-end.
Azure CLI
# Inbound NAT rule for VM1 (frontend port 2201 -> backend port 22)
az network lb inbound-nat-rule create \
--resource-group $RG \
--lb-name lb-web-public \
--name nat-ssh-vm1 \
--protocol Tcp \
--frontend-port 2201 \
--backend-port 22 \
--frontend-ip-name fe-web-public
# Inbound NAT rule for VM2 (frontend port 2202 -> backend port 22)
az network lb inbound-nat-rule create \
--resource-group $RG \
--lb-name lb-web-public \
--name nat-ssh-vm2 \
--protocol Tcp \
--frontend-port 2202 \
--backend-port 22 \
--frontend-ip-name fe-web-public
# Associate NAT rule with VM1 NIC (after VMs are created)
az network nic ip-config inbound-nat-rule add \
--resource-group $RG \
--nic-name nic-web-vm1 \
--ip-config-name ipconfig1 \
--inbound-nat-rule nat-ssh-vm1 \
--lb-name lb-web-public
# Associate NAT rule with VM2 NIC
az network nic ip-config inbound-nat-rule add \
--resource-group $RG \
--nic-name nic-web-vm2 \
--ip-config-name ipconfig1 \
--inbound-nat-rule nat-ssh-vm2 \
--lb-name lb-web-public
Azure PowerShell
$lb = Get-AzLoadBalancer -ResourceGroupName $rg -Name "lb-web-public"
$feConfig = $lb.FrontendIpConfigurations[0]
# Add inbound NAT rules
$lb | Add-AzLoadBalancerInboundNatRuleConfig `
-Name "nat-ssh-vm1" `
-Protocol Tcp `
-FrontendPort 2201 `
-BackendPort 22 `
-FrontendIpConfiguration $feConfig
$lb | Add-AzLoadBalancerInboundNatRuleConfig `
-Name "nat-ssh-vm2" `
-Protocol Tcp `
-FrontendPort 2202 `
-BackendPort 22 `
-FrontendIpConfiguration $feConfig
$lb | Set-AzLoadBalancer
# Associate with VM1 NIC
$nic1 = Get-AzNetworkInterface -ResourceGroupName $rg -Name "nic-web-vm1"
$lb = Get-AzLoadBalancer -ResourceGroupName $rg -Name "lb-web-public"
$natRule1 = $lb.InboundNatRules | Where-Object { $_.Name -eq "nat-ssh-vm1" }
$nic1.IpConfigurations[0].LoadBalancerInboundNatRules.Add($natRule1)
Set-AzNetworkInterface -NetworkInterface $nic1
Portal
- Abra
lb-web-public> Inbound NAT rules > Add. - Crie
nat-ssh-vm1: Tipo Azure virtual machine, VM de destinovm-web-1, IP frontendfe-web-public, Porta frontend 2201, Porta backend 22, Protocolo TCP. - Crie
nat-ssh-vm2: Mesmas configurações, mas Porta frontend 2202, VM de destinovm-web-2.
Tarefa 6: Criar o Standard Load Balancer interno
Implante um balanceador de carga interno para a camada de dados (PostgreSQL) que não é exposto à internet.
Azure CLI
# Create internal Standard Load Balancer
az network lb create \
--resource-group $RG \
--name lb-data-internal \
--sku Standard \
--location $LOCATION \
--frontend-ip-name fe-data-internal \
--vnet-name vnet-northwind \
--subnet snet-data \
--backend-pool-name bp-data-nic
# TCP health probe for PostgreSQL
az network lb probe create \
--resource-group $RG \
--lb-name lb-data-internal \
--name probe-tcp-postgres \
--protocol Tcp \
--port 5432 \
--interval 10 \
--probe-threshold 2
# LB rule for PostgreSQL traffic
az network lb rule create \
--resource-group $RG \
--lb-name lb-data-internal \
--name rule-postgres \
--protocol Tcp \
--frontend-port 5432 \
--backend-port 5432 \
--frontend-ip-name fe-data-internal \
--backend-pool-name bp-data-nic \
--probe-name probe-tcp-postgres \
--idle-timeout 30 \
--load-distribution Default \
--enable-tcp-reset true
# LB rule with floating IP enabled (for cluster listener patterns)
az network lb rule create \
--resource-group $RG \
--lb-name lb-data-internal \
--name rule-cluster-listener \
--protocol Tcp \
--frontend-port 5433 \
--backend-port 5433 \
--frontend-ip-name fe-data-internal \
--backend-pool-name bp-data-nic \
--probe-name probe-tcp-postgres \
--floating-ip true \
--enable-tcp-reset true
Azure PowerShell
# Get the VNet and subnet
$vnet = Get-AzVirtualNetwork -ResourceGroupName $rg -Name "vnet-northwind"
$snetData = $vnet.Subnets | Where-Object { $_.Name -eq "snet-data" }
# Create frontend IP config (internal, private IP)
$feInternal = New-AzLoadBalancerFrontendIpConfig `
-Name "fe-data-internal" `
-Subnet $snetData
# Create backend pool
$bePoolData = New-AzLoadBalancerBackendAddressPoolConfig `
-Name "bp-data-nic"
# Create TCP probe for PostgreSQL
$probePostgres = New-AzLoadBalancerProbeConfig `
-Name "probe-tcp-postgres" `
-Protocol Tcp `
-Port 5432 `
-IntervalInSeconds 10 `
-ProbeCount 2
# Create LB rule
$rulePostgres = New-AzLoadBalancerRuleConfig `
-Name "rule-postgres" `
-Protocol Tcp `
-FrontendPort 5432 `
-BackendPort 5432 `
-FrontendIpConfiguration $feInternal `
-BackendAddressPool $bePoolData `
-Probe $probePostgres `
-IdleTimeoutInMinutes 30 `
-LoadDistribution Default `
-EnableTcpReset
# Create the internal load balancer
New-AzLoadBalancer `
-ResourceGroupName $rg `
-Name "lb-data-internal" `
-Location $location `
-Sku Standard `
-FrontendIpConfiguration $feInternal `
-BackendAddressPool $bePoolData `
-Probe $probePostgres `
-LoadBalancingRule $rulePostgres
Portal
- Navegue até Load balancers > Create.
- Defina o SKU como Standard, Tipo como Internal, Camada como Regional.
- Selecione a VNet
vnet-northwind, Sub-redesnet-data. - Nomeie o frontend
fe-data-internal(atribuição dinâmica de IP privado). - Adicione o pool de back-end
bp-data-nic. - Adicione a investigação de integridade
probe-tcp-postgres(TCP, porta 5432, intervalo 10s). - Adicione a regra
rule-postgres(TCP 5432/5432, tempo limite de ociosidade 30 min).
Quebra & conserta
Estes exercícios simulam configurações incorretas comuns. Diagnostique e corrija cada um.
Cenário 1: Investigação de integridade falhando devido ao caminho incorreto
# Create a probe pointing to a non-existent path
az network lb probe create \
--resource-group $RG \
--lb-name lb-web-public \
--name probe-broken-path \
--protocol Http \
--port 80 \
--path "/healthcheck" \
--interval 5 \
--probe-threshold 2
Sintoma: Todas as VMs do back-end aparecem como não íntegras. Nenhum tráfego é distribuído.
Causa raiz: O caminho da investigação de integridade HTTP /healthcheck não existe nos servidores web. A aplicação expõe seu endpoint de integridade em /health. A investigação recebe HTTP 404, que está fora do intervalo de sucesso 200-399, então todas as instâncias são marcadas como inativas.
Correção: Atualize a investigação para usar o caminho correto:
az network lb probe update \
--resource-group $RG \
--lb-name lb-web-public \
--name probe-broken-path \
--path "/health"
Cenário 2: Incompatibilidade de porta do back-end
# Rule forwards to wrong backend port
az network lb rule create \
--resource-group $RG \
--lb-name lb-web-public \
--name rule-broken-port \
--protocol Tcp \
--frontend-port 80 \
--backend-port 8080 \
--frontend-ip-name fe-web-public \
--backend-pool-name bp-web-nic \
--probe-name probe-http-web
Sintoma: As investigações de integridade passam (verificando a porta 80), mas as conexões dos clientes expiram. A investigação e a regra visam portas de back-end diferentes.
Causa raiz: A regra de balanceamento de carga encaminha o tráfego para a porta de back-end 8080, mas os servidores web escutam na porta 80. O tráfego chega à VM, mas nenhum processo escuta na porta 8080.
Correção: Corrija a porta do back-end:
az network lb rule update \
--resource-group $RG \
--lb-name lb-web-public \
--name rule-broken-port \
--backend-port 80
Cenário 3: Regra de NSG ausente para origem da investigação de integridade (168.63.129.16)
# Remove the health probe allow rule
az network nsg rule delete \
--resource-group $RG \
--nsg-name nsg-web \
--name AllowAzureLoadBalancer
# Add an overly restrictive deny rule
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-web \
--name DenyAllInbound \
--priority 4000 \
--direction Inbound \
--access Deny \
--protocol "*" \
--destination-port-ranges "*" \
--source-address-prefixes "*"
Sintoma: Todas as instâncias do back-end aparecem como não íntegras. A investigação de integridade nunca alcança as VMs.
Causa raiz: As investigações de integridade do Azure Load Balancer originam-se do endereço IP 168.63.129.16. Se o NSG bloquear essa origem, as investigações falham e todas as VMs aparecem como inativas. A tag de serviço AzureLoadBalancer cobre esse IP.
Correção: Readicione a regra de permissão para a origem da investigação:
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-web \
--name AllowAzureLoadBalancer \
--priority 110 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-ranges 80 \
--source-address-prefixes 168.63.129.16

### Azure PowerShell
```powershell
# Delete the entire resource group
Remove-AzResourceGroup -Name "rg-northwind-lb" -Force -AsJob
O Standard Load Balancer custa aproximadamente $0.025/hora mais $0.01/hora por regra, mesmo sem tráfego. A cobrança de processamento de dados é de $0.005/GB. Sempre exclua os recursos de laboratório quando terminar de praticar.
Após alguns minutos, confirme a exclusão:
az group show --name rg-northwind-lb 2>&1 | grep -q "not found" && echo "Deleted" || echo "Still exists"