Руководство. Маршрутизация событий изменения состояния политики в сетку событий с помощью Azure CLI

В этой статье вы узнаете, как настроить подписки на события политики Azure на отправку событий изменения состояния политики в конечную веб-точку. Пользователи политики Azure могут подписаться на отправку событий в случае изменения состояния политики в ресурсах. Эти события могут активировать веб-перехватчики, Функции Azure, очереди служба хранилища Azure или любой другой обработчик событий, поддерживаемый Сетка событий Azure. Как правило, события отправляются на конечную точку, которая обрабатывает данные событий и выполняет соответствующие действия. Чтобы упростить это руководство, вы отправляете события в веб-приложение, которое собирает и отображает сообщения.

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

  • Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
  • Для работы с этим кратким руководством требуется запустить Azure CLI версии не ниже 2.0.76. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Создание или изменение группы ресурсов

Темами событий сетки являются ресурсы Azure, которые необходимо поместить в группу ресурсов Azure. Группа ресурсов Azure — это логическая коллекция, в которой выполняется развертывание и администрирование ресурсов Azure.

Создайте группу ресурсов с помощью команды az group create.

В следующем примере создается группа ресурсов с именем <resource_group_name> в расположении westus. Замените <resource_group_name> уникальным именем для группы ресурсов.

# Log in first with az login if you're not using Cloud Shell

az group create --name <resource_group_name> --location westus

Создание системного раздела сетки событий

Теперь, когда у нас есть группа ресурсов, мы создаем системный раздел. Системный раздел в Сетке событий представляет одно или несколько событий, опубликованных службами Azure, такими как политика Azure и Центры событий Azure. В этом системном разделе для изменений состояния политики Azure используется тип раздела Microsoft.PolicyInsights.PolicyStates.

Сначала необходимо зарегистрировать PolicyInsights поставщиков ресурсов и EventGrid поставщиков ресурсов в соответствующей области управления. портал Azure авторегистрирует все вызовы ЕЗ, которые вы вызываете в первый раз, но Azure CLI не выполняется.

# Log in first with az login if you're not using Cloud Shell

# Register the required RPs at the management group scope
az provider register --namespace Microsoft.PolicyInsights -m <managementGroupId>
az provider register --namespace Microsoft.EventGrid -m <managementGroupId>

# Alternatively, register the required RPs at the subscription scope (defaults to current subscription context)
az provider register --namespace Microsoft.PolicyInsights
az provider register --namespace Microsoft.EventGrid

Затем замените <subscriptionId> параметр scope идентификатором подписки и <resource_group_name> параметром resource-group ранее созданной группы ресурсов.

az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/subscriptions/<subscriptionId>" --resource-group "<resource_group_name>"

Если системный раздел сетки событий применяется к области группы управления, синтаксис параметра Azure CLI --source немного отличается. Приведем пример:

az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/tenants/<tenantID>/providers/Microsoft.Management/managementGroups/<management_group_name>" --resource-group "<resource_group_name>"

Создание конечной точки сообщения

Перед подпиской на раздел необходимо создать конечную точку для сообщения о событии. Обычно конечная точка выполняет действия на основе данных событий. Чтобы упростить это краткое руководство, вы развернете предварительно созданное веб-приложение , отображающее сообщения о событиях. Развернутое решение содержит план службы приложений, веб-приложение службы приложений и исходный код из GitHub.

Замените <your-site-name> уникальным именем для вашего веб-приложения. Имя веб-приложения должно быть уникальным, так как оно является частью записи системы доменных имен (DNS).

# Log in first with az login if you're not using Cloud Shell

az deployment group create \
  --resource-group <resource_group_name> \
  --template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
  --parameters siteName=<your-site-name> hostingPlanName=viewerhost

Завершение развертывания может занять несколько минут. После успешного развертывания просмотрите веб-приложение, чтобы убедиться, что оно запущено. Откройте браузер и перейдите по адресу https://<your-site-name>.azurewebsites.net.

Вы увидите сайт, на котором сейчас не отображаются никакие сообщения.

Подписка на системный раздел

Подписка на раздел предоставляет Сетке событий Azure информацию о том, какие события вы намерены отслеживать и куда их следует отправлять. В следующем примере создается подписка на созданный системный раздел и передается URL-адрес из веб-приложения в качестве конечной точки для получения уведомлений о событиях. Замените <event_subscription_name> именем подписки на событие. Для <resource_group_name> и <your-site-name> используйте созданные ранее значения.

Конечная точка веб-приложения должна содержать суффикс /api/updates/.

