Использование оповещения для активации runbook службы автоматизации Azure

С помощью Azure Monitor можно отслеживать метрики и журналы базового уровня большинства служб Microsoft Azure. Модули runbook службы автоматизации Azure можно вызывать с помощью групп действий, чтобы автоматизировать задачи на основе оповещений. В этой статье показано, как настроить и запустить runbook с помощью оповещений.

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

Типы оповещений

Модули runbook службы автоматизации можно использовать с тремя типами оповещений:

  • Распространенные оповещения
  • Оповещения журнала действий
  • Оповещения метрик почти в реальном времени

Примечание.

Общая схема оповещений позволяет унифицировать работу с уведомлениями об оповещениях в Azure. Исторически три типа оповещений в Azure (метрика, журнал и журнал действий) имели собственные шаблоны электронной почты, схемы веб-перехватчика и т. д. Дополнительные сведения см. в статье "Общая схема оповещений".

Когда оповещение вызывает runbook, фактически осуществляется вызов веб-перехватчика с помощью HTTP-запроса POST. Текст запроса POST содержит объект в формате JSON с полезными свойствами, связанными с оповещением. В следующей таблице приведены ссылки на схему полезных данных для каждого типа оповещения.

Предупреждение Description Схема полезных данных
Общее оповещение Общая схема оповещений, которая стандартизирует возможности использования уведомлений об оповещениях в Azure в настоящее время. Общая схема полезных данных оповещений.
Оповещение журнала действий Отправляет уведомление, когда какое-либо новое событие в журнале действий Azure соответствует определенным условиям. Например, если в myProductionResourceGroup выполняется операция Delete VM или возникает новое событие службы "Работоспособность служб Azure" в состоянии "Активно". Схема полезных данных оповещения журнала действий
Оповещения на основе метрик практически в реальном времени Отправляет уведомление быстрее, чем оповещения о метриках, когда одна или несколько метрик уровня платформы удовлетворяют указанным условиям. Например, если за последние 5 минут значение метрики % ЦП на виртуальной машине превышает 90 и значение метрики Сеть (входящий трафик) превышает 500 МБ. Схема полезны данных оповещения на основе метрик почти в реальном времени

Так как данные, предоставляемые для каждого типа оповещения, различны, оповещения разных типов обрабатываются по-разному. В следующем разделе вы узнаете, как создать runbook для обработки различных типов оповещений.

Назначение разрешений управляемым удостоверениям

Назначьте разрешения надлежащему управляемому удостоверению, чтобы оно могло останавливать виртуальную машину. Runbook может использовать управляемое удостоверение учетной записи службы автоматизации, назначаемое пользователем или системой. Здесь приведены инструкции по назначению разрешений обоим видам удостоверений. Приведенные ниже действия используют PowerShell. Если вы предпочитаете использовать портал, см. статью "Назначение ролей Azure с помощью портал Azure".

  1. Войдите в Azure в интерактивном режиме с помощью командлета Connect-AzAccount и следуйте инструкциям.

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. Укажите соответствующие значения для перечисленных ниже переменных, а затем выполните скрипт.

    $resourceGroup = "resourceGroup"
    $automationAccount = "AutomationAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    
  3. Примените командлет PowerShell New-AzRoleAssignment, чтобы назначить роль управляемому удостоверению, назначаемому системой.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. Назначьте роль управляемому удостоверению, назначаемого пользователем.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity)
    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  5. Для управляемого удостоверения, назначаемого системой, отображаются ClientId и записываются значения для последующего использования.

    $UAMI.ClientId
    

Создание модуля Runbook для обработки оповещений

Чтобы использовать автоматизацию с оповещениями, требуется модуль Runbook, который управляет полезными данными JSON оповещения, передаваемыми в модуль Runbook. Приведенный ниже пример модуля Runbook должен быть вызван из оповещения Azure.

Как описано в предыдущем разделе, каждый тип оповещения имеет свою схему. Сценарий принимает данные веб-перехватчика из оповещения во входном параметре модуля runbook WebhookData. Затем сценарий оценивает полезные данные JSON, чтобы определить, какой тип оповещения использован.

В этом примере используется оповещение из виртуальной машины Azure. Он извлекает данные виртуальной машины из полезных данных и использует эту информацию для остановки виртуальной машины. Подключение должно быть настроено в учетной записи службы автоматизации, в которой выполняется runbook. При использовании оповещений для активации модулей Runbook важно проверка состояние оповещения в runbook, который активируется. Модуль runbook будет активирован каждый раз, когда состояние оповещения меняется. Оповещения имеют несколько состояний, из которых два наиболее распространенных — "Активировано" и "Разрешено". Проверьте состояние в логике runbook, чтобы убедиться, что модуль Runbook не выполняется более одного раза. Пример в этой статье показывает, как выполнять поиск только оповещений с состоянием "Активировано".

Модуль Runbook использует управляемое удостоверение, назначаемое системой службы автоматизации, для проверки подлинности в Azure для выполнения действий управления на виртуальной машине. Runbook можно легко изменить для использования управляемого удостоверения, назначаемого пользователем.

Примечание.

Рекомендуется использовать общедоступный сетевой доступ, так как невозможно использовать оповещение Azure (метрики, журналы и журнал действий) для активации веб-перехватчика службы автоматизации, когда учетная запись службы автоматизации использует частные ссылки и настроена с параметром "Отключить общедоступный доступ".

Используйте этот пример для создания runbook Stop-AzureVmInResponsetoVMAlert. Можно изменить сценарий PowerShell и использовать его для множества разных ресурсов.

  1. Войдите на портал Azure перейдите к учетной записи службы автоматизации.

  2. В разделе Автоматизация процессов щелкните Модули Runbook.

  3. Нажмите кнопку + Создать runbook.

    1. Присвойте новому модулю runbook имя Stop-AzureVmInResponsetoVMAlert.
    2. В раскрывающемся списке типов Runbook выберите PowerShell.
    3. Выберите Создать.
  4. В редакторе runbook вставьте следующий код:

    [OutputType("PSAzureOperationResponse")]
    param
    (
        [Parameter (Mandatory=$false)]
        [object] $WebhookData
    )
    $ErrorActionPreference = "stop"
    
    if ($WebhookData)
    {
        # Get the data object from WebhookData
        $WebhookBody = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
    
        # Get the info needed to identify the VM (depends on the payload schema)
        $schemaId = $WebhookBody.schemaId
        Write-Verbose "schemaId: $schemaId" -Verbose
        if ($schemaId -eq "azureMonitorCommonAlertSchema") {
            # This is the common Metric Alert schema (released March 2019)
            $Essentials = [object] ($WebhookBody.data).essentials
            # Get the first target only as this script doesn't handle multiple
            $alertTargetIdArray = (($Essentials.alertTargetIds)[0]).Split("/")
            $SubId = ($alertTargetIdArray)[2]
            $ResourceGroupName = ($alertTargetIdArray)[4]
            $ResourceType = ($alertTargetIdArray)[6] + "/" + ($alertTargetIdArray)[7]
            $ResourceName = ($alertTargetIdArray)[-1]
            $status = $Essentials.monitorCondition
        }
        elseif ($schemaId -eq "AzureMonitorMetricAlert") {
            # This is the near-real-time Metric Alert schema
            $AlertContext = [object] ($WebhookBody.data).context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq "Microsoft.Insights/activityLogs") {
            # This is the Activity Log Alert schema
            $AlertContext = [object] (($WebhookBody.data).context).activityLog
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = (($AlertContext.resourceId).Split("/"))[-1]
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq $null) {
            # This is the original Metric Alert schema
            $AlertContext = [object] $WebhookBody.context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = $WebhookBody.status
        }
        else {
            # Schema not supported
            Write-Error "The alert data schema - $schemaId - is not supported."
        }
    
        Write-Verbose "status: $status" -Verbose
        if (($status -eq "Activated") -or ($status -eq "Fired"))
        {
            Write-Verbose "resourceType: $ResourceType" -Verbose
            Write-Verbose "resourceName: $ResourceName" -Verbose
            Write-Verbose "resourceGroupName: $ResourceGroupName" -Verbose
            Write-Verbose "subscriptionId: $SubId" -Verbose
    
            # Determine code path depending on the resourceType
            if ($ResourceType -eq "Microsoft.Compute/virtualMachines")
            {
                # This is an Resource Manager VM
                Write-Verbose "This is an Resource Manager VM." -Verbose
    
                # Ensures you do not inherit an AzContext in your runbook
                Disable-AzContextAutosave -Scope Process
    
                # Connect to Azure with system-assigned managed identity
                $AzureContext = (Connect-AzAccount -Identity).context
    
                # set and store context
                $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
    
                # Stop the Resource Manager VM
                Write-Verbose "Stopping the VM - $ResourceName - in resource group - $ResourceGroupName -" -Verbose
                Stop-AzVM -Name $ResourceName -ResourceGroupName $ResourceGroupName -DefaultProfile $AzureContext -Force
                # [OutputType(PSAzureOperationResponse")]
            }
            else {
                # ResourceType not supported
                Write-Error "$ResourceType is not a supported resource type for this runbook."
            }
        }
        else {
            # The alert status was not 'Activated' or 'Fired' so no action taken
            Write-Verbose ("No action taken. Alert status: " + $status) -Verbose
        }
    }
    else {
        # Error
        Write-Error "This runbook is meant to be started from an Azure alert webhook only."
    }
    
  5. Если вы хотите, чтобы модуль runbook выполнялся с управляемым удостоверением, назначаемым системой, оставьте код как есть. Если вы предпочитаете использовать управляемое удостоверение, назначаемое пользователем, сделайте следующее:

    1. Из строки 78 удалите ,$AzureContext = (Connect-AzAccount -Identity).context
    2. Замените его $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context.
    3. Введите идентификатор клиента, полученный ранее.
  6. Нажмите кнопку "Сохранить", "Опубликовать" и "Да" при появлении запроса.

  7. Закройте страницу Runbook, чтобы вернуться на страницу Учетная запись службы автоматизации.

