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

Dans cet article, vous allez découvrir l’outil de mise à l’échelle qui utilise un runbook Azure Automation et Une application logique Azure pour mettre automatiquement à l’échelle les 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 les hôtes de session à l’aide de Azure Automation et d’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 mis en pool 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 la 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 pas mettre à l’échelle les hôtes de session à l’aide de Azure Automation et d’Azure Logic Apps avec la mise à l’échelle automatique sur le même pool d’hôtes. Vous devez utiliser l’un ou l’autre.

Configuration requise

Avant de commencer à configurer l’outil de mise à l’échelle, vérifiez que les éléments suivants sont prêts :

  • Un pool d’hôtes Azure Virtual Desktop.
  • Machines virtuelles du pool d’hôtes de session configurées et inscrites auprès du service Azure Virtual Desktop.
  • Un utilisateur avec le rôle de contrôle d’accès en fonction du rôle (RBAC) Contributeur attribué sur l’abonnement Azure pour créer les 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).

La machine que vous utilisez pour déployer l’outil doit avoir :

Si tout est prêt, commençons.

Créer ou mettre à jour un compte Azure Automation

Remarque

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 aurez besoin 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
    

    Remarque

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

  3. Exécutez l’applet de commande 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 renseigner des valeurs pour les paramètres ou 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
    

    Remarque

    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 souhaitée à la liste des régions autorisées.

  5. Si vous n’avez pas encore créé de compte Automation, la sortie de l’applet de commande inclut un URI de webhook chiffré dans la variable de compte Automation. Veillez à conserver un enregistrement de l’URI, car vous l’utiliserez comme paramètre lorsque vous configurez la planification d’exécution pour l’application logique Azure. Si vous mettez à jour un compte Automation existant, vous pouvez récupérer l’URI de webhook à l’aide de 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. Notez l’ID de l’espace de travail et la clé primaire, car vous devrez les réutiliser ultérieurement avec les paramètres lorsque vous configurez la planification d’exécution pour l’application logique Azure.

  7. Une fois que vous avez configuré votre compte Azure Automation, connectez-vous à votre abonnement Azure et case activée pour vous assurer que votre compte Azure Automation et le runbook approprié apparaissent dans le groupe de ressources spécifié, comme illustré dans l’image suivante :

    Image de la page de vue d’ensemble Azure montrant le compte et le runbook Azure Automation nouvellement créés.

    Pour case activée si votre webhook est là où il doit se trouver, sélectionnez le nom de votre runbook. Ensuite, accédez à la section Ressources de votre runbook et 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 ce n’est pas déjà fait. Les identités managées permettent à votre runbook d’accéder à d’autres ressources Microsoft Entra associées, ainsi qu’à authentifier des processus d’automatisation importants.

Pour configurer une identité managée, suivez les instructions décrites 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-la avec les autorisations de contributeur appropriées aux 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éer l’application logique Azure et la planification d’exécution pour terminer le processus d’installation initial.

Créer l’application logique Azure et planifier l’exécution

Enfin, vous devez créer l’application logique Azure et configurer une planification d’exécution pour votre nouvel outil de mise à l’échelle. Tout d’abord, téléchargez et importez le module PowerShell De virtualisation de bureau à utiliser dans votre session PowerShell si vous ne l’avez pas déjà fait.

  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 la planification d’exécution pour votre pool d’hôtes

    Remarque

    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é dans l’image suivante.

    Image de la page de vue d’ensemble d’un exemple d’application logique Azure.

    Pour apporter des modifications à la planification 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 d’application logique Azure et sélectionnez Modifier pour accéder à l’Designer Azure Logic App.

    Image de l’Designer d’application logique Azure. Les menus Périodicité et webhook qui permettent à l’utilisateur de modifier les heures de périodicité et le fichier webhook sont ouverts.

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 que vous pouvez trouver utiles.

Afficher les status de travail

Vous pouvez afficher une status résumée de tous les travaux de runbook ou afficher une status plus détaillée d’un travail de runbook spécifique dans le Portail Azure.

À droite de votre compte Azure Automation sélectionné, sous « Statistiques des travaux », vous pouvez afficher une liste de résumés de toutes les tâches de runbook. L’ouverture de la page Travaux sur le côté gauche de la fenêtre affiche l’état des travaux, les heures de début et les heures d’achèvement actuelles.

Capture d’écran de la page de status du travail.

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

Vous pouvez afficher 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 votre groupe de ressources hébergeant le compte Azure Automation, puis sélectionnez Vue d’ensemble. Dans la page vue d’ensemble, sélectionnez un travail sous Travaux récents pour afficher sa sortie de l’outil de mise à l’échelle, comme illustré dans l’image suivante.

Image de la fenêtre de sortie de l’outil de mise à l’échelle.

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

Vous pouvez case activée 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 dans le format v#.#.# sous la SYNOPSIS section . Vous trouverez le numéro de version le plus récent ici. 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 la 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 des problèmes

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

  • Journal complet de 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.

  • 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.

  • Numéro de version de chacun des modules PowerShell suivants installés dans votre compte Azure Automation. Pour trouver ces modules, ouvrez Azure Automation compte, sélectionnez Modules sous la section Ressources partagées dans le volet de 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 de journal dans un journal personnalisé nommé WVDTenantScale_CL sous Journaux personnalisés dans la vue Journaux de votre espace de travail Log Analytics. Nous avons répertorié quelques exemples de requêtes que vous pourriez trouver utiles.

  • Pour afficher 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 afficher 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 afficher les status 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 afficher 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
    

Limitations

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

  • Le script de mise à l’échelle ne prend pas en compte les changements de temps entre les économies standard et d’été.