Configurare lo strumento di scalabilità usando Automazione di Azure e App per la logica di Azure per Desktop virtuale Azure

Questo articolo illustra lo strumento di ridimensionamento che usa un runbook Automazione di Azure e l'app per la logica di Azure per ridimensionare automaticamente le macchine virtuali host sessione nell'ambiente Desktop virtuale Azure. Per altre informazioni sullo strumento di ridimensionamento, vedere Ridimensionare gli host di sessione usando Automazione di Azure e App per la logica di Azure.

Nota

  • La soluzione nativa di Scalabilità automatica di Desktop virtuale Azure è disponibile a livello generale per i pool di host in pool e personali e ridimensiona automaticamente le macchine virtuali host di sessione in base alla pianificazione del ridimensionamento. È consigliabile usare la scalabilità automatica per semplificare la configurazione. Per altre informazioni, vedere Piani di ridimensionamento automatico.

  • Non è possibile ridimensionare gli host di sessione usando Automazione di Azure e App per la logica di Azure insieme alla scalabilità automatica nello stesso pool di host. È necessario usare uno o l'altro.

Prerequisiti

Prima di iniziare la configurazione dello strumento di dimensionamento, assicurarsi che siano disponibili gli elementi seguenti:

  • Pool di host di Desktop virtuale Azure.
  • Macchine virtuali del pool di host di sessione configurate e registrate con il servizio Desktop virtuale Azure.
  • Un utente con il ruolo Controllo degli accessi in base al ruolo collaboratore assegnato nella sottoscrizione di Azure per creare le risorse. Per creare un'identità gestita, è necessario anche il ruolo Amministratore applicazione e/o Controllo degli accessi in base al ruolo proprietario .
  • Un'area di lavoro Log Analytics (facoltativa).

Il computer da usare per distribuire lo strumento deve avere:

Se hai tutto pronto, iniziamo.

Creare o aggiornare un account di automazione di Azure

Nota

Se si ha già un account Automazione di Azure con un runbook che esegue una versione precedente dello script di ridimensionamento, è sufficiente seguire le istruzioni riportate di seguito per assicurarsi che sia aggiornato.

Per prima cosa, è necessario un account di Automazione di Azure per eseguire il runbook di PowerShell. Il processo descritto in questa sezione è valido anche se si dispone di un account Automazione di Azure esistente che si vuole usare per configurare il runbook di PowerShell. Ecco come eseguire la configurazione:

  1. Aprire PowerShell.

  2. Eseguire il cmdlet seguente per accedere all'account Azure.

    Login-AzAccount
    

    Nota

    L'account deve avere diritti di Collaboratore nella sottoscrizione di Azure in cui si vuole distribuire lo strumento di ridimensionamento.

  3. Eseguire il cmdlet seguente per scaricare lo script per la creazione dell'account di Automazione di Azure:

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzAutoAccount.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzAutoAccount.ps1"
    
  4. Eseguire il cmdlet seguente per eseguire lo script e creare l'account di Automazione di Azure. È possibile compilare i valori per i parametri o definirli come commenti per usare le impostazioni predefinite.

    $Params = @{
         "AADTenantId"           = "<Azure_Active_Directory_tenant_ID>"   # Optional. If not specified, it will use the current Azure context
         "SubscriptionId"        = "<Azure_subscription_ID>"              # Optional. If not specified, it will use the current Azure context
         "UseARMAPI"             = $true
         "ResourceGroupName"     = "<Resource_group_name>"                # Optional. Default: "WVDAutoScaleResourceGroup"
         "AutomationAccountName" = "<Automation_account_name>"            # Optional. Default: "WVDAutoScaleAutomationAccount"
         "Location"              = "<Azure_region_for_deployment>"
         "WorkspaceName"         = "<Log_analytics_workspace_name>"       # Optional. If specified, Log Analytics will be used to configure the custom log table that the runbook PowerShell script can send logs to
    }
    
    .\CreateOrUpdateAzAutoAccount.ps1 @Params
    

    Nota

    Se i criteri non consentono di creare risorse script di ridimensionamento in un'area specifica, aggiornare l'assegnazione dei criteri e aggiungere l'area desiderata all'elenco delle aree consentite.

  5. Se in precedenza non è stato creato un account di automazione, l'output del cmdlet includerà un URI webhook crittografato nella variabile dell'account di automazione. Assicurarsi di prendere nota dell'URI, perché verrà usato come parametro per configurare la pianificazione dell'esecuzione per App per la logica di Azure. Se si aggiorna un account di automazione esistente, è possibile recuperare l'URI del webhook usando PowerShell per accedere alle variabili.

  6. Se è stato specificato il parametro WorkspaceName per Log Analytics, l'output del cmdlet includerà anche l'ID dell'area di lavoro Log Analytics e la relativa chiave primaria. Prendere nota dell'ID dell'area di lavoro e della chiave primaria perché sarà necessario usarli di nuovo in un secondo momento con i parametri quando si configura la pianificazione dell'esecuzione per l'app per la logica di Azure.

  7. Dopo aver configurato l'account di Automazione di Azure, accedere alla sottoscrizione di Azure e verificare che l'account di Automazione di Azure e il runbook pertinente vengano visualizzati nel gruppo di risorse specificato, come illustrato nell'immagine seguente:

    An image of the Azure overview page showing the newly created Azure Automation account and runbook.

    Per verificare se il webhook si trova dove previsto, selezionare il nome del runbook. Passare quindi alla sezione Risorse del runbook e selezionare Webhook.

