Compartir a través de


Tutorial: Creación de eventos previos y posteriores mediante Azure Functions

Se aplica a: ✔️ VM de Windows ✔️ VM de Linux ✔️ Entorno local ✔️ VM de Azure ✔️ Servidores habilitados para Azure Arc.

En este tutorial se explica cómo crear eventos previos y posteriores para iniciar y detener una máquina virtual en un flujo de trabajo de revisión de programación mediante Azure Functions.

En este tutorial, aprenderá a:

  • Requisitos previos
  • Creación de una aplicación de función
  • Creación de una función
  • Creación de una suscripción a evento

Requisitos previos

  1. Asegúrese de que usa un runbook de PowerShell 7.2.

  2. Asignación de permisos a identidades administradas: puede asignar permisos a la identidad administrada adecuada. El runbook puede usar la identidad administrada asignada por el sistema de la cuenta de Automation o una identidad administrada asignada por el usuario.

    Puede usar cmdlets de PowerShell o del portal para asignar permisos a cada identidad:

    Siga los pasos de Asignación de roles de Azure mediante Azure Portal para asignar privilegio


  1. Importe el módulo Az.ResourceGraph, asegúrese de que el módulo se actualiza a ThreadJob con la versión 2.0.3 del módulo.

Creación de una aplicación de función

  1. Siga los pasos para Crear una aplicación de funciones.

  2. Después de crear la aplicación de funciones, Vaya al recurso, asegúrese de cargar las dependencias siguiendo estos pasos:

    Nota:

    Solo tiene que cargar las dependencias por primera vez. Si las dependencias de PowerShell no se pueden cargar. Compruebe las versiones más recientes de AZ y AZ. ResourceGraph.

    1. En la Función App, seleccione Archivos App.

    2. En el host.json, habilite ManagedDependecy em True y seleccione requirements.psd1.

    3. En el requirements.psd1, pegue el código siguiente:

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Seleccione Guardar.

  3. Reinicie la aplicación de la función desde la pestaña Información general para cargar las dependencias que se mencionan en el archivo requirements.psd1.

Creación de una función

  1. Después de crear la aplicación de función, vaya a Recursos, y en Información general, seleccione Crear en el Azure Portal.

  2. En la ventana Crear función, realice las siguientes selecciones:

    1. Para la propiedad Entorno de desarrollo, seleccione Desarrollar en el portal
    2. En Seleccione una plantilla, seleccione Event Grid.
    3. En Detalles de plantilla, escriba el nombre en Nueva función y, a continuación, seleccione Crear. Captura de pantalla que muestra las opciones que se van a seleccionar al crear una función.
  3. En función Event Grid, seleccione Code+Test en el menú de la izquierda, pegue el código siguiente y seleccione Guardar.

    # 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. Seleccione Integración en el menú de la izquierda y edite el nombre del parámetro desencadenante de evento en Desencadenante. Use el mismo nombre de parámetro especificado en la ventana Code+Test. En el ejemplo, el parámetro es eventGridEvent.

    Captura de pantalla que muestra el parámetro eventGridEvent.

  5. Seleccione Guardar.

Cree una suscripción a un evento

  1. Inicie sesión en Azure Portal y vaya a su Administrador de actualizaciones de Azure.
  2. En Administrar, seleccione Máquinas, Configuración de mantenimiento.
  3. En la página Configuración de mantenimiento, seleccione la configuración.
  4. En Configuración, seleccione Eventos.
  5. Seleccione +Suscripción de eventos para crear un evento previo y posterior al mantenimiento.
  6. En la página Crear suscripción de eventos, escriba los siguientes detalles:
    1. En la sección Detalles de la suscripción de eventos, proporcione un nombre adecuado.
    2. Mantenga el esquema como Esquema de Event Grid.
    3. En la sección Tipos de evento, Filtro para tipos de evento.
      1. Seleccione Eventos previos al mantenimiento para un evento previo.
        • En la sección Detalles del punto de conexión, seleccione el punto de conexión Función Azure y seleccione Configurar y punto punto de conexión.
        • Proporcione los detalles adecuados, como grupos de recursos, aplicación de funciones para desencadenar el evento.
      2. Seleccione Eventos posteriores al mantenimiento para un evento posterior.
        • En la sección Detalles del punto de conexión, el punto de conexión Función Azure y seleccione Configurar y punto final.
        • Proporcione los detalles apropiados como Grupo de recursos, Función app para activar el evento.
  7. Seleccione Crear.

También puede usar cuentas de Azure Storage y centro de eventos para almacenar, enviar y recibir eventos. Obtenga más información sobre cómo crear un centro de eventos y colas de almacenamiento.

Pasos siguientes