Настройка средства масштабирования с помощью службы автоматизации Azure и Azure Logic Apps для Виртуального рабочего стола Azure

В этой статье вы узнаете о средстве масштабирования, которое использует runbook службы автоматизации Azure и приложения логики Azure для автоматического масштабирования виртуальных машин узлов сеансов в среде Виртуального рабочего стола Azure. Дополнительные сведения о средстве масштабирования см. в статье Масштабирование узлов сеансов с помощью службы автоматизации Azure и Azure Logic Apps.

Примечание.

  • Собственное решение автомасштабирования Виртуального рабочего стола Azure обычно доступно для пулов и персональных пулов узлов и автоматически масштабируется на виртуальных машинах узла сеансов в зависимости от расписания масштабирования. Мы рекомендуем использовать автомасштабирование для упрощения настройки. Дополнительные сведения см. в разделе "Планы масштабирования автомасштабирования".

  • Вы не можете масштабировать узлы сеансов с помощью службы автоматизации Azure и Azure Logic Apps, если в этом же пуле узлов применяется автомасштабирование. Необходимо использовать только одну из этих функций.

Необходимые компоненты

Прежде чем приступить к настройке средства масштабирования, убедитесь, что у вас настроены следующие компоненты.

  • Пул узлов Виртуального рабочего стола Azure.
  • Виртуальные машины пула сеансов настроены и зарегистрированы в службе виртуального рабочего стола Azure.
  • Пользователь с ролью управления доступом на основе ролей участника (RBAC), назначенный подписке Azure для создания ресурсов. Для создания управляемого удостоверения также потребуется роль администратора приложения и (или) владельца RBAC.
  • Рабочая область Log Analytics (необязательно).

На компьютере для развертывания средства должны быть установлены следующие компоненты.

Если у вас все готово, давайте приступим.

Создание или обновление учетной записи службы автоматизации Azure

Примечание.

Если у вас уже есть учетная запись службы автоматизации Azure с модулем Runbook, на котором запущена более старая версия скрипта масштабирования, необходимо выполнить приведенные ниже инструкции, чтобы обязательно провести его обновление.

Сначала вам потребуется учетная запись службы автоматизации Azure для запуска модуля PowerShell runbook. Процесс, описываемый в этом разделе, необходим, даже если у вас есть учетная запись службы автоматизации Azure, которую вы хотите использовать для настройки модуля Runbook PowerShell. Вот как настроить его:

  1. Откройте средство PowerShell.

  2. Выполните следующий командлет, чтобы войти в учетную запись Azure.

    Login-AzAccount
    

    Примечание.

    Ваша учетная запись должна иметь права участника подписки Azure, в которой вы планируете развернуть средство масштабирования.

  3. Выполните следующий командлет, чтобы скачать сценарий для создания учетной записи службы автоматизации 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. Выполните следующий командлет, чтобы запустить скрипт и создать учетную запись службы автоматизации Azure. Можно либо ввести значения для параметров, либо закомментировать их для использования их значений по умолчанию.

    $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
    

    Примечание.

    Если политика не позволяет создавать ресурсы для скрипта масштабирования в определенном регионе, обновите назначение политики и добавьте требуемый регион в список разрешенных регионов.

  5. Если вы еще не создали учетную запись службы автоматизации, выходные данные командлета будут содержать зашифрованный URI веб-перехватчика в переменной учетной записи службы автоматизации. Обязательно сохраните URI, так как вам будет необходимо его использовать в качестве параметра при настройке расписания выполнения приложений логики Azure Logic. При обновлении существующей учетной записи службы автоматизации вы можете получить URI веб-перехватчика, используя доступ к переменным в PowerShell.

  6. Если вы указали параметр WorkspaceName для Log Analytics, выходные данные командлета также будут содержать идентификатор рабочей области Log Analytics и ее первичный ключ. Запишите идентификатор рабочей области и первичный ключ, так как вы будете использовать их позже с параметрами при настройке расписания выполнения для приложения логики Azure.

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

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

    Чтобы проверить, что веб-перехватчик находится на своем месте, выберите имя модуля runbook. Затем перейдите к разделу ресурсов модуля runbook и выберите Веб-перехватчики.

Создание управляемого удостоверения

Теперь, когда у вас есть учетная запись служба автоматизации Azure, вам также потребуется настроить управляемое удостоверение, если вы еще не сделали этого. Управляемые удостоверения помогут runbook получить доступ к другим связанным ресурсам Microsoft Entra, а также выполнять проверку подлинности важных процессов автоматизации.

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

Создание приложения логики Azure и расписания выполнения

