Export/Private/Set-LoadBalancerAssociationForScaleSet.ps1
function Global:Set-LoadBalancerAssociationForScaleSet { <# .SYNOPSIS ... .EXAMPLE ... #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string] $ResourceGroupName, [Parameter(Mandatory = $true)] [string] $LoadBalancerName, [Parameter(Mandatory = $true)] [string] $BackendPoolName, [Parameter(Mandatory = $true)] [string] $ScaleSetName ) process { Write-Verbose "Starting association of Load Balancer $LoadBalancerName to Scale Set $ScaleSetName Network Interface..." Write-Verbose "Getting Load Balancer $LoadBalancerName" $LoadBalancer = Get-AzLoadBalancer -ResourceGroupName $ResourceGroupName -Name $LoadBalancerName Write-Verbose "Getting Load Balancer Backend Pool $BackendPoolName" $BackendPool = Get-AzLoadBalancerBackendAddressPoolConfig -LoadBalancer $LoadBalancer -Name $BackendPoolName Write-Verbose "Getting Scale Set $ScaleSetName" $VMScaleSet = Get-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $ScaleSetName $NetworkInterfaceConfig = $VMScaleSet.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0] $Ipconfig = $VMScaleSet.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0] if (-not($Ipconfig.LoadBalancerBackendAddressPools)) { # This is only a helper-variable; the Scale Set already has a NetworkInterface, but initially without LoadBalancerBackendAddressPools # Since it's not possible (or: I don't know how) to create the object for the generic collection manually, we use it as a helper for the first BackendPool $ipconfigBase = New-AzVmssIpConfig -Name $Ipconfig.Name -LoadBalancerBackendAddressPoolsId $BackendPool.Id # Assign created LoadBalancerBackendAddressPool to existing IpConfiguration $Ipconfig.LoadBalancerBackendAddressPools = $ipconfigBase.LoadBalancerBackendAddressPools } else { # Add BackendAddressPool to existing IpConfiguration $ipconfig.LoadBalancerBackendAddressPools.Add($BackendPool.Id); } # Remove the existing NetworkInterfaceConfiguration from the object (because we add basically the same, slightly extended Configuration again) Write-Verbose "Removing existing NetworkInterfaceConfiguration from Scale Set $ScaleSetName" $VMScaleSet = Remove-AzVmssNetworkInterfaceConfiguration -VirtualMachineScaleSet $VMScaleSet -Name $NetworkInterfaceConfig.Name # Add the updated configuration back to the Scale Set-object Write-Verbose "Adding NetworkInterfaceConfiguration from Scale Set $ScaleSetName" $VMScaleSet = Add-AzVmssNetworkInterfaceConfiguration -VirtualMachineScaleSet $VMScaleSet -IpConfiguration $ipConfig -Name $NetworkInterfaceConfig.Name -Primary $true -EnableAcceleratedNetworking # Update the Scale Set Write-Verbose "Scale Set needs to be stopped and started again so that all Instances can be updated and get the new IP Configuration." Write-Verbose "Stopping Scale Set $($VMScaleSet.Name)..." Stop-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSet.Name -Force | Out-Null Write-Verbose "Updating the Scale Set $($VMScaleSet.Name)" Update-AzVmss -ResourceGroupName $ResourceGroupName -VirtualMachineScaleSet $VMScaleSet -VMScaleSetName $VMScaleSet.Name | Out-Null foreach ($instance in Get-AzVmssVM -ResourceGroupName $resourceGroupName -VMScaleSetName $VMScaleSet.Name -ErrorAction SilentlyContinue) { Update-AzVmssInstance -ResourceGroupName $resourceGroupName -VMScaleSetName $VMScaleSet.Name -InstanceId $instance.InstanceID | Out-Null } Write-Verbose "Starting Scale Set $($VMScaleSet.Name)..." Start-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSet.Name | Out-Null } } |