Руководство. Маршрутизация событий изменения состояния политики в сетку событий с помощью 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 автоматически. | |
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. | |
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. |
Чтобы использовать Azure Cloud Shell, выполните следующие действия:
Запустите Cloud Shell.
Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
Нажмите клавишу ВВОД, чтобы запустить код или команду.
Создание или изменение группы ресурсов
Темами событий сетки являются ресурсы 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, ознакомьтесь с дополнительными сведениями о событиях изменения состояния политики и возможностях службы "Сетка событий":
- Реагирование на события изменения состояния политики Azure
- Сведения о схеме политики Azure для службы "Сетка событий"
- An introduction to Azure Event Grid (Общие сведения о службе "Сетка событий Azure")