Configurar a ferramenta de dimensionamento usando a Automação do Azure e os Aplicativos Lógicos do Azure para Área de Trabalho Virtual do Azure

Neste artigo, você conhecerá a ferramenta de dimensionamento que usa um runbook da Automação do Azure e o Aplicativo Lógico do Azure, para dimensionar automaticamente as VMs de hosts de sessão no seu ambiente da Área de Trabalho Virtual do Azure. Para saber mais sobre a ferramenta de dimensionamento, consulte Dimensionamento de hosts de sessão usando a Automação do Azure e os Aplicativos Lógicos do Azure.

Observação

  • A solução de Escala automática nativa da Área de Trabalho Virtual do Azure está em disponibilidade geral para pools de hosts pessoais e em pool e reduzirá horizontalmente ou expandirá de forma automática as VMs de host da sessão com base no agendamento da escala. É recomendável usar a Escala automática para facilitar a configuração. Para mais informações, confira Planos de colocação em escala de dimensionamento automático.

  • Você não pode dimensionar hosts da sessão usando a Automação do Azure e os Aplicativos Lógicos do Azure junto com o dimensionamento automático no mesmo pool de host. Você deve usar um ou outro.

Pré-requisitos

Antes de começar a configurar a ferramenta de dimensionamento, verifique se estas opções estão prontas:

  • Um pool de hosts da Área de Trabalho Virtual do Azure.
  • Sessão de pool de hosts de VMs, configuradas e registradas com o serviço da Área de Trabalho Virtual do Azure.
  • Um usuário com a função RBAC (controle de acesso baseado em função) de Colaborador atribuída na assinatura do Azure para criar os recursos. Você também precisará da função RBAC de Administrador do aplicativo e/ou proprietário para criar uma conta de identidade gerenciada.
  • Um workspace do Log Analytics (opcional).

O computador que você usar para implantar a ferramenta deverá ter:

Se você estiver com tudo pronto, vamos começar.

Criar ou atualizar uma conta da Automação do Azure

Observação

Se você já tiver uma conta da Automação do Azure com um runbook executando uma versão mais antiga do script de dimensionamento, tudo o que precisa fazer é seguir as instruções abaixo para verificar se ele está atualizado.

Primeiro, será preciso uma conta de Automação do Azure para executar o runbook do PowerShell. O processo que esta seção descreve é válido mesmo que você tenha uma conta da Automação do Azure que você deseja usar para configurar o runbook do PowerShell. Veja como configurá-lo:

  1. Abra o PowerShell.

  2. Execute o seguinte cmdlet para entrar na sua conta do Azure.

    Login-AzAccount
    

    Observação

    A conta deve ter direitos de colaborador na assinatura do Azure em que você deseja implantar a ferramenta de dimensionamento.

  3. Execute o seguinte cmdlet para baixar o script e criar a conta de Automação do 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. Execute o seguinte cmdlet para executar o script e criar a conta da Automação do Azure: Você pode preencher valores para os parâmetros ou comentá-los para usar os padrões.

    $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
    

    Observação

    Se a política não permitir que você crie recursos de script de dimensionamento em uma região específica, atualize a atribuição de política e adicione a região que desejada à lista de regiões permitidas.

  5. Se você ainda não havia criado uma conta de automação, a saída do cmdlet incluirá um URI de webhook criptografado na variável de conta de automação. Não deixe de registrar o URI. Você vai usá-lo como parâmetro ao configurar o agendamento de execução para os Aplicativos Lógicos do Azure. Se você estiver atualizando uma conta de automação existente, poderá recuperar o URI do webhook usando o PowerShell para acessar variáveis.

  6. Se você tiver especificado o parâmetro WorkspaceName para Log Analytics, a saída do cmdlet também incluirá a ID do espaço de trabalho do Log Analytics e sua chave primária. Anote a ID do workspace e a chave primária porque você precisará usá-las novamente mais tarde com parâmetros ao configurar o agendamento de execução para o Aplicativo Lógico do Azure.

  7. Depois de configurar sua conta de Automação do Azure, entre na sua assinatura do Azure e verifique se sua conta de Automação do Azure e o respectivo runbook apareceram no grupo de recursos especificado, conforme mostrado na seguinte imagem:

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

    Para verificar se o webhook está no local certo, selecione o nome dele. Em seguida, vá para a seção Recursos do seu runbook e selecione Webhooks.

Criar uma identidade gerenciada

Agora que você tem uma conta de Automação do Azure, também precisará configurar uma identidade gerenciada, caso ainda não tenha feito isso. As identidades gerenciadas ajudarão seu runbook a acessar outros recursos relacionados ao Microsoft Entra, bem como autenticar processos de automação importantes.

Para configurar uma identidade gerenciada, siga as instruções em Usando uma identidade gerenciada atribuída pelo sistema para uma conta de Automação do Azure. Depois de criar uma identidade gerenciada, atribua-a com permissões de colaborador apropriadas aos recursos da Área de Trabalho Virtual do Azure, como pools de host, VMs etc. Quando terminar, retorne a este artigo e Crie o Aplicativo Lógico do Azure e o agendamento de execução para concluir o processo de instalação inicial.

