Поделиться через


Руководство: Создание событий, происходящих до и после операций, с использованием Функций Azure

Применимо: ✔️ виртуальные машины ✔️ ✔️ Linux под управлением Windows На локальных ✔️ ✔️ серверах azure Arc.

В этом руководстве объясняется, как создать события предварительной и послесвязи для запуска и остановки виртуальной машины в рабочем процессе исправления расписания с помощью Функции Azure.

В этом руководстве описано следующее:

  • Необходимые компоненты
  • Создание приложения-функции
  • Создание функции
  • Создание подписки на событие

Необходимые компоненты

  1. Убедитесь, что вы используете runbook PowerShell 7.2 .

  2. Назначьте разрешение управляемым удостоверениям. Вы можете назначить разрешения соответствующему управляемому удостоверению. Runbook может использовать управляемое удостоверение учетной записи службы автоматизации, назначаемое пользователем или системой.

    Вы можете использовать портал или командлеты PowerShell для назначения разрешений каждому удостоверению:

    Выполните действия, описанные в статье "Назначение ролей Azure" с помощью портал Azure для назначения разрешений


  1. Az.ResourceGraph Импортируйте модуль, убедитесь, что модуль обновлен до ThreadJob с помощью модуля версии 2.0.3.

Создание приложения-функции

  1. Выполните действия по созданию приложения-функции.

  2. После создания приложения-функции перейдите к ресурсу, убедитесь, что вы загружаете зависимости, выполнив следующие действия.

    Примечание.

    Необходимо загрузить зависимости только в первый раз. Если зависимости PowerShell не загружаются. Проверьте последние версии AZ и AZ. ResourceGraph.

    1. В приложении-функции выберите файлы приложений.

    2. В host.json включите ManagedDependecy в true и выберите requirements.psd1.

    3. В поле requirements.psd1 вставьте следующий код:

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Выберите Сохранить.

  3. Перезапустите приложение-функцию на вкладке "Обзор ", чтобы загрузить зависимости, упомянутые в файле requirements.psd1 .

Создание функции

  1. После создания приложения-функции перейдите к ресурсу и в разделе "Обзор" выберите "Создать" в портал Azure.

  2. В окне "Создание функции" сделайте следующее:

    1. Для свойства среды разработки выберите "Разработка на портале"
    2. В разделе "Выбор шаблона" выберите "Сетка событий".
    3. В разделе "Сведения о шаблоне" введите имя новой функции и нажмите кнопку "Создать". Снимок экрана: параметры для выбора при создании функции.
  3. В функции сетки событий выберите Code+Test в меню слева, вставьте следующий код и нажмите кнопку "Сохранить".

    # 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. Выберите "Интеграция" в меню слева и измените имя параметра триггера события в разделе "Триггер". Используйте то же имя параметра, указанное в окне Code+Test . В примере параметром является eventGridEvent.

    Снимок экрана, на котором показан параметр eventGridEvent.

  5. Выберите Сохранить

Создание подписки на события

  1. Войдите в портал Azure и перейдите в Диспетчер обновлений Azure.
  2. В разделе "Управление" выберите "Компьютеры", "Конфигурация обслуживания".
  3. На странице "Конфигурация обслуживания" выберите конфигурацию.
  4. В разделе "Параметры" выберите "События".
  5. Выберите +Подписка на события событий, чтобы создать событие предварительного или последующего обслуживания.
  6. На странице "Создание подписки на события" введите следующие сведения:
    1. В разделе "Сведения о подписке на события" укажите соответствующее имя.
    2. Сохраните схему как схему сетки событий.
    3. В разделе "Типы событий" отфильтруйте типы событий.
      1. Выберите событие предварительного обслуживания для предварительного события.
        • В разделе сведений о конечной точке выберите конечную точку функции Azure и выберите "Настроить" и "Конечная точка".
        • Укажите соответствующие сведения, такие как группы ресурсов, приложение-функция для активации события.
      2. Выберите событие после обслуживания для события после выполнения.
        • В разделе "Сведения о конечной точке" конечная точка функции Azure и выберите "Настройка" и "Конечная точка".
        • Укажите соответствующие сведения, такие как группа ресурсов, приложение-функция для активации события.
  7. Нажмите кнопку создания.

Вы также можете использовать служба хранилища Azure учетные записи и концентратор событий для хранения, отправки и получения событий. Дополнительные сведения о создании концентратора событий и очередей хранилища.

Следующие шаги