Создание оповещения

Оповещения используют группы действий, которые представляют собой коллекции действий, активируемых оповещением. Модули runbook — это лишь одно из многих действий, доступных для групп действий.

  1. В учетной записи службы автоматизации в разделе "Мониторинг" выберите "Оповещения".

  2. Выберите +Создать правило генерации оповещений, чтобы открыть страницу "Создать правило генерации оповещений".

    The create alert rule page and subsections.

  3. В разделе "Область" выберите "Изменить ресурс".

  4. На странице "Выбор ресурса" в раскрывающемся списке "Фильтр по типу ресурса" выберите "Виртуальные машины".

  5. Установите флажок рядом с нужными виртуальными машинами. Затем нажмите кнопку "Готово", чтобы вернуться на страницу правила создания оповещений.

  6. В разделе Условие выберите элемент Добавить условие.

  7. На странице выбора сигнала введите Percentage CPU текстовое поле поиска и выберите процент ЦП из результатов.

  8. На странице "Настройка логики сигнала" в разделе "Пороговое значение" введите начальное низкое значение для целей тестирования, например5. Вы можете вернуться и обновить это значение, убедившись, что оповещение работает должным образом. Затем нажмите кнопку "Готово", чтобы вернуться на страницу правила создания оповещений.

    Entering CPU percentage threshold value.

  9. В разделе "Действия" выберите "Добавить группы действий" и +Создать группу действий.

    The create action group page with Basics tab open.

  10. На странице "Создание группы действий" выполните следующие действия:

    1. На вкладке "Основы" введите имя группы действий и отображаемое имя.

    2. На вкладке "Действия" в текстовом поле "Имя" введите имя. Затем в раскрывающемся списке "Тип действия" выберите Модуль Runbook службы автоматизации, чтобы открыть страницу "Настройка Runbook".

      1. Для исходного элемента Runbook выберите User.

      2. В раскрывающемся списке подписки выберите подписку.

      3. В раскрывающемся списке учетной записи службы автоматизации выберите учетную запись службы автоматизации.

      4. В раскрывающемся списке Runbook выберите Stop-AzureVmInResponsetoVMAlert.

      5. Для включения общего элемента схемы генерации оповещений нажмите кнопку "Да".

      6. Нажмите кнопку "ОК ", чтобы вернуться на страницу "Создать группу действий".

        Configure runbook page with values.

    3. Нажмите кнопку "Просмотр и создание", чтобывернуться на страницу правила создания оповещений.

  11. В разделе "Сведения о правиле генерации оповещений" в текстовом поле "Имя правила генерации оповещений".

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

Проверка

Убедитесь, что виртуальная машина запущена. Перейдите к runbook Stop-AzureVmInResponsetoVMAlert и просмотрите список последних заданий , чтобы заполнить его. По завершении задания выберите задание и просмотрите выходные данные. Кроме того, проверка узнать, остановлена ли виртуальная машина.

Showing output from job.

Распространенные операции управления виртуальными машинами Azure

служба автоматизации Azure предоставляет сценарии для распространенных операций управления виртуальными машинами Azure, таких как перезапуск виртуальной машины, остановка виртуальной машины, удаление виртуальной машины, увеличение масштаба и уменьшение масштаба в коллекции Runbook. Скрипты также можно найти в репозитории служба автоматизации Azure GitHub, которые также можно использовать как упоминание в приведенных выше шагах.

Операции управления виртуальными машинами Azure Подробности
Stop-Azure-VM-On-Alert Этот модуль Runbook остановит виртуальную машину Azure Resource Manager в ответ на триггер оповещения Azure.

Входные данные — это данные генерации оповещений, необходимые для определения остановки виртуальной машины.

Модуль Runbook должен вызываться из оповещения Azure через веб-перехватчик.

Последняя версия модуля Az должна быть добавлена в учетную запись службы автоматизации.

Управляемое удостоверение должно быть включено и участник доступ к учетной записи службы автоматизации.
Перезапуск azure-VM-on-Alert Этот модуль Runbook остановит виртуальную машину Azure Resource Manager в ответ на триггер оповещения Azure.

Входные данные — это данные генерации оповещений, необходимые для определения остановки виртуальной машины.

Модуль Runbook должен вызываться из оповещения Azure через веб-перехватчик.

Последняя версия модуля Az должна быть добавлена в учетную запись службы автоматизации.

Управляемое удостоверение должно быть включено и участник доступ к учетной записи службы автоматизации.
Delete-Azure-VM-On-Alert Этот модуль Runbook остановит виртуальную машину Azure Resource Manager в ответ на триггер оповещения Azure.

Входные данные — это данные генерации оповещений, необходимые для определения остановки виртуальной машины.

Модуль Runbook должен вызываться из оповещения Azure через веб-перехватчик.

Последняя версия модуля Az должна быть добавлена в учетную запись службы автоматизации.

Управляемое удостоверение должно быть включено и участник доступ к учетной записи службы автоматизации.
ScaleDown-Azure-VM-On-Alert Этот модуль Runbook остановит виртуальную машину Azure Resource Manager в ответ на триггер оповещения Azure.

Входные данные — это данные генерации оповещений, необходимые для определения остановки виртуальной машины.

Модуль Runbook должен вызываться из оповещения Azure через веб-перехватчик.

Последняя версия модуля Az должна быть добавлена в учетную запись службы автоматизации.

Управляемое удостоверение должно быть включено и участник доступ к учетной записи службы автоматизации.
ScaleUp-Azure-VM-On-Alert Этот модуль Runbook остановит виртуальную машину Azure Resource Manager в ответ на триггер оповещения Azure.

Входные данные — это данные генерации оповещений, необходимые для определения остановки виртуальной машины.

Модуль Runbook должен вызываться из оповещения Azure через веб-перехватчик.

Последняя версия модуля Az должна быть добавлена в учетную запись службы автоматизации.

Управляемое удостоверение должно быть включено и участник доступ к учетной записи службы автоматизации.

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