Megosztás a következőn keresztül:


Oktatóanyag: Elő- és utóesemények létrehozása az Azure Functions használatával

A következőkre vonatkozik: ✔️ Windows rendszerű virtuális ✔️ gépek Linux ✔️ rendszerű virtuális gépek helyszíni környezete ✔️ Azure-beli ✔️ virtuális gépek Azure Arc-kompatibilis kiszolgálókra.

Ez az oktatóanyag bemutatja, hogyan hozhat létre elő- és közzétételi eseményeket egy virtuális gép elindításához és leállításához egy ütemezési javítás munkafolyamatában az Azure Functions használatával.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Előfeltételek
  • Függvényalkalmazás létrehozása
  • Függvény létrehozása
  • Esemény-előfizetés létrehozása

Előfeltételek

  1. Győződjön meg arról, hogy a PowerShell 7.2 runbookot használja.

  2. Engedélyek hozzárendelése felügyelt identitásokhoz – Engedélyeket rendelhet a megfelelő felügyelt identitáshoz. A runbook használhatja az Automation-fiók rendszer által hozzárendelt felügyelt identitását vagy egy felhasználó által hozzárendelt felügyelt identitást.

    A portál vagy a PowerShell-parancsmagok segítségével engedélyeket rendelhet az egyes identitásokhoz:

    Kövesse az Azure-szerepkörök hozzárendelése az Azure Portallal az engedélyek hozzárendeléséhez című szakaszban leírt lépéseket


  1. Importálja a modult Az.ResourceGraph , és győződjön meg arról, hogy a modul a 2.0.3-es verziójú ThreadJob-ra frissült.

Függvényalkalmazás létrehozása

  1. Kövesse a függvényalkalmazás létrehozásához szükséges lépéseket.

  2. A függvényalkalmazás létrehozása után nyissa meg az erőforrást, és győződjön meg arról, hogy az alábbi lépések végrehajtásával tölti be a függőségeket:

    Feljegyzés

    A függőségeket csak első alkalommal kell betöltenie. Ha a PowerShell-függőségek betöltése sikertelen. Ellenőrizze az AZ és az AZ legújabb verzióit. ResourceGraph.

    1. A függvényalkalmazásban válassza az Alkalmazásfájlok lehetőséget.

    2. Az host.json alatt engedélyezze a ManagedDependecy to True értéket, és válassza a requirements.psd1 elemet.

    3. A requirements.psd1 területen illessze be a következő kódot:

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Válassza a Mentés lehetőséget.

  3. Indítsa újra a függvényalkalmazást az Áttekintés lapról a requirements.psd1 fájlban említett függőségek betöltéséhez.

Függvény létrehozása

  1. A függvényalkalmazás létrehozása után lépjen az Erőforrás elemre, és az Áttekintés területen válassza a Létrehozás lehetőséget az Azure Portalon.

  2. A Függvény létrehozása ablakban végezze el a következő beállításokat:

    1. A Fejlesztői környezet tulajdonság esetében válassza a Fejlesztés a portálon lehetőséget
    2. A Sablon kiválasztása területen válassza az Event Grid lehetőséget.
    3. A Sablon részletei területen adja meg a nevet az Új függvényben, majd válassza a Létrehozás lehetőséget. A függvény létrehozásakor kiválasztható beállításokat bemutató képernyőkép.
  3. Az Event grid függvényben válassza a Kód+Teszt lehetőséget a bal oldali menüből, illessze be a következő kódot, és válassza a Mentés lehetőséget.

    # 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. Válassza az Integráció lehetőséget a bal oldali menüben, és szerkessze az Eseményindító paraméter nevét az Eseményindító területen. Használja ugyanazt a paraméternevet, amelyet a Code+Test ablakban megadott. A példában a paraméter az eventGridEvent.

    Képernyőkép az eventGridEvent paraméterről.

  5. Válassza a Mentés lehetőséget

Esemény-előfizetés létrehozása

  1. Jelentkezzen be az Azure Portalra , és nyissa meg az Azure Update Managert.
  2. A Kezelés területen válassza a Gépek, Karbantartási konfiguráció lehetőséget.
  3. A Karbantartási konfiguráció lapon válassza ki a konfigurációt.
  4. A Beállítások területen válassza az Események lehetőséget.
  5. A +Event Subscription (Esemény-előfizetés) elemet választva hozzon létre egy karbantartási előtti/utáni eseményt.
  6. Az Esemény-előfizetés létrehozása lapon adja meg a következő adatokat:
    1. Az Esemény-előfizetés részletei szakaszban adja meg a megfelelő nevet.
    2. Tartsa a sémát Event Grid-sémaként.
    3. Az Eseménytípusok szakaszban szűrjön eseménytípusokra.
      1. Válassza az Előkarbantartási esemény lehetőséget egy előeseményhez.
        • A Végpont részletei szakaszban válassza ki az Azure-függvény végpontját, majd a Konfigurálás és végpont lehetőséget.
        • Adja meg a megfelelő részleteket, például az erőforráscsoportokat, a függvényalkalmazást az esemény aktiválásához.
      2. Válassza a Post Maintenance Event (Karbantartás utáni esemény ) lehetőséget egy esemény utáni eseményhez.
        • A Végpont részletei szakaszban válassza az Azure-függvény végpontját, és válassza a Konfigurálás és végpont lehetőséget.
        • Adja meg a megfelelő adatokat, például az erőforráscsoportot, a függvényalkalmazást az esemény aktiválásához.
  7. Válassza a Létrehozás lehetőséget.

Az Azure Storage-fiókokat és az Event Hubot események tárolására, küldésére és fogadására is használhatja. További információ az Eseményközpont és a Storage-üzenetsorok létrehozásáról.

Következő lépések