Создайте соединение «точка-сеть» для всех слотов веб-приложений с помощью PowerShell.

Я следую инструкциям здесь https://azure.microsoft.com/pl-pl/documentation/articles/app-service-vnet-integration-powershell/, где у меня есть сценарий, который позволяет мне подключать несколько веб-приложений к виртуальной сети.

Проблема в том, что в наших веб-приложениях мало слотов для развертывания, и когда этот скрипт запускается, он обновляет только текущий слот. Мне не удалось получить веб-приложение из другого слота по имени, а также я не вижу ни одного параметра, который применил бы мою конфигурацию ко всем слотам.

Скрипт для справки:

function ConnectWebAppWithVNet()
{
    param(
            $SubscriptionId,
            $VNetResourceGroupName,
            $AppResourceGroupName,
            $WebAppName,
            $VNetName,
            $GatewayName,
            $P2SRootCertName2,
            $MyP2SCertPubKeyBase64_2
    )
    $webApp = Get-AzureRmResource -ResourceName $WebAppName -ResourceType "Microsoft.Web/sites" -ApiVersion 2015-08-01 -ResourceGroupName $AppResourceGroupName
    $location = $webApp.Location

    $vnet = Get-AzureRmVirtualNetwork -name $VNetName -ResourceGroupName $VNetResourceGroupName

    $gateway = Get-AzureRmVirtualNetworkGateway -ResourceGroupName $vnet.ResourceGroupName -Name $GatewayName

    # validate gateway types, etc.
    if($gateway.GatewayType -ne "Vpn")
    {
        Write-Error "This gateway is not of the Vpn type. It cannot be joined to an App."
        return
    }

    if($gateway.VpnType -ne "RouteBased")
    {
        Write-Error "This gateways Vpn type is not RouteBased. It cannot be joined to an App."
        return
    }

    if($gateway.VpnClientConfiguration -eq $null -or $gateway.VpnClientConfiguration.VpnClientAddressPool -eq $null)
    {
        Write-Host "This gateway does not have a Point-to-site Address Range. Please specify one in CIDR notation, e.g. 10.0.0.0/8"
        return
    }

    Write-Host "Creating App association to VNET"
    $propertiesObject = @{
     "vnetResourceId" = "/subscriptions/$($subscriptionId)/resourceGroups/$($vnet.ResourceGroupName)/providers/Microsoft.Network/virtualNetworks/$($vnetName)"
    }

    $virtualNetwork = New-AzureRmResource -Location $location -Properties $propertiesObject -ResourceName "$($webAppName)/$($vnet.Name)" -ResourceType "Microsoft.Web/sites/virtualNetworkConnections" -ApiVersion 2015-08-01 -ResourceGroupName $AppResourceGroupName -Force

    # We need to check if the certificate here exists in the gateway.
    $certificates = $gateway.VpnClientConfiguration.VpnClientRootCertificates

    $certFound = $false
    foreach($certificate in $certificates)
    {
        if($certificate.PublicCertData -eq $virtualNetwork.Properties.CertBlob)
        {
            $certFound = $true
            break
        }
    }

    if(-not $certFound)
    {
        Write-Host "Adding certificate"
        Add-AzureRmVpnClientRootCertificate -ResourceGroupName $VNetResourceGroupName -VpnClientRootCertificateName "AppServiceCertificate.cer" -PublicCertData $virtualNetwork.Properties.CertBlob -VirtualNetworkGatewayName $gateway.Name
    }

    # Now finish joining by getting the VPN package and giving it to the App
    Write-Host "Retrieving VPN Package and supplying to App"
    $packageUri = Get-AzureRmVpnClientPackage -ResourceGroupName $vnet.ResourceGroupName -VirtualNetworkGatewayName $gateway.Name -ProcessorArchitecture Amd64

    # Put the VPN client configuration package onto the App
    $PropertiesObject = @{
    "vnetName" = $vnet.Name; "vpnPackageUri" = $packageUri
    }

    New-AzureRmResource -Location $location -Properties $propertiesObject -ResourceName "$($webAppName)/$($vnet.Name)/primary" -ResourceType "Microsoft.Web/sites/virtualNetworkConnections/gateways" -ApiVersion 2015-08-01 -ResourceGroupName $AppResourceGroupName -Force

    Write-Host "Finished!"
}

person Tomasz Gawlik    schedule 01.07.2016    source источник
comment
Вам удалось это решить? У меня такая же проблема.   -  person Kenneth    schedule 11.08.2016
comment
@Kenneth Я описал свою ситуацию в ответ сейчас   -  person Tomasz Gawlik    schedule 13.08.2016


Ответы (2)


Если ваше веб-приложение уже подключено к VPN, есть способ подключить и его слот.

$webAppName = "name_of_app_service"
$resourceGroup = "name_of_resource_group"
$vnetName = "name_of_vnet"
$slotName = "staging"


$resName = $webAppName + "/" + $slotName
$WebAppConfig = Get-AzureRmResource -ResourceGroupName $resourceGroup -ResourceType Microsoft.Web/sites/slots/config -ResourceName $resName -ApiVersion 2016-08-01
$WebAppConfig.Properties.vnetName = $vnetName
Set-AzureRmResource -ResourceId $WebAppConfig.ResourceId -Properties $WebAppConfig.Properties -ApiVersion 2016-08-01 # -Force
person Andrzej Martyna    schedule 27.08.2018
comment
Именно то, что я искал, и это сработало отлично, спасибо! - person Kris; 19.07.2019

Мне удалось получить помощь от службы поддержки Azure, и мы обнаружили проблему:

Я создал дополнительный слот без клонирования настроек конфигурации из основного слота. Если этот параметр будет выбран, дополнительный слот будет подключен автоматически. В моем случае я не мог воссоздать слот, поэтому мне нужно было вручную подключить дополнительный слот после замены.

person Tomasz Gawlik    schedule 13.08.2016
comment
У меня был слот с включенным клонированием настроек конфигурации, но соединение не копировалось автоматически. Я предоставил новый ответ с методом подключения слота (без замены). - person Andrzej Martyna; 27.08.2018