Creare un'identità gestita

Ora che si dispone di un account Automazione di Azure, è anche necessario configurare un'identità gestita se non è già stato fatto. Le identità gestite consentono al runbook di accedere ad altre risorse correlate a Microsoft Entra, nonché di autenticare processi di automazione importanti.

Per configurare un'identità gestita, seguire le indicazioni riportate in Uso di un'identità gestita assegnata dal sistema per un account Automazione di Azure. Dopo aver creato un'identità gestita, assegnarla con le autorizzazioni di collaboratore appropriate alle risorse di Desktop virtuale Azure, ad esempio pool di host, macchine virtuali e così via. Al termine, tornare a questo articolo e Creare l'app per la logica di Azure e la pianificazione dell'esecuzione per completare il processo di installazione iniziale.

Creare l'app per la logica di Azure e la pianificazione dell'esecuzione

Infine, è necessario creare l'app per la logica di Azure e configurare una pianificazione dell'esecuzione per il nuovo strumento di dimensionamento. Prima di tutto, scaricare e importare il modulo PowerShell Desktop Virtualization da usare nella sessione di PowerShell, se non è già stato fatto.

  1. Aprire PowerShell.

  2. Eseguire il cmdlet seguente per accedere all'account Azure.

    Login-AzAccount
    
  3. Eseguire il cmdlet seguente per scaricare lo script per la creazione dell'app per la logica di Azure.

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzLogicApp.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzLogicApp.ps1"
    
  4. Eseguire lo script di PowerShell seguente per creare l'app per la logica di Azure e la pianificazione dell'esecuzione per il pool di host

    Nota

    È necessario eseguire questo script per ogni pool di host che si vuole ridimensionare automaticamente, ma è necessario un solo account Automazione di Azure.

    $AADTenantId = (Get-AzContext).Tenant.Id
    
    $AzSubscription = Get-AzSubscription | Out-GridView -OutputMode:Single -Title "Select your Azure Subscription"
    Select-AzSubscription -Subscription $AzSubscription.Id
    
    $ResourceGroup = Get-AzResourceGroup | Out-GridView -OutputMode:Single -Title "Select the resource group for the new Azure Logic App"
    
    $WVDHostPool = Get-AzResource -ResourceType "Microsoft.DesktopVirtualization/hostpools" | Out-GridView -OutputMode:Single -Title "Select the host pool you'd like to scale"
    
    $LogAnalyticsWorkspaceId = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Workspace ID returned by when you created the Azure Automation account, otherwise leave it blank"
    $LogAnalyticsPrimaryKey = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Primary Key returned by when you created the Azure Automation account, otherwise leave it blank"
    $RecurrenceInterval = Read-Host -Prompt "Enter how often you'd like the job to run in minutes, e.g. '15'"
    $BeginPeakTime = Read-Host -Prompt "Enter the start time for peak hours in local time, e.g. 9:00"
    $EndPeakTime = Read-Host -Prompt "Enter the end time for peak hours in local time, e.g. 18:00"
    $TimeDifference = Read-Host -Prompt "Enter the time difference between local time and UTC in hours, e.g. +5:30"
    $SessionThresholdPerCPU = Read-Host -Prompt "Enter the maximum number of sessions per CPU that will be used as a threshold to determine when new session host VMs need to be started during peak hours"
    $MinimumNumberOfRDSH = Read-Host -Prompt "Enter the minimum number of session host VMs to keep running during off-peak hours"
    $MaintenanceTagName = Read-Host -Prompt "Enter the name of the Tag associated with VMs you don't want to be managed by this scaling tool"
    $LimitSecondsToForceLogOffUser = Read-Host -Prompt "Enter the number of seconds to wait before automatically signing out users. If set to 0, any session host VM that has user sessions, will be left untouched"
    $LogOffMessageTitle = Read-Host -Prompt "Enter the title of the message sent to the user before they are forced to sign out"
    $LogOffMessageBody = Read-Host -Prompt "Enter the body of the message sent to the user before they are forced to sign out"
    
    $WebhookURI = Read-Host -Prompt "Enter the webhook URI that has already been generated for this Azure Automation account. The URI is stored as encrypted in the above Automation Account variable. To retrieve the value, see https://learn.microsoft.com/azure/automation/shared-resources/variables?tabs=azure-powershell#powershell-cmdlets-to-access-variables"
    
    $Params = @{
         "AADTenantId"                   = $AADTenantId                             # Optional. If not specified, it will use the current Azure context
         "SubscriptionID"                = $AzSubscription.Id                       # Optional. If not specified, it will use the current Azure context
         "ResourceGroupName"             = $ResourceGroup.ResourceGroupName         # Optional. Default: "WVDAutoScaleResourceGroup"
         "Location"                      = $ResourceGroup.Location                  # Optional. Default: "West US2"
         "UseARMAPI"                     = $true
         "HostPoolName"                  = $WVDHostPool.Name
         "HostPoolResourceGroupName"     = $WVDHostPool.ResourceGroupName           # Optional. Default: same as ResourceGroupName param value
         "LogAnalyticsWorkspaceId"       = $LogAnalyticsWorkspaceId                 # Optional. If not specified, script will not log to the Log Analytics
         "LogAnalyticsPrimaryKey"        = $LogAnalyticsPrimaryKey                  # Optional. If not specified, script will not log to the Log Analytics
         "RecurrenceInterval"            = $RecurrenceInterval                      # Optional. Default: 15
         "BeginPeakTime"                 = $BeginPeakTime                           # Optional. Default: "09:00"
         "EndPeakTime"                   = $EndPeakTime                             # Optional. Default: "17:00"
         "TimeDifference"                = $TimeDifference                          # Optional. Default: "-7:00"
         "SessionThresholdPerCPU"        = $SessionThresholdPerCPU                  # Optional. Default: 1
         "MinimumNumberOfRDSH"           = $MinimumNumberOfRDSH                     # Optional. Default: 1
         "MaintenanceTagName"            = $MaintenanceTagName                      # Optional.
         "LimitSecondsToForceLogOffUser" = $LimitSecondsToForceLogOffUser           # Optional. Default: 1
         "LogOffMessageTitle"            = $LogOffMessageTitle                      # Optional. Default: "Machine is about to shutdown."
         "LogOffMessageBody"             = $LogOffMessageBody                       # Optional. Default: "Your session will be logged off. Please save and close everything."
         "WebhookURI"                    = $WebhookURI
    }
    
    .\CreateOrUpdateAzLogicApp.ps1 @Params
    

    Dopo aver eseguito lo script, l'app per la logica di Azure verrà visualizzata in un gruppo di risorse, come illustrato nell'immagine seguente.

    An image of the overview page for an example Azure Logic App.

    Per apportare modifiche alla pianificazione di esecuzione, ad esempio la modifica dell'intervallo di ricorrenza o del fuso orario, passare all'utilità di pianificazione della scalabilità automatica dell'app per la logica di Azure e selezionare Modifica per passare a Progettazione app per la logica di Azure.

    An image of the Azure Logic App Designer. The Recurrence and webhook menus that let the user edit recurrence times and the webhook file are open.