Criar o Aplicativo Lógico do Azure e o agendamento de execução

Por fim, será preciso criar o Aplicativo Lógico do Azure e configurar um agendamento de execução para sua nova ferramenta de dimensionamento. Primeiro, baixe e importe o módulo do PowerShell da Virtualização da Área de Trabalho para usá-lo na sessão do PowerShell, caso ainda não tenha feito isso.

  1. Abra o PowerShell.

  2. Execute o seguinte cmdlet para entrar na sua conta do Azure.

    Login-AzAccount
    
  3. Execute o seguinte cmdlet para baixar o script e criar o aplicativo lógico do 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. Execute o seguinte script do PowerShell para criar o aplicativo lógico e o agendamento de execução para o pool de hosts:

    Observação

    Você precisará executar esse script para cada pool de hosts que deseja fazer o dimensionamento automático, mas precisa apenas de uma conta da Automação do 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
    

    Depois de executar o script, o aplicativo lógico deve aparecer em um grupo de recursos, conforme mostrado na imagem a seguir.

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

    Para fazer alterações no agendamento de execução, como alterar o intervalo de recorrência ou o fuso horário, acesse o Agendador de dimensionamento automático dos Aplicativos Lógicos do Azure e selecione Editar para ir para o Designer de aplicativos.

    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.

Gerenciar a ferramenta de dimensionamento

Agora que você criou a ferramenta de dimensionamento, pode acessar a saída dela. Esta seção descreve alguns recursos que podem ser úteis.

Exibir status do trabalho

No portal do Azure, é possível exibir um status resumido de todos os trabalhos do runbook ou exibir um status mais detalhado de um trabalho específico do runbook.

À direita da conta de Automação selecionada, em "Estatísticas de Trabalho", é possível exibir uma lista de resumos de todos os trabalhos do runbook. Abrir a página Trabalhos no lado esquerdo da janela mostrará os status do trabalho atual, os horários de início e de conclusão.

A screenshot of the job status page.

Exibir logs e saída da ferramenta de dimensionamento

Exiba os logs das operações de expansão e redução abrindo o runbook e selecionando o nome do trabalho.

Navegue até o runbook no grupo de recursos que hospeda a conta da Automação do Azure e selecione Visão geral. Na página Visão geral, selecione um trabalho em Trabalhos recentes para exibir a saída da ferramenta de dimensionamento, conforme mostrado na imagem a seguir.

An image of the output window for the scaling tool.

Verificar o número de versão do script do runbook

Você pode verificar qual versão do script de runbook você está usando abrindo o arquivo de runbook em sua conta da Automação do Azure e selecionando Exibir. Um script para o runbook será exibido no lado direito da tela. No script, você verá o número de versão no formato v#.#.# na seção SYNOPSIS. A versão mais recente encontra-se aqui. Se você não vir um número de versão no script de runbook, significa que está executando uma versão anterior do script e deve atualizá-lo imediatamente. Se você precisar atualizar o script de runbook, siga as instruções em Criar ou atualizar uma conta da Automação do Azure.

Problemas de relatórios

Ao relatar um problema, você precisará fornecer as seguintes informações para nos ajudar a solucioná-lo:

  • Um log completo da guia Todos os logs no trabalho que causou o problema. Para saber como obter o log, siga as instruções em Exibir logs e saída da ferramenta de dimensionamento. Se houver alguma informação confidencial ou privada no log, você pode removê-la antes de nos enviar o problema.

  • A versão do script de runbook que você está usando. Para saber como obter o número de versão, consulte Verificar o número de versão do script do runbook

  • O número de versão de cada um dos seguintes módulos do PowerShell instalados na conta da Automação do Azure. Para encontrar esses módulos, abra a conta da Automação do Azure, selecione Módulos na seção Recursos Compartilhados no painel no lado esquerdo da janela e procure o nome do módulo.

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

Log Analytics

Se você decidiu usar Log Analytics, poderá exibir todos os dados de log em um log personalizado chamado WVDTenantScale_CL em Logs Personalizados na exibição Logs do Espaço de Trabalho do LogAnalytics. Listamos algumas consultas de exemplo que podem ser úteis.

  • Para ver todos os logs de um pool de host, insira a seguinte consulta:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Para visualizar o número total de VMs host da sessão que estão em execução no momento e de sessões de usuário ativas no seu pool de host, insira a seguinte consulta:

    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
    
  • Para visualizar o status de todas as VMs host da sessão em um pool de host, insira a seguinte consulta:

    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
    
  • Para visualizar eventuais erros e avisos, insira a seguinte consulta:

    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
    

Limitações

Aqui estão algumas limitações com o dimensionamento de VMs de host de sessão com este script de dimensionamento:

  • O script de dimensionamento não considera as alterações de tempo entre o horário de verão e o padrão.