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

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

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

  • Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

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

Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Вариант Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Screenshot that shows an example of Try It for Azure Cloud Shell.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Button to launch Azure Cloud Shell.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.

  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.

  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.

  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

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

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

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

Screenshot of the Event Grid subscription validation event in the pre-built web app.

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

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

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

# 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 для запуска.

Screenshot of the Event Grid subscription Policy State Created event for the resource group in the pre-built web app.

Примечание.

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