Configurer l’outil de mise à l’échelle en utilisant Azure Automation et Azure Logic Apps pour Azure Virtual Desktop

Dans cet article, vous découvrez l’outil de mise à l’échelle qui utilise un runbook Azure Automation et Azure Logic App pour mettre à l’échelle automatiquement des machines virtuelles hôtes de session dans votre environnement Azure Virtual Desktop. Pour en savoir plus sur l’outil de mise à l’échelle, consultez Mettre à l’échelle des hôtes de session en utilisant Azure Automation et Azure Logic Apps.

Remarque

  • La solution de mise à l’échelle automatique native d’Azure Virtual Desktop est généralement disponible pour les pools d’hôtes groupés et personnels et effectue automatiquement un scale-in ou un scale-out des machines virtuelles hôtes de session en fonction de la planification de mise à l’échelle. Nous vous recommandons d’utiliser la mise à l’échelle automatique pour faciliter la configuration. Pour plus d’informations, consultez Plans de mise à l’échelle automatique.

  • Vous ne pouvez mettre à l’échelle des hôtes de session en utilisant Azure Automation et Azure Logic Apps avec la mise à l’échelle automatique sur le même pool d’hôtes. Vous devez utiliser l’une ou l’autre.

Prérequis

Avant de commencer à configurer l'outil de mise à l'échelle, assurez-vous que vous disposez de ce qui suit :

  • Un pool d’hôtes Azure Virtual Desktop.
  • Machines virtuelles de pool d’hôtes de session configurées et inscrites auprès du service Azure Virtual Desktop.
  • Un utilisateur disposant du rôle RBAC Contributeur dans l’abonnement Azure pour créer des ressources. Vous aurez également besoin du rôle RBAC Administrateur d’application et/ou Propriétaire pour créer une identité managée.
  • Un espace de travail Log Analytics (facultatif).

L'ordinateur que vous utilisez pour déployer l'outil doit disposer de ce qui suit :

Si tout est prêt, commençons.

Créer ou mettre à jour un compte Azure Automation

Notes

Si vous disposez déjà d’un compte Azure Automation avec un runbook exécutant une version antérieure du script de mise à l’échelle, il vous suffit de suivre les instructions ci-dessous pour vous assurer qu’il est mis à jour.

Tout d'abord, vous devez disposer d'un compte Azure Automation pour exécuter le runbook PowerShell. Le processus décrit dans cette section est valide même si vous disposez d’un compte Azure Automation existant que vous souhaitez utiliser pour configurer le runbook PowerShell. Voici comment le configurer :

  1. Ouvrez PowerShell.

  2. Exécutez l’applet de commande suivante pour vous connecter à votre compte Azure.

    Login-AzAccount
    

    Notes

    Votre compte doit disposer de droits de contributeur sur l’abonnement Azure où vous souhaitez déployer l’outil de mise à l’échelle.

  3. Exécutez la cmdlet suivante pour télécharger le script de création du compte 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. Exécutez l’applet de commande suivante pour exécuter le script et créer le compte Azure Automation. Vous pouvez soit renseigner les valeurs des paramètres, soit les commenter pour utiliser leurs valeurs par défaut.

    $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
    

    Notes

    Si votre stratégie ne vous permet pas de créer des ressources de script de mise à l’échelle dans une région spécifique, mettez à jour l’attribution de stratégie et ajoutez la région de votre choix à la liste des régions autorisées.

  5. Si vous n’avez pas créé de compte Automation avant, la sortie de l’applet de commande comprend un URI de webhook chiffré dans la variable de compte Automation. Prenez note de l’URI, car vous l’utiliserez comme paramètre lors de la configuration du calendrier d’exécution pour l’application logique Azure. Si vous mettez à jour un compte Automation existant, vous pouvez récupérer l’URI du webhook en utilisant PowerShell pour accéder aux variables.

  6. Si vous avez spécifié le paramètre WorkspaceName pour Log Analytics, la sortie de l’applet de commande inclut également l’ID de l’espace de travail Log Analytics et sa clé primaire. Prenez note de l’ID d’espace de travail et de la clé principale, car vous devrez les réutiliser ultérieurement avec des paramètres lors de la configuration de la planification d’exécution pour l’application logique Azure.

  7. Après avoir configuré votre compte Azure Automation, connectez-vous à votre abonnement Azure et vérifiez que votre compte Azure Automation et le runbook correspondant apparaissent dans le groupe de ressources spécifié, comme illustré ci-dessous :

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

    Pour vérifier si votre webhook se trouve au bon emplacement, sélectionnez le nom de votre runbook. Accédez ensuite à la section des ressources de votre runbook, puis sélectionnez Webhooks.

Créer une identité managée

Maintenant que vous disposez d’un compte Azure Automation, vous devez également configurer une identité managée si vous ne l’avez pas déjà fait. Les identités managées aideront votre runbook à accéder à d’autres ressources associées à Microsoft Entra, ainsi qu’à authentifier des processus d’automatisation importants.

Pour configurer une identité managée, suivez les instructions fournies dans Utilisation d’une identité managée affectée par le système pour un compte Azure Automation. Une fois que vous avez créé une identité managée, attribuez-lui les autorisations de contributeur appropriées sur les ressources Azure Virtual Desktop, telles que les pools d’hôtes, les machines virtuelles, etc. Une fois que vous avez terminé, revenez à cet article et créez l’application logique Azure et la planification d’exécution pour terminer le processus de configuration initiale.

Créer l'application logique Azure et le calendrier d'exécution

Enfin, vous devrez créer l'application logique Azure et configurer un calendrier d'exécution pour votre nouvel outil de mise à l'échelle. Si ce n’est déjà fait, commencez par télécharger et importer le module Desktop Virtualization PowerShell à utiliser dans votre session PowerShell.

  1. Ouvrez PowerShell.

  2. Exécutez l’applet de commande suivante pour vous connecter à votre compte Azure.

    Login-AzAccount
    
  3. Exécutez l’applet de commande suivante pour télécharger le script de création de l’application logique 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. Exécutez le script PowerShell suivant pour créer l’application logique Azure et le calendrier d’exécution pour votre pool d’hôtes.

    Notes

    Vous devez exécuter ce script pour chaque pool d’hôtes que vous souhaitez mettre à l’échelle automatiquement, mais vous n’avez besoin que d’un seul compte 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
    

    Une fois le script exécuté, l’application logique Azure doit apparaître dans un groupe de ressources, comme illustré ci-dessous.

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

    Pour apporter des modifications au calendrier d’exécution, telles que la modification de l’intervalle de périodicité ou du fuseau horaire, accédez au planificateur de mise à l’échelle automatique de l’application logique Azure et sélectionnez Modifier pour accéder au concepteur d’application logique 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.

Gérer votre outil de mise à l'échelle

Maintenant que vous avez créé votre outil de mise à l'échelle, vous pouvez accéder à sa sortie. Cette section décrit quelques fonctionnalités qui pourraient vous être utiles.

Afficher le statut de la tâche

Vous pouvez afficher un résumé de l'état de tous les travaux du runbook ou afficher un état plus approfondi d'un travail spécifique sur le portail Azure.

À droite du compte Azure Automation sélectionné, sous « Statistiques des travaux », vous pouvez afficher la liste des résumés de tous les travaux du runbook. Ouvrez la page Travaux sur le côté gauche de la fenêtre pour afficher l'état actuel des travaux, ainsi que les heures de début et de fin de ceux-ci.

A screenshot of the job status page.

Afficher les journaux et la sortie de l'outil de mise à l'échelle

Vous pouvez consulter les journaux des opérations de scale-out et de scale-in en ouvrant votre runbook et en sélectionnant le travail.

Accédez au runbook dans le groupe de ressources qui héberge le compte Azure Automation et sélectionnez Présentation. Dans la page de présentation, sélectionnez un travail sous Travaux récents pour afficher la sortie de son outil de mise à l’échelle, comme illustré ci-dessous.

An image of the output window for the scaling tool.

Vérifier le numéro de version du script de runbook

Vous pouvez vérifier la version du script de runbook que vous utilisez en ouvrant le fichier de runbook dans votre compte Azure Automation et en sélectionnant Afficher. Un script pour le runbook s’affiche sur le côté droit de l’écran. Dans le script, vous verrez le numéro de version au format v#.#.# sous la section SYNOPSIS. Vous trouverez ici le numéro de version le plus récent. Si vous ne voyez pas de numéro de version dans votre script de runbook, cela signifie que vous exécutez une version antérieure du script et que vous devez le mettre à jour immédiatement. Si vous devez mettre à jour votre script de runbook, suivez les instructions fournies dans Créer ou mettre à jour un compte Azure Automation.

Signaler un problème

Quand vous signalez un problème, vous devez fournir les informations suivantes pour nous aider à le résoudre :

  • Un journal complet obtenu sous l’onglet Tous les journaux du travail à l’origine du problème. Pour savoir comment obtenir le journal, suivez les instructions fournies dans Afficher les journaux et la sortie de l’outil de mise à l’échelle. Si le journal contient des informations sensibles ou privées, vous pouvez les supprimer avant de nous soumettre le problème.

  • La version du script de runbook que vous utilisez. Pour savoir comment obtenir le numéro de version, consultez Vérifier le numéro de version du script de runbook.

  • Le numéro de version de chacun des modules PowerShell suivants installés dans votre compte Azure Automation. Pour trouver ces modules, ouvrez le compte Azure Automation, sélectionnez Modules dans la section Ressources partagées dans le volet gauche de la fenêtre, puis recherchez le nom du module.

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

Log Analytics

Si vous avez décidé d’utiliser Log Analytics, vous pouvez afficher toutes les données des journaux dans un journal personnalisé nommé WVDTenantScale_CL sous Journaux personnalisés dans la vue Journaux de votre espace de travail Log Analytics. Nous avons listé certains exemples de requêtes qui peuvent vous être utiles.

  • Pour voir tous les journaux d’un pool d’hôtes, entrez la requête suivante :

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Pour voir le nombre total de machines virtuelles hôtes de session en cours d’exécution et de sessions utilisateur actives dans votre pool d’hôtes, entrez la requête suivante :

    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
    
  • Pour voir l’état de toutes les machines virtuelles hôtes de session dans un pool d’hôtes, entrez la requête suivante :

    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
    
  • Pour voir les erreurs et les avertissements, entrez la requête suivante :

    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
    

Limites

Voici quelques limitations relatives à la mise à l’échelle des machines virtuelles hôtes de session à l’aide de ce script de mise à l’échelle :

  • Le script de mise à l’échelle ne prend pas en compte le passage de l’heure d’hiver à l’heure d’été, et inversement.