Compartilhar via


Tutorial: Criar pré e pós-eventos usando o Azure Functions

Aplica-se a: ✔️ VMs do Windows ✔️ VMs do Linux ✔️ Ambiente local ✔️ VMs do Azure ✔️ Servidores habilitados para Azure Arc.

Este tutorial explica como criar pré e pós-eventos para iniciar e parar uma VM em um fluxo de trabalho de patch de agendamento usando o Azure Functions.

Neste tutorial, você aprenderá a:

  • Pré-requisitos
  • Criar um aplicativo de funções
  • Criar uma função
  • Criar uma assinatura de evento

Pré-requisitos

  1. Verifique se você está usando o runbook do PowerShell 7.2.

  2. Atribuir permissão a identidades gerenciadas – você pode atribuir permissões à identidade gerenciada apropriada. O runbook pode usar a identidade gerenciada atribuída pelo sistema ou pelo usuário da conta de Automação.

    Você pode usar cmdlets do portal ou do PowerShell para atribuir permissões a cada identidade:

    Siga as etapas em Atribuir funções do Azure usando o portal do Azure para atribuir permissões


  1. Importe o módulo Az.ResourceGraph, verifique se o módulo foi atualizado para o ThreadJob com o módulo versão 2.0.3.

Criar um aplicativo de funções

  1. Siga as etapas para Criar um aplicativo de funções.

  2. Depois de criar o aplicativo de funções, vá para o recurso, certifique-se de carregar as dependências seguindo estas etapas:

    Observação

    Você precisa carregar as dependências apenas pela primeira vez. Se as dependências do PowerShell não estiverem sendo carregadas. Verifique as versões mais recentes do AZ e do AZ.ResourceGraph.

    1. No Aplicativo de funções, selecione Arquivos de aplicativo.

    2. No host.json, habilite ManagedDependecy como True e selecionerequirements.psd1.

    3. No requirements.psd1, cole o seguinte código:

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

  3. Reinicie o aplicativo de funções na guia Visão geral para carregar as dependências mencionadas no arquivo requirements.psd1.

Criar uma função

  1. Depois de criar o aplicativo de funções, vá para Recurso, e em Visão geral, selecione Criar no portal do Azure.

  2. Na janela Criar função, faça as seguintes seleções:

    1. Para a Propriedade de ambiente de desenvolvimento, selecione Desenvolver no portal
    2. Em Selecionar um modelo, selecione Grade de Eventos.
    3. Em Detalhes do modelo, insira o nome em Nova função e selecione Criar. Captura de tela que mostra as opções a serem selecionadas durante a criação de uma função.
  3. Na função grade de eventos, selecione Code+Test no menu à esquerda, cole o código a seguir e selecione Salvar.

    # 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. Selecione Integração no menu esquerdo e edite o nome do parâmetro Event Trigger em Gatilho. Use o mesmo nome de parâmetro fornecido na janela Code+Test. No exemplo, o parâmetro é eventGridEvent.

    Captura de tela que mostra o parâmetro eventGridEvent.

  5. Selecione Salvar

Crie uma assinatura de evento.

  1. Entre no Portal do Azure e vá para o Gerenciador de Atualizações do Azure.
  2. Em Gerenciar, selecione Computadores, Configurações de Manutenção.
  3. Na página Configuração de Manutenção, selecione a configuração.
  4. Em Configurações, selecione Eventos.
  5. Selecione +Assinatura de Evento para criar um evento de manutenção pré/pós.
  6. Na página Criar assinatura de evento, insira os seguintes detalhes:
    1. Na seção Detalhes da assinatura do evento, forneça um nome apropriado.
    2. Mantenha o esquema como Esquema da Grade de Eventos.
    3. Na seção Tipos de Eventos, Filtre para Tipos de Evento.
      1. Selecione Evento de Pré-manutenção para um pré-evento.
        • Na seção Detalhes do ponto de extremidade, selecione o ponto de extremidade da Função do Azure e, em seguida, Configurar e Ponto de extremidade.
        • Forneça os detalhes apropriados, como grupos de recursos, aplicativo de funções para disparar o evento.
      2. Selecione Evento Pós-manutenção para um pós-evento.
        • Na seção Detalhes do ponto de extremidade, selecione o ponto de extremidade da Função do Azure e escolha Configurar e Ponto de extremidade.
        • Forneça os detalhes apropriados, como Grupos de recursos, Aplicativo de funções para disparar o evento.
  7. Selecione Criar.

Você também pode usar as contas de Armazenamento do Azure e os hub de eventos para armazenar, enviar e receber eventos. Saiba mais sobre como criar o Hub de eventos e Filas de armazenamento.

Próximas etapas