Private/New-CustomAzLoadBalancer.ps1

function Global:New-CustomAzLoadBalancer {
    [CmdletBinding()]
    <#
    .SYNOPSIS
        ...
    .DESCRIPTION
        ...
    #>

    param(        
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceGroupName,        
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceLocation,        
        [Parameter(Mandatory = $true)]
        [string]
        $LoadBalancerName,
        [Parameter(Mandatory = $true)]
        $VMScaleSet,
        [Parameter(Mandatory = $false)]
        [string]
        $FrontEndIpConfigName = "$($VMScaleSet.Name)FrontEnd",
        [Parameter(Mandatory = $false)]
        [string]
        $BackendPoolName = "LB-Backend",
        [Parameter(Mandatory = $true)]
        [string]
        $VirtualNetworkName,
        [Parameter(Mandatory = $true)]
        [string]
        $SubnetName,
        [Parameter(Mandatory = $false)]
        [string]
        $PrivateIpAddress,
        [Parameter(Mandatory = $false)]
        [string]
        $PrivateIpAddressVersion,
        [Parameter(Mandatory = $false)]
        [string]
        $PublicIpAddressName,
        [Parameter(Mandatory = $false)]
        [string]
        $DomainNameLabel,
        [HashTable]
        $Tags
    )
    process {
        $loadBalancer = Get-AzLoadBalancer -ResourceGroupName $ResourceGroupName -Name $LoadBalancerName -ErrorAction SilentlyContinue
        if ($loadBalancer){
            Write-CustomHost -Message "Load Balancer $LoadBalancerName already exists."
            return
        }
        Write-CustomHost -Message "Creating LoadBalancer $LoadBalancerName..."
        $loadBalancer = New-AzLoadBalancer -Name $LoadBalancerName -ResourceGroupName $ResourceGroupName -Location $ResourceLocation -Tag $Tags -Sku Standard

        Write-CustomHost -Message "Getting VirtualNetwork $VirtualNetworkName..."
        $vnet = Get-AzVirtualNetwork -Name $VirtualNetworkName -ResourceGroupName $ResourceGroupName
        Write-CustomHost -Message "Getting SubnetConfiguration $SubnetName..."
        $subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vnet
        $frontEndArgs = @{
            LoadBalancer            = $loadBalancer
            Name                    = $FrontEndIpConfigName
            Subnet                  = $subnet
        }
        Write-CustomHost -Message "Adding FrontEndConfiguration to LoadBalancer $LoadBalancerName..."
        if (-not([string]::IsNullOrEmpty($PrivateIpAddress))) {
            $frontEndArgs.Add("PrivateIpAddress", $PrivateIpAddress)
        }
        if (-not([string]::IsNullOrEmpty($PrivateIpAddressVersion))) {
            $frontEndArgs.Add("PrivateIpAddressVersion", $PrivateIpAddressVersion)
        }
        $loadBalancer = Add-AzLoadBalancerFrontendIpConfig @frontEndArgs
        if (-not([string]::IsNullOrEmpty($PublicIpAddressName))) {
            # Get or create PublicIP
            $publicIP = Get-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $PublicIpAddressName -ErrorAction SilentlyContinue
            if (-not($publicIP)) {
                $publicIP = New-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $PublicIpAddressName -Location $ResourceLocation -DomainNameLabel $DomainNameLabel -AllocationMethod Dynamic
            }     
            $frontEndArgs = @{
                LoadBalancer    = $loadBalancer
                Name            = "$FrontEndIpConfigName-public"
                PublicIpAddress = $publicIP
            }
            Write-CustomHost -Message "Adding PublicIP-FrontEndConfiguration to LoadBalancer $LoadBalancerName..."
            $loadBalancer = Add-AzLoadBalancerFrontendIpConfig @frontEndArgs
        }
        $backendpool = Add-AzLoadBalancerBackendAddressPoolConfig -LoadBalancer $loadBalancer -Name $BackendPoolName
        #Set-AzLoadBalancer -LoadBalancer $loadBalancer | Out-Null

        Write-CustomHost -Message "Updating Load Balancer $LoadBalancerName..."
        $loadBalancer = Set-AzLoadBalancer -LoadBalancer $loadBalancer

        Write-CustomHost -Message "Scale Set needs to be stopped to be able to update the IP Configuration."
        Write-CustomHost -Message "Stopping Scale Set..."
        Stop-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSet.Name -Force | Out-Null

        Write-CustomHost -Message "Creating IPConfiguration..."
        # IPConfig for Scale Set
        $ipConfig = New-AzVmssIpConfig `
            -Name "myIPConfig" `
            -LoadBalancerBackendAddressPoolsId $loadBalancer.BackendAddressPools[0].Id `
            -SubnetId $vnet.Subnets[0].Id

        Write-CustomHost -Message "Adding IPConfiguration to Scale Set $($VMScaleSet.Name)..."
        $VMScaleSet = Add-AzVmssNetworkInterfaceConfiguration -VirtualMachineScaleSet $VMScaleSet -IpConfiguration $ipConfig -Name "Test"

        Write-CustomHost -Message "Updating Scale Set $($VMScaleSet.Name)..."
        Update-AzVmss -ResourceGroupName $ResourceGroupName -VirtualMachineScaleSet $VMScaleSet -VMScaleSetName $VMScaleSet.Name | Out-Null
                
        # Add Health Probes
        # For Each Port in Environments; Protocol TCP, INterval 15 seconds, UNhealthy Threshold = 2
        Write-CustomHost -Message "Starting Scale Set $($VMScaleSet.Name)..."
        Start-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSet.Name | Out-Null
    }    
}