Partager via


Didacticiel : Créer des pré-/post-événements à l’aide d’Azure Functions

S’applique à : ✔️ Machines virtuelles Windows ✔️ Machines virtuelles Linux ✔️ Environnement local ✔️ Machines virtuelles Azure ✔️ Serveurs compatibles avec Azure Arc.

Ce didacticiel explique comment créer des pré-événements et des post-événements pour démarrer et arrêter une machine virtuelle dans un flux de travail de correctifs programmés à l’aide d’Azure Functions.

Dans ce tutoriel, vous allez apprendre à :

  • Prérequis
  • Créer une application de fonction
  • Créer une fonction
  • Créer un abonnement d’événement

Prérequis

  1. Vérifiez que vous utilisez le runbook PowerShell 7.2.

  2. Attribuer l’autorisation aux identités managées : vous pouvez attribuer des autorisations à l’identité managée appropriée. Le runbook peut utiliser l’identité managée affectée par le système du compte Automation ou une identité managée affectée par l’utilisateur.

    Vous pouvez utiliser le portail ou les cmdlets PowerShell pour attribuer des autorisations à chaque identité :

    Effectuez les étapes dans Attribuer des rôles Azure à l’aide du Portail Microsoft Azure pour attribuer des autorisations


  1. Importez le module Az.ResourceGraph, vérifiez que le module est mis à jour vers ThreadJob avec le module version 2.0.3.

Créer une application de fonction

  1. Suivez les étapes pour Créer une application de fonction.

  2. Après avoir créé l’application de fonction, accédez à la ressource et vérifiez que vous chargez les dépendances en procédant de la manière suivante :

    Remarque

    Vous devez charger les dépendances uniquement pour la première fois. Si le chargement des dépendances PowerShell échoue. Vérifiez les dernières versions d’AZ et AZ.ResourceGraph.

    1. Dans l’application de fonction, sélectionnez Fichiers d’application.

    2. Sous host.json, activez ManagedDependecy sur True et sélectionnez requirements.psd1.

    3. Sous requirements.psd1, collez le code suivant :

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Cliquez sur Enregistrer.

  3. Redémarrez l’application de fonction à partir de l’onglet Vue d’ensemble pour charger les dépendances mentionnées dans le fichier requirements.psd1.

Créer une fonction

  1. Après avoir créé l’application de fonction, accédez à Ressource, puis, dans Vue d’ensemble, sélectionnez Créer dans le portail Azure.

  2. Dans la fenêtre Créer une fonction, effectuez les sélections suivantes :

    1. Pour la propriété de l’environnement de développement, sélectionnez Développer dans le portail
    2. Dans Sélectionner un modèle, sélectionnez Event Grid.
    3. Dans Détails du modèle, entrez le nom dans Nouvelle fonction, puis sélectionnez Créer. Capture d’écran des options à sélectionner lors de la création d’une fonction.
  3. Dans la fonction Event Grid, sélectionnez Code + Test dans le menu de gauche, collez le code suivant et sélectionnez Enregistrer.

    # Make sure that we are using eventGridEvent for parameter binding in Azure function.
    param($eventGridEvent, $TriggerMetadata)
    
    Connect-AzAccount -Identity
    
    # Install the Resource Graph module from PowerShell Gallery
    # Install-Module -Name Az.ResourceGraph
    
    $maintenanceRunId = $eventGridEvent.data.CorrelationId
    $resourceSubscriptionIds = $eventGridEvent.data.ResourceSubscriptionIds
    
    if ($resourceSubscriptionIds.Count -eq 0) {
        Write-Output "Resource subscriptions are not present."
        break
    }
    
    Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]"
    
    $argQuery = @"
        maintenanceresources 
        | where type =~ 'microsoft.maintenance/applyupdates'
        | where properties.correlationId =~ '$($maintenanceRunId)'
        | where id has '/providers/microsoft.compute/virtualmachines/'
        | project id, resourceId = tostring(properties.resourceId)
        | order by id asc
    "@
    
    Write-Output "Arg Query Used: $argQuery"
    
    $allMachines = [System.Collections.ArrayList]@()
    $skipToken = $null
    
    do
    {
        $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds
        $skipToken = $res.SkipToken
        $allMachines.AddRange($res.Data)
    } while ($skipToken -ne $null -and $skipToken.Length -ne 0)
    if ($allMachines.Count -eq 0) {
        Write-Output "No Machines were found."
        break
    }
    
    $jobIDs= New-Object System.Collections.Generic.List[System.Object]
    $startableStates = "stopped" , "stopping", "deallocated", "deallocating"
    
    $allMachines | ForEach-Object {
        $vmId =  $_.resourceId
    
        $split = $vmId -split "/";
        $subscriptionId = $split[2]; 
        $rg = $split[4];
        $name = $split[8];
    
        Write-Output ("Subscription Id: " + $subscriptionId)
    
        $mute = Set-AzContext -Subscription $subscriptionId
        $vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute
    
        $state = ($vm.Statuses[1].DisplayStatus -split " ")[1]
        if($state -in $startableStates) {
            Write-Output "Starting '$($name)' ..."
    
            $newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId
            $jobIDs.Add($newJob.Id)
        } else {
            Write-Output ($name + ": no action taken. State: " + $state) 
        }
    }
    
    $jobsList = $jobIDs.ToArray()
    if ($jobsList)
    {
        Write-Output "Waiting for machines to finish starting..."
        Wait-Job -Id $jobsList
    }
    
    foreach($id in $jobsList)
    {
        $job = Get-Job -Id $id
        if ($job.Error)
        {
            Write-Output $job.Error
        }
    }
    
  4. Sélectionnez Intégration dans le menu de gauche et modifiez le nom du paramètre Déclencheur d’événement sous Déclencheur. Utilisez le même nom de paramètre donné dans la fenêtre Code + Test. Dans l’exemple, le paramètre est eventGridEvent.

    Capture d’écran du paramètre eventGridEvent.

  5. Cliquez sur Enregistrer

Créez un abonnement à un Événement

  1. Connectez-vous au Portail Microsoft Azure et accédez à votre Azure Update Manager.
  2. Sous Gérer, sélectionnez Machines, Configuration de maintenance.
  3. Dans la page Configuration de la maintenance, sélectionnez la configuration.
  4. Sous Paramètres, sélectionnez Événements.
  5. Sélectionnez +Abonnement aux événements pour créer un événement de pré/post-maintenance.
  6. Dans la page Créer un abonnement aux événements, entrez les détails suivantes :
    1. Dans la section Détails des abonnements aux événements, indiquez un nom approprié.
    2. Conservez Schéma Event Grid comme schéma.
    3. Dans la section Types d’événements, Filtrer sur les types d’événements.
      1. Sélectionnez Événement de pré-maintenance pour un pré-événement.
        • Dans la section Détails du point de terminaison, sélectionnez le point de terminaison Azure Function, puis Configurer un point de terminaison.
        • Fournissez les détails appropriés, tels que les groupes de ressources, l’application de fonction pour déclencher l’événement.
      2. Sélectionnez Événement de post-maintenance pour un post-événement.
        • Dans la section Détails du point de terminaison, sélectionnez le point de terminaison Azure Function, et Configurer un point de terminaison.
        • Fournissez les détails appropriés, tels que le groupe de ressources et l’application de fonction pour déclencher l’événement.
  7. Sélectionnez Créer.

Vous pouvez également utiliser des comptes de stockage Azure et Event Hub pour stocker, envoyer et recevoir des événements. Découvrez-en davantage sur Comment créer des Event Hub et sur les files d’attente de stockage.

Étapes suivantes