Einrichten des Skalierungstools mit Azure Automation und Azure Logic Apps für Azure Virtual Desktop

In diesem Artikel erfahren Sie mehr über das Skalierungstool, das ein Azure Automation-Runbook und Azure Logic App verwendet, um Sitzungshost-VMs in Ihrer Azure Virtual Desktop-Umgebung automatisch zu skalieren. Weitere Informationen zum Skalierungstool finden Sie unter Skalieren von Sitzungshosts mit Azure Automation und Azure Logic Apps.

Hinweis

  • Die native Autoskalierungslösung von Azure Virtual Desktop ist in der Regel für gepoolte und persönliche Hostpools verfügbar und skaliert Sitzungshost-VMs basierend auf dem Skalierungszeitplan automatisch ab oder auf. Wir empfehlen die Verwendung der Autoskalierung zur einfacheren Konfiguration. Weitere Informationen finden Sie unter Pläne für die Autoskalierung.

  • Sie können Sitzungshosts mit Azure Automation und Azure Logic Apps nicht zusammen mit Autoskalierung für denselben Hostpool skalieren. Sie müssen entweder die eine Option oder die andere verwenden.

Voraussetzungen

Bevor Sie mit der Einrichtung des Skalierungstools beginnen, sollten Sie Folgendes vorbereiten:

  • Einen Azure Virtual Desktop-Hostpool.
  • Sitzungshostpool-VMs, die konfiguriert und für den Azure Virtual Desktop-Dienst registriert sind.
  • Ein Benutzer, dem die RBAC (Role-Based Access Control, Rollenbasierte Zugriffssteuerung)-Rolle Mitwirkender für das Azure-Abonnement zugewiesen ist, der die Ressourcen erstellen kann. Sie benötigen außerdem die RBAC-Rolle Anwendungsadministrator und/oder Besitzer, um eine verwaltete Identität zu erstellen.
  • Einen Log Analytics-Arbeitsbereich (optional).

Der Computer, den Sie zum Bereitstellen des Tools verwenden, muss Folgendes aufweisen:

Wenn alles bereit ist, können Sie anfangen.

Erstellen oder Aktualisieren eines Azure Automation-Kontos

Hinweis

Wenn Sie bereits über ein Azure Automation-Konto mit einem Runbook verfügen, in dem eine ältere Version des Skalierungsskripts ausgeführt wird, müssen Sie lediglich die nachstehende Anleitung befolgen, um sicherzustellen, dass es auf dem neuesten Stand ist.

Zunächst benötigen Sie ein Azure Automation-Konto zum Ausführen des PowerShell-Runbooks. Das in diesem Abschnitt beschriebene Verfahren funktioniert auch dann, wenn Sie bereits über ein Azure Automation-Konto verfügen, mit dem Sie das PowerShell-Runbook einrichten möchten. Die Einrichtung erfolgt folgendermaßen:

  1. Öffnen Sie PowerShell.

  2. Führen Sie das folgende Cmdlet aus, um sich bei Ihrem Azure-Konto anzumelden.

    Login-AzAccount
    

    Hinweis

    Ihr Konto muss über die Berechtigung „Mitwirkender“ für das Azure-Abonnement verfügen, in dem Sie das Skalierungstool bereitstellen möchten.

  3. Führen Sie das folgende Cmdlet aus, um das Skript zum Erstellen des Azure Automation-Kontos herunterzuladen:

    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. Führen Sie das folgende Cmdlet aus, um das Skript auszuführen und das Azure Automation-Konto zu erstellen. Sie können Werte für die Parameter eingeben oder sie auskommentieren, um die Standardwerte zu verwenden.

    $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
    

    Hinweis

    Wenn Sie in Ihrer Richtlinie keine Skalierungsskriptressourcen in einer bestimmten Region erstellen können, aktualisieren Sie die Richtlinienzuweisung, und fügen Sie der Liste der zulässigen Regionen die gewünschte Region hinzu.

  5. Wenn Sie noch kein Automation-Konto erstellt haben, enthält die Ausgabe des Cmdlets einen verschlüsselten Webhook-URI in der Variablen des Automation-Kontos. Notieren Sie sich den URI unbedingt, da Sie ihn als Parameter verwenden, wenn Sie den Ausführungszeitplan für Azure Logic Apps einrichten. Wenn Sie ein vorhandenes Automation-Konto aktualisieren, können Sie den Webhook-URI mithilfe von PowerShell abrufen, um auf Variablen zu zugreifen.

  6. Wenn Sie den Parameter WorkspaceName für Log Analytics angegeben haben, enthält die Cmdlet-Ausgabe auch die Log Analytics-Arbeitsbereichs-ID und den zugehörigen Primärschlüssel. Notieren Sie sich die Arbeitsbereichs-ID und den Primärschlüssel, da Sie sie später erneut mit Parametern verwenden müssen, wenn Sie den Ausführungszeitplan für die Azure-Logik-App einrichten.

  7. Nachdem Sie Ihr Azure Automation-Konto eingerichtet haben, melden Sie sich bei Ihrem Azure-Abonnement an, und überprüfen Sie, ob Ihr Azure Automation-Konto und das zugehörige Runbook in der angegebenen Ressourcengruppe angezeigt werden, wie in der folgenden Abbildung dargestellt:

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

    Wählen Sie den Namen Ihres Runbooks aus, um zu überprüfen, ob sich Ihr Webhook dort befindet, wo er sein sollte. Navigieren Sie als nächstes zum Abschnitt „Ressourcen“ des Runbooks, und wählen Sie Webhooksaus.

Erstellen einer verwalteten Identität

Nachdem Sie nun über ein Azure Automation-Konto verfügen, müssen Sie außerdem eine verwaltete Identität einrichten, falls noch nicht geschehen. Verwaltete Identitäten helfen Ihrem Runbook, auf andere Microsoft Entra-bezogene Ressourcen zuzugreifen und wichtige Automatisierungsprozesse zu authentifizieren.

Befolgen Sie zum Einrichten einer verwalteten Identität die Anweisungen unter Verwenden einer systemseitig zugewiesenen verwalteten Identität für ein Azure Automation-Konto. Nachdem Sie eine verwaltete Identität erstellt haben, weisen Sie sie mit entsprechenden Berechtigungen für Mitwirkende Azure Virtual Desktop-Ressourcen wie Hostpools, VMs usw. zu. Wenn Sie fertig sind, kehren Sie zu diesem Artikel zurück, und erstellen Sie die Azure-Logik-App und den Ausführungszeitplan, um den anfänglichen Einrichtungsprozess abzuschließen.

Erstellen der Azure-Logik-App und des Ausführungszeitplans

Abschließend müssen Sie die Azure-Logik-App erstellen und einen Ausführungszeitplan für das neue Skalierungstool einrichten. Laden Sie ggf. zunächst das PowerShell-Modul für die Desktopvirtualisierung (DesktopVirtualization) herunter, und importieren Sie es, um es in Ihrer PowerShell-Sitzung verwenden zu können.

  1. Öffnen Sie PowerShell.

  2. Führen Sie das folgende Cmdlet aus, um sich bei Ihrem Azure-Konto anzumelden.

    Login-AzAccount
    
  3. Führen Sie das folgende Cmdlet aus, um das Skript zum Erstellen der Azure-Logik-App herunterzuladen.

    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. Führen Sie das folgende PowerShell-Skript aus, um die Azure-Logik-App und den Ausführungszeitplan für Ihren Hostpool zu erstellen:

    Hinweis

    Sie müssen dieses Skript für jeden Hostpool ausführen, den Sie automatisch skalieren möchten, Sie benötigen jedoch nur ein Azure Automation-Konto.

    $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
    

    Nachdem Sie das Skript ausgeführt haben, sollte die Azure-Logik-App in einer Ressourcengruppe angezeigt werden, wie in der folgenden Abbildung dargestellt.

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

    Wenn Sie Änderungen am Ausführungszeitplan vornehmen möchten, um z. B. das Wiederholungsintervall oder die Zeitzone zu ändern, navigieren Sie zum Planer für die Autoskalierung der Azure-Logik-App, und wählen Sie Bearbeiten aus, um den Logik-App-Designer zu öffnen.

    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.

Verwalten Ihres Skalierungstools

Nachdem Sie das Skalierungstool erstellt haben, können Sie auf seine Ausgabe zugreifen. In diesem Abschnitt werden einige Features beschrieben, die möglicherweise hilfreich sind.

Anzeigen des Auftragsstatus

Sie können im Azure-Portal einen zusammengefassten Status aller Runbookaufträge anzeigen oder ausführlichere Details zum Status eines bestimmten Runbookauftrags einsehen.

Rechts in Ihrem ausgewählten Azure Automation-Konto sehen Sie unter „Auftragsstatistik“ die Zusammenfassung aller Runbookaufträge. Wenn Sie auf der linken Seite des Fensters die Seite Aufträge öffnen, werden die aktuellen Auftragsstatus, Startzeiten und Beendigungszeiten angezeigt.

A screenshot of the job status page.

Anzeigen von Protokollen und der Ausgabe des Skalierungstools

Sie können die Protokolle der Auf- und Abskaliervorgänge anzeigen, indem Sie das Runbook öffnen und den Auftrag auswählen.

Navigieren Sie in der Ressourcengruppe, in der das Azure Automation-Konto gehostet wird, zum Runbook, und wählen Sie Übersicht aus. Wählen Sie auf der Seite „Übersicht“ unter Kürzlich ausgeführte Aufträge einen Auftrag aus, um die zugehörige Ausgabe des Skalierungstools anzuzeigen, wie in der folgenden Abbildung dargestellt.

An image of the output window for the scaling tool.

Überprüfen der Versionsnummer des Runbookskripts

Sie können überprüfen, welche Version des Runbookskripts Sie verwenden, indem Sie die Runbookdatei in Ihrem Azure Automation-Konto öffnen und Anzeigen auswählen. Ein Skript für das Runbook wird auf der rechten Seite des Bildschirms angezeigt. In dem Skript ist die Versionsnummer im Abschnitt SYNOPSIS im Format v#.#.# zu finden. Die neueste Versionsnummer finden Sie hier. Wenn in Ihrem Runbookskript keine Versionsnummer aufgeführt ist, bedeutet dies, dass Sie eine frühere Version des Skripts ausführen und es sofort aktualisieren sollten. Wenn Sie das Runbookskript aktualisieren müssen, befolgen Sie die Anweisungen unter Erstellen oder Aktualisieren eines Azure Automation-Kontos.

Melden von Problemen

Wenn Sie ein Problem melden, sollten Sie die folgenden Informationen bereitstellen, um die Problembehandlung zu vereinfachen:

  • Ein vollständiges Protokoll von der Registerkarte Alle Protokolle in dem Auftrag, der das Problem verursacht hat. Befolgen Sie zum Abrufen des Protokolls die Anleitung unter Anzeigen von Protokollen und der Ausgabe des Skalierungstools. Wenn das Protokoll vertrauliche oder private Informationen enthält, können Sie diese entfernen, bevor Sie das Problem an uns senden.

  • Die Version des Runbookskripts, das Sie verwenden. Informationen zum Abrufen der Versionsnummer finden Sie unter Überprüfen der Versionsnummer des Runbookskripts.

  • Die Versionsnummern der folgenden in Ihrem Azure Automation-Konto installierten PowerShell-Module. Öffnen Sie dazu Ihr Azure Automation-Konto, wählen Sie links im Fenster unter Freigegebene Ressourcen die Option Module aus, und suchen Sie nach dem Namen des Moduls.

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

Log Analytics

Wenn Sie sich für die Verwendung von Log Analytics entschieden haben, können Sie unter Benutzerdefinierte Protokolle in der Ansicht Protokolle Ihres Log Analytics-Arbeitsbereichs alle Protokolldaten in einem benutzerdefinierten Protokoll namens WVDTenantScale_CL anzeigen. Nachstehend sind einige Beispielabfragen aufgelistet, die Sie möglicherweise hilfreich finden.

  • Wenn Sie alle Protokolle für einen Hostpool anzeigen möchten, geben Sie die folgende Abfrage ein:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Wenn Sie alle derzeit aktiven Sitzungshost-VMs und aktiven Benutzersitzungen in Ihrem Hostpool anzeigen möchten, geben Sie die folgende Abfrage ein:

    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
    
  • Geben Sie zum Abfragen des Status aller Sitzungshost-VMs in einem Hostpool die folgende Abfrage ein:

    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
    
  • Wenn Sie Fehler und Warnungen anzeigen möchten, geben Sie die folgende Abfrage ein:

    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
    

Einschränkungen

Hier sind einige Einschränkungen beim Skalieren von Sitzungshost-VMs mit diesem Skalierungsskript aufgeführt:

  • Das Skalierungsskript berücksichtigt keine Zeitänderungen zwischen Standard- und Sommerzeit.