Наконец, вам потребуется создать приложение логики Azure и настроить расписание выполнения для нового инструмента масштабирования. Сначала скачайте и импортируйте модуль Desktop Virtualization PowerShell для использования в сеансе PowerShell (если вы еще это не сделали).

  1. Откройте средство PowerShell.

  2. Выполните следующий командлет, чтобы войти в учетную запись Azure.

    Login-AzAccount
    
  3. Выполните следующий командлет, чтобы скачать скрипт для создания учетной записи приложения логики Azure Logic.

    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. Запустите следующий скрипт PowerShell, чтобы создать приложение логики Azure Logic и расписание выполнения для вашего пула узлов

    Примечание.

    Вам потребуется исполнить этот скрипт по каждому пулу узлов, которому требуется автомасштабирование, при этом вам понадобится только одна учетная запись службы автоматизации 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
    

    После выполнения скрипта приложение логики Azure Logic должно отобразиться в группе ресурсов, как показано на следующем рисунке.

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

    Чтобы внести изменения в расписание выполнения, например изменить интервал повторения или часовой пояс, перейдите к планировщику автомасштабирования Azure Logic и нажмите Редактировать, чтобы перейти в конструктор приложений Azure Logic App Designer.

    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.

Управление средством масштабирования

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

Просмотр статуса задания

Вы можете просмотреть сводку по состоянию всех заданий runbook или просмотреть подробное состояние определенного задания на портале Azure.

В правой части выбранной учетной записи службы автоматизации Azure в разделе "Статистика заданий" можно просмотреть список сводных данных всех заданий runbook. При открытии страницы Задания в левой части окна отображаются текущие состояния заданий, время запуска и время завершения.

A screenshot of the job status page.

Просмотр журналов и выходных данных средства масштабирования

Чтобы просмотреть журналы операций увеличения и уменьшения масштаба, откройте модуль runbook и выберите задание.

Перейдите к модулю runbook в группе ресурсов, в которой размещена учетная запись службы автоматизации Azure, и выберите Обзор. На странице обзора выберите задание в разделе Недавние задания, чтобы просмотреть данные его средства масштабирования, как показано на следующем рисунке.

An image of the output window for the scaling tool.

Проверка номера версии скрипта Runbook

Чтобы узнать, какую версию скрипта Runbook вы используете, откройте файл Runbook в учетной записи службы автоматизации Azure и выберите Вид. В правой части экрана появится скрипт для модуля Runbook. В скрипте вы увидите номер его версии в формате v#.#.#, см. в разделе SYNOPSIS. Последний номер версии можно увидеть здесь. Если номер версии в скрипте Runbook не отображается, это означает, что вы используете более раннюю версию скрипта, вам необходимо тут же ее обновить. При необходимости обновить скрипт Runbook следуйте инструкциям в разделе Создание или обновление учетной записи службы автоматизации Azure.

Создание отчетов о проблемах

При возникновении проблемы вам необходимо предоставить следующие сведения, они помогут нам в устранении неполадок:

  • Полный журнал со вкладки Все журналы в задании, вызвавшем ошибку. Чтобы узнать, как получить этот журнал, следуйте инструкциям в разделе Просмотр журналов и выходных данных средства масштабирования. Если в журнале есть конфиденциальная или частная информация, вы можете ее удалить, прежде чем отправить нам вашу проблему.

  • Версия скрипта Runbook, который вы используете. Чтобы узнать, как получить номер версии, см. раздел Проверка номера версии скрипта Runbook

  • Номер версии каждого из следующих модулей PowerShell, установленных в вашей учетной записи службы автоматизации Azure. Чтобы найти эти модули, откройте учетную запись службы автоматизации Azure, выберите Модули в разделе Общие ресурсы на панели в левой части окна, а затем найдите имя модуля.

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

Служба Log Analytics

Если вы решили использовать Log Analytics, все данные журнала можно просматривать в пользовательском журнале под именем WVDTenantScale_CL в разделе Пользовательские журналы в представлении Журналы рабочей области Log Analytics. Некоторые примеры запросов, которые могут вам пригодиться, перечислены далее.

  • Чтобы просмотреть все журналы для пула узлов, введите следующий запрос:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Чтобы просмотреть общее число работающих в настоящее время виртуальных машин узла сеансов и активных пользовательских сеансов в пуле узлов, введите следующий запрос:

    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
    
  • Чтобы просмотреть состояние всех виртуальных машин узла сеансов в пуле узлов, введите следующий запрос:

    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
    
  • Чтобы просмотреть ошибки и предупреждения, введите следующий запрос:

    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
    

Ограничения

Ниже приведены некоторые ограничения, связанные с масштабированием виртуальных машин узла сеансов с помощью этого скрипта масштабирования:

  • Скрипт масштабирования не учитывает изменения времени между стандартной и дневной экономией.