Gestire lo strumento di dimensionamento

Ora che è stato creato lo strumento di dimensionamento, è possibile accedere al relativo output. Questa sezione descrive alcune funzionalità che possono risultare utili.

Visualizzazione dello stato del processo

Nel portale di Azure è possibile visualizzare uno stato riepilogativo di tutti i processi del runbook o uno stato più dettagliato di uno specifico processo.

A destra dell'account Automazione di Azure selezionato, in "Statistiche processo", è possibile visualizzare un elenco di riepiloghi di tutti i processi del runbook. Aprendo la pagina Processi sul lato sinistro della finestra vengono visualizzati gli stati dei processi correnti, l'ora di inizio e l'ora di completamento.

A screenshot of the job status page.

Visualizzare i log e l'output dello strumento di dimensionamento

È possibile visualizzare i log delle operazioni di scalabilità orizzontale e scalabilità orizzontale aprendo il runbook e selezionando il processo.

Passare al runbook nel gruppo di risorse che ospita l'account Automazione di Azure e selezionare Panoramica. Nella pagina di panoramica selezionare un processo in Processi recenti per visualizzare l'output dello strumento di ridimensionamento, come illustrato nell'immagine seguente.

An image of the output window for the scaling tool.

Controllare il numero di versione dello script del runbook

