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


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

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

Prerequisites

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

Создайте группу ресурсов

Темами событий сетки являются ресурсы 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

Создайте системную тему в Event Grid

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

Сначала необходимо зарегистрировать поставщиков ресурсов PolicyInsights и EventGrid в соответствующей области управления. Портал Azure автоматически регистрирует любые провайдеры ресурсов (RPs), которые вы вызываете впервые, но 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

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

Снимок события проверки подписки в Event Grid в готовом веб-приложении.

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

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

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

# 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\" } }'

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

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

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

Снимок экрана события

Note

Если группа ресурсов наследует другие назначения политик из иерархии подписок или групп управления, события для каждой из них также отображаются. Убедитесь, что событие предназначено для задачи в этом руководстве, проверив свойство 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 значение теперь показывает соответствие требованиям.

Troubleshooting

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

  • 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, узнайте больше о событиях изменения состояния политики и сетке событий: