Konfigurowanie narzędzia skalowania przy użyciu usług Azure Automation i Azure Logic Apps for Azure Virtual Desktop

W tym artykule dowiesz się więcej o narzędziu do skalowania, które używa elementu Runbook usługi Azure Automation i aplikacji logiki platformy Azure do automatycznego skalowania maszyn wirtualnych hosta sesji w środowisku usługi Azure Virtual Desktop. Aby dowiedzieć się więcej o narzędziu skalowania, zobacz Skalowanie hostów sesji przy użyciu usług Azure Automation i Azure Logic Apps.

Uwaga

  • Natywne rozwiązanie automatycznego skalowania usługi Azure Virtual Desktop jest ogólnie dostępne dla puli i osobistych puli hostów i automatycznie skaluje maszyny wirtualne hosta sesji lub w poziomie na podstawie harmonogramu skalowania. Zalecamy używanie autoskalu w celu ułatwienia konfiguracji. Aby uzyskać więcej informacji, zobacz Plany skalowania automatycznego.

  • Nie można skalować hostów sesji przy użyciu usług Azure Automation i Azure Logic Apps razem z autoskalowaniem w tej samej puli hostów. Należy użyć jednego lub drugiego.

Wymagania wstępne

Przed rozpoczęciem konfigurowania narzędzia skalowania upewnij się, że są gotowe następujące elementy:

  • Pula hostów usługi Azure Virtual Desktop.
  • Maszyny wirtualne puli hostów sesji skonfigurowane i zarejestrowane w usłudze Azure Virtual Desktop.
  • Użytkownik z rolą RBAC (Role-Based Access Control) współautora przypisaną w subskrypcji platformy Azure w celu utworzenia zasobów. Aby utworzyć tożsamość zarządzaną, musisz również mieć rolę administratora aplikacji i/lub właściciela kontroli dostępu opartej na rolach.
  • Obszar roboczy usługi Log Analytics (opcjonalnie).

Maszyna używana do wdrażania narzędzia musi mieć:

Jeśli wszystko jest gotowe, zacznijmy.

Tworzenie lub aktualizowanie konta usługi Azure Automation

Uwaga

Jeśli masz już konto usługi Azure Automation z elementem Runbook z starszą wersją skryptu skalowania, wystarczy postępować zgodnie z poniższymi instrukcjami, aby upewnić się, że został zaktualizowany.

Najpierw musisz mieć konto usługi Azure Automation, aby uruchomić element Runbook programu PowerShell. Proces opisany w tej sekcji jest prawidłowy, nawet jeśli masz istniejące konto usługi Azure Automation, którego chcesz użyć do skonfigurowania elementu Runbook programu PowerShell. Oto jak go skonfigurować:

  1. Otwórz program PowerShell.

  2. Uruchom następujące polecenie cmdlet, aby zalogować się do konta platformy Azure.

    Login-AzAccount
    

    Uwaga

    Twoje konto musi mieć prawa współautora w subskrypcji platformy Azure, w której chcesz wdrożyć narzędzie skalowania.

  3. Uruchom następujące polecenie cmdlet, aby pobrać skrypt do utworzenia konta usługi Azure Automation:

    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. Uruchom następujące polecenie cmdlet, aby wykonać skrypt i utworzyć konto usługi Azure Automation. Możesz wypełnić wartości parametrów lub oznaczyć je jako komentarz, aby użyć ich wartości domyślnych.

    $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
    

    Uwaga

    Jeśli zasady nie umożliwiają tworzenia zasobów skryptów skalowania w określonym regionie, zaktualizuj przypisanie zasad i dodaj region, w którym chcesz wyświetlić listę dozwolonych regionów.

  5. Jeśli wcześniej nie utworzono konta automatyzacji, dane wyjściowe polecenia cmdlet będą zawierać zaszyfrowany identyfikator URI elementu webhook w zmiennej konta automatyzacji. Pamiętaj, aby zachować rekord identyfikatora URI, ponieważ użyjesz go jako parametru podczas konfigurowania harmonogramu wykonywania dla aplikacji logiki platformy Azure. Jeśli aktualizujesz istniejące konto automatyzacji, możesz pobrać identyfikator URI elementu webhook przy użyciu programu PowerShell w celu uzyskania dostępu do zmiennych.

  6. Jeśli określono parametr WorkspaceName dla usługi Log Analytics, dane wyjściowe polecenia cmdlet będą również zawierać identyfikator obszaru roboczego usługi Log Analytics i jego klucz podstawowy. Zanotuj identyfikator obszaru roboczego i klucz podstawowy, ponieważ należy użyć ich ponownie później z parametrami podczas konfigurowania harmonogramu wykonywania aplikacji logiki platformy Azure.

  7. Po skonfigurowaniu konta usługi Azure Automation zaloguj się do subskrypcji platformy Azure i sprawdź, czy twoje konto usługi Azure Automation i odpowiedni element Runbook zostały wyświetlone w określonej grupie zasobów, jak pokazano na poniższej ilustracji:

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

    Aby sprawdzić, czy element webhook to miejsce, w którym powinien być, wybierz nazwę elementu Runbook. Następnie przejdź do sekcji Zasoby elementu Runbook i wybierz pozycję Elementy webhook.

Tworzenie tożsamości zarządzanej

Teraz, gdy masz już konto usługi Azure Automation, musisz również skonfigurować tożsamość zarządzaną, jeśli jeszcze tego nie zrobiono. Tożsamości zarządzane ułatwiają elementowi Runbook dostęp do innych zasobów związanych z firmą Microsoft Entra, a także uwierzytelnianie ważnych procesów automatyzacji.

Aby skonfigurować tożsamość zarządzaną, postępuj zgodnie z instrukcjami w temacie Używanie tożsamości zarządzanej przypisanej przez system dla konta usługi Azure Automation. Po utworzeniu tożsamości zarządzanej przypisz ją z odpowiednimi uprawnieniami współautora do zasobów usługi Azure Virtual Desktop, takich jak pule hostów, maszyny wirtualne itp. Po zakończeniu wróć do tego artykułu i Utwórz aplikację logiki platformy Azure i harmonogram wykonywania, aby zakończyć proces początkowej konfiguracji.

Tworzenie aplikacji logiki platformy Azure i harmonogramu wykonywania

Na koniec należy utworzyć aplikację logiki platformy Azure i skonfigurować harmonogram wykonywania dla nowego narzędzia do skalowania. Najpierw pobierz i zaimportuj moduł PowerShell wirtualizacji pulpitu do użycia w sesji programu PowerShell, jeśli jeszcze tego nie zrobiono.

  1. Otwórz program PowerShell.

  2. Uruchom następujące polecenie cmdlet, aby zalogować się do konta platformy Azure.

    Login-AzAccount
    
  3. Uruchom następujące polecenie cmdlet, aby pobrać skrypt do utworzenia aplikacji logiki platformy 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. Uruchom następujący skrypt programu PowerShell, aby utworzyć aplikację logiki platformy Azure i harmonogram wykonywania dla puli hostów

    Uwaga

    Musisz uruchomić ten skrypt dla każdej puli hostów, którą chcesz skalować automatycznie, ale potrzebujesz tylko jednego konta usługi Azure Automation.

    $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
    

    Po uruchomieniu skryptu aplikacja logiki platformy Azure powinna pojawić się w grupie zasobów, jak pokazano na poniższej ilustracji.

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

    Aby wprowadzić zmiany w harmonogramie wykonywania, takie jak zmiana interwału cyklu lub strefy czasowej, przejdź do harmonogramu automatycznego skalowania aplikacji logiki platformy Azure i wybierz pozycję Edytuj, aby przejść do Projektant aplikacji logiki platformy 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.

Zarządzanie narzędziem do skalowania

Teraz, po utworzeniu narzędzia skalowania, możesz uzyskać dostęp do jego danych wyjściowych. W tej sekcji opisano kilka przydatnych funkcji.

Wyświetlanie stanu zadania

Możesz wyświetlić podsumowany stan wszystkich zadań elementu Runbook lub wyświetlić bardziej szczegółowy stan określonego zadania elementu Runbook w witrynie Azure Portal.

Po prawej stronie wybranego konta usługi Azure Automation w obszarze "Statystyki zadań" możesz wyświetlić listę podsumowań wszystkich zadań elementu Runbook. Otwarcie strony Zadania po lewej stronie okna zawiera bieżące stany zadań, czasy rozpoczęcia i czasy ukończenia.

A screenshot of the job status page.

Wyświetlanie dzienników i danych wyjściowych narzędzia skalowania

Dzienniki operacji skalowania i skalowania w poziomie można wyświetlić, otwierając element Runbook i wybierając zadanie.

Przejdź do elementu Runbook w grupie zasobów hostująca konto usługi Azure Automation i wybierz pozycję Przegląd. Na stronie przeglądu wybierz zadanie w obszarze Ostatnie zadania , aby wyświetlić dane wyjściowe narzędzia skalowania, jak pokazano na poniższej ilustracji.

An image of the output window for the scaling tool.

Sprawdzanie numeru wersji skryptu elementu Runbook

Możesz sprawdzić, której wersji skryptu elementu Runbook używasz, otwierając plik elementu Runbook na koncie usługi Azure Automation i wybierając pozycję Wyświetl. Skrypt elementu Runbook zostanie wyświetlony po prawej stronie ekranu. W skrycie zobaczysz numer wersji w formacie v#.#.# w SYNOPSIS sekcji . Najnowszy numer wersji można znaleźć tutaj. Jeśli w skrycie elementu Runbook nie widzisz numeru wersji, oznacza to, że używasz starszej wersji skryptu i należy ją zaktualizować od razu. Jeśli musisz zaktualizować skrypt elementu Runbook, postępuj zgodnie z instrukcjami w temacie Tworzenie lub aktualizowanie konta usługi Azure Automation.

Raportowanie problemów

Podczas zgłaszania problemu należy podać następujące informacje, aby pomóc nam rozwiązać problem:

  • Pełny dziennik z karty Wszystkie dzienniki w zadaniu, które spowodowało problem. Aby dowiedzieć się, jak uzyskać dziennik, postępuj zgodnie z instrukcjami w temacie Wyświetlanie dzienników i danych wyjściowych narzędzia skalowania. Jeśli w dzienniku znajdują się jakiekolwiek poufne lub prywatne informacje, możesz je usunąć przed przesłaniem problemu do nas.

  • Wersja używanego skryptu elementu Runbook. Aby dowiedzieć się, jak uzyskać numer wersji, zobacz Sprawdzanie numeru wersji skryptu elementu Runbook

  • Numer wersji każdego z następujących modułów programu PowerShell zainstalowanych na koncie usługi Azure Automation. Aby znaleźć te moduły, otwórz konto usługi Azure Automation, wybierz pozycję Moduływ sekcji Zasoby udostępnione w okienku po lewej stronie okna, a następnie wyszukaj nazwę modułu.

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

Log Analytics

Jeśli zdecydujesz się korzystać z usługi Log Analytics, możesz wyświetlić wszystkie dane dziennika w dzienniku niestandardowym o nazwie WVDTenantScale_CL w obszarze Dzienniki niestandardowe w widoku Dzienniki obszaru roboczego usługi Log Analytics. Wymieniliśmy kilka przykładowych zapytań, które mogą okazać się przydatne.

  • Aby wyświetlić wszystkie dzienniki puli hostów, wprowadź następujące zapytanie:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Aby wyświetlić łączną liczbę aktualnie uruchomionych maszyn wirtualnych hosta sesji i aktywnych sesji użytkownika w puli hostów, wprowadź następujące zapytanie:

    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
    
  • Aby wyświetlić stan wszystkich maszyn wirtualnych hosta sesji w puli hostów, wprowadź następujące zapytanie:

    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
    
  • Aby wyświetlić wszelkie błędy i ostrzeżenia, wprowadź następujące zapytanie:

    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
    

Ograniczenia

Poniżej przedstawiono pewne ograniczenia dotyczące skalowania maszyn wirtualnych hosta sesji za pomocą tego skryptu skalowania:

  • Skrypt skalowania nie uwzględnia zmian czasu między standardowymi i dziennymi oszczędnościami.