È possibile controllare quale versione dello script del runbook si sta usando aprendo il file del runbook nell'account Automazione di Azure e selezionando Visualizza. Sullo schermo verrà visualizzato uno script per il runbook. Nello script verrà visualizzato il numero di versione nel formato v#.#.# nella SYNOPSIS sezione . Il numero di versione più recente è disponibile qui. Se non viene visualizzato un numero di versione nello script del runbook, significa che si sta eseguendo una versione precedente dello script ed è consigliabile aggiornarlo immediatamente. Se è necessario aggiornare lo script del runbook, seguire le istruzioni riportate in Creare o aggiornare un account Automazione di Azure.

Segnalazione di problemi

Quando si segnala un problema, è necessario fornire le informazioni seguenti per risolvere i problemi:

  • Un log completo dalla scheda Tutti i log del processo che ha causato il problema. Per informazioni su come ottenere il log, seguire le istruzioni riportate in Visualizzare i log e l'output dello strumento di ridimensionamento. Se nel log sono presenti informazioni riservate o private, è possibile rimuoverle prima di inviare il problema.

  • Versione dello script del runbook in uso. Per informazioni su come ottenere il numero di versione, vedere Controllare il numero di versione dello script del runbook

  • Numero di versione di ognuno dei moduli di PowerShell seguenti installati nell'account Automazione di Azure. Per trovare questi moduli, aprire Automazione di Azure account, selezionare Moduli nella sezione Risorse condivise nel riquadro a sinistra della finestra e quindi cercare il nome del modulo.

    • Az.Accounts
    • Az.Compute
    • Az.Resources
    • Az.Automation
    • OMSIngestionAPI
    • Az.DesktopVirtualization

Log Analytics

Se si è deciso di usare Log Analytics, è possibile visualizzare tutti i dati di log in un log personalizzato denominato WVDTenantScale_CL in Log personalizzati nella visualizzazione Log dell'area di lavoro Log Analytics. Sono state elencate alcune query di esempio che potrebbero risultare utili.

  • Per visualizzare tutti i log per un pool di host, immettere la query seguente:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Per visualizzare il numero totale di macchine virtuali host sessione in esecuzione e sessioni utente attive nel pool di host, immettere la query seguente:

    WVDTenantScale_CL
    | where logmessage_s contains "Number of running session hosts:"
         or logmessage_s contains "Number of user sessions:"
         or logmessage_s contains "Number of user sessions per Core:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Per visualizzare lo stato di tutte le macchine virtuali host di sessione in un pool di host, immettere la query seguente:

    WVDTenantScale_CL
    | where logmessage_s contains "Session host:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Per visualizzare eventuali errori e avvisi, immettere la query seguente:

    WVDTenantScale_CL
    | where logmessage_s contains "ERROR:" or logmessage_s contains "WARN:"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    

Limiti

Ecco alcune limitazioni per il ridimensionamento delle macchine virtuali dell'host sessione con questo script di ridimensionamento:

  • Lo script di ridimensionamento non considera le variazioni dell'ora tra l'ora legale e quella standard.