functions/azure/loadbalancer/Add-LBRule.ps1

function Add-LBRule {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ResourceGroup,
        [Parameter(Mandatory)]
        [string]$LoadBalancerName,
        [Parameter(Mandatory)]
        [int]$FrontendPort,
        [int]$BackendPort = $FrontendPort,
        [string]$FrontendIPConfigName,                  # Standard: Erste Frontend-IP, falls leer
        [string]$BackendPoolName,                       # Standard: Erster Backend-Pool, falls leer
        [ValidateSet('Tcp', 'Udp')]
        [string]$Protocol = 'Tcp',
        [string]$ProbeName = $("LBP-$FrontendPort"),
        [string]$RuleName = $("LBR-$FrontendPort"),
        [ValidateSet('SourceIPProtocol', 'SourceIP', 'Default')]
        [string]$SessionPersistence = 'SourceIPProtocol',
        [int]$IdleTimeoutInMinutes = 30,
        [bool]$FloatingIP = $false,
        [bool]$EnableTcpReset = $true
    )

    $lb = Get-AzLoadBalancer -ResourceGroupName $ResourceGroup -Name $LoadBalancerName

    if (-not $FrontendIPConfigName) {
        $FrontendIPConfigName = $lb.FrontendIpConfigurations[0].Name
    }

    $frontend = $lb.FrontendIpConfigurations | Where-Object { $_.Name -eq $FrontendIPConfigName }
    if (-not $frontend) {
        throw "Frontend IP-Configuration '$FrontendIPConfigName' not found!."
    }

    if (-not $BackendPoolName) {
        $BackendPoolName = $lb.BackendAddressPools[0].Name
    }

    $backend = $lb.BackendAddressPools | Where-Object { $_.Name -eq $BackendPoolName }
    if (-not $backend) {
        throw "Backend-Pool '$BackendPoolName' not found!"
    }

    $probe = $lb.Probes | Where-Object { $_.Name -eq $ProbeName }
    if (-not $probe) {
        $probe = Add-LBHealthProbe -ResourceGroup $ResourceGroup -LoadBalancerName $LoadBalancerName -Port $BackendPort -Protocol $Protocol -ProbeName $ProbeName
        # Re-read the LB to get updated references
        $lb = Get-AzLoadBalancer -ResourceGroupName $ResourceGroup -Name $LoadBalancerName
        $probe = $lb.Probes | Where-Object { $_.Name -eq $ProbeName }
    }

    $existingRule = $lb.LoadBalancingRules | Where-Object { $_.Name -eq $RuleName }
    if ($existingRule) {
        Write-Information "Load Balancer Rule '$RuleName' existiert bereits."
        return
    }

    $rule = New-AzLoadBalancerRuleConfig -Name $RuleName `
        -FrontendIpConfiguration $frontend `
        -BackendAddressPool $backend `
        -Probe $probe `
        -Protocol $Protocol `
        -FrontendPort $FrontendPort `
        -BackendPort $BackendPort `
        -IdleTimeoutInMinutes $IdleTimeoutInMinutes `
        -EnableFloatingIP:$FloatingIP `
        -LoadDistribution $SessionPersistence `
        -EnableTcpReset:$EnableTcpReset

    $lb.LoadBalancingRules.Add($rule)
    return Set-AzLoadBalancer -LoadBalancer $lb
}