# Log in first with az login if you're not using Cloud Shell

# Create the subscription
az eventgrid system-topic event-subscription create \
  --name <event_subscription_name> \
  --resource-group <resource_group_name> \
  --system-topic-name PolicyStateChanges \
  --endpoint https://<your-site-name>.azurewebsites.net/api/updates

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

Снимок экрана: событие проверки подписки сетки событий в предварительно созданном веб-приложении.

Создание назначения политики

В этом кратком руководстве вы создадите назначение политики и присвоите определение Требование тега в группах ресурсов. Такое определение политики идентифицирует группы ресурсов, в которых отсутствует тег, настроенный во время назначения политики.

Чтобы создать назначение политики для группы ресурсов, созданной для хранения раздела сетки событий, выполните следующую команду:

# Log in first with az login if you're not using Cloud Shell

az policy assignment create --name 'requiredtags-events' --display-name 'Require tag on RG' --scope '<resourceGroupScope>' --policy '<policy definition ID>' --params '{ \"tagName\": { \"value\": \"EventTest\" } }'

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

  • Name — фактическое имя назначения. Для этого примера было использовано значение requiredtags-events.
  • DisplayName — отображаемое имя назначения политики. В этом случае вы используете значение Требовать тег для группы ресурсов.
  • Scope. Область определяет, к каким ресурсам или группе ресурсов принудительно применяется назначение политики. Политика может назначаться разным ресурсам: от подписки до групп ресурсов. Обязательно замените <scope> на имя своей группы ресурсов. Для области группы ресурсов используется формат /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>.
  • Policy — идентификатор определения политики, на основе которой вы создаете назначение. В этом случае это определение для идентификатора политики Требование тега в группах ресурсов. Чтобы получить идентификатор определения политики, выполните следующую команду: az policy definition list --query "[?displayName=='Require a tag on resource groups']"

После создания назначения политики дождитесь Microsoft.PolicyInsights.PolicyStateCreated появления уведомления о событии в веб-приложении. Созданная группа ресурсов показывает значение data.complianceState параметра NonCompliant для запуска.

Снимок экрана: событие создания состояния политики подписки сетки событий для группы ресурсов в предварительно созданном веб-приложении.

Примечание.

Если группа ресурсов наследует другие назначения политики из подписки или иерархии группы управления, для каждого из них также отображаются события. Проверьте значение свойства data.policyDefinitionId и убедитесь, что событие относится к назначению в этом руководстве.

Активация изменения в группе ресурсов

Чтобы обеспечить соответствие группе ресурсов, требуется тег с именем EventTest. Добавьте тег в группу ресурсов с помощью следующей команды, заменив <subscriptionId> идентификатором подписки и <resourceGroup> именем группы ресурсов:

# Log in first with az login if you're not using Cloud Shell

az tag create --resource-id '/subscriptions/<SubscriptionID>/resourceGroups/<resourceGroup>' --tags EventTest=true

После добавления необходимого тега в группу ресурсов дождитесь Microsoft.PolicyInsights.PolicyStateChanged появления уведомления о событии в веб-приложении. Разверните событие. Теперь для значения data.complianceState отображается Compliant.

Устранение неполадок

Если вы видите ошибку, аналогичную одной из следующих, убедитесь, что вы зарегистрировали обоих поставщиков ресурсов в области, в которой вы подписываетесь (группа управления или подписка):

  • Deployment has failed with the following error: {"code":"Publisher Notification Error","message":"Failed to enable publisher notifications.","details":[{"code":"Publisher Provider Error","message":"GET request for <uri> failed with status code: Forbidden, code: AuthorizationFailed and message: The client '<identifier>' with object id '<identifier>' does not have authorization to perform action 'microsoft.policyinsights/eventGridFilters/read' over scope '<scope>/providers/microsoft.policyinsights/eventGridFilters/_default' or the scope is invalid. If access was recently granted, please refresh your credentials.."}]}
  • Deployment has failed with the following error: {'code':'Publisher Notification Error','message':'Failed to enable publisher notifications.','details':[{'code':'ApiVersionNotSupported','message':'Event Grid notifications are currently not supported by microsoft.policyinsights in global. Try re-registering Microsoft.EventGrid provider if this is your first event subscription in this region.'}]}

Очистка ресурсов

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

Замените <resource_group_name> созданную группу ресурсов.

az group delete --name <resource_group_name>

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

Теперь, когда вы знаете, как создавать разделы и подписки на события для Политика Azure, узнайте больше о событиях изменения состояния политики и сетке событий: