Tutoriel : Router les événements de changement d’état de stratégie vers Event Grid avec Azure CLI
Dans cet article, vous allez voir comment configurer des abonnements à des événements Azure Policy afin d’envoyer des événements de changement d’état de stratégie à un point de terminaison web. Les utilisateurs Azure Policy peuvent s’abonner à des événements qui sont émis quand des modifications d’état de stratégie se produisent sur des ressources. Ces événements peuvent déclencher des webhooks, Azure Functions, des files d’attente Stockage Azure ou tout autre gestionnaire d’événements pris en charge par Azure Event Grid. En règle générale, vous envoyez des événements à un point de terminaison qui traite les données d’événement et entreprend des actions. Pour simplifier ce tutoriel, vous envoyez les événements à une application web qui collecte et affiche les messages.
Prérequis
- Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
- Pour suivre ce guide de démarrage rapide, vous devez utiliser Azure CLI version 2.0.76 ou ultérieure. Pour connaître la version de l’interface, exécutez
az --version
. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
Créer un groupe de ressources
Les rubriques Event Grid sont des ressources Azure et doivent être placées dans un groupe de ressources Azure. Un groupe de ressources est une collection logique dans laquelle des ressources Azure sont déployées et gérées.
Créez un groupe de ressources avec la commande az group create.
L’exemple suivant crée un groupe de ressources nommé <resource_group_name>
à l’emplacement westus. Remplacez <resource_group_name>
par un nom unique pour votre groupe de ressources.
# Log in first with az login if you're not using Cloud Shell
az group create --name <resource_group_name> --location westus
Créer une rubrique système Event Grid
Comme nous disposons maintenant d’un groupe de ressources, nous créons une rubrique système. Une rubrique système dans Event Grid représente un ou plusieurs événements publiés par les services Azure, tels qu’Azure Policy et Azure Event Hubs. Cette rubrique système utilise le type de rubrique Microsoft.PolicyInsights.PolicyStates
pour les changements d’état Azure Policy.
Vous devez d’abord inscrire les fournisseurs de ressources PolicyInsights
et EventGrid
au niveau de l’étendue de gestion appropriée. Le portail Azure inscrit automatiquement les fournisseurs de ressources que vous appelez pour la première fois, mais Azure CLI ne le fait pas.
# 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
Remplacez ensuite <subscriptionId>
dans le paramètre scope
par l’ID de votre abonnement, et <resource_group_name>
dans le paramètre resource-group
par le groupe de ressources créé.
az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/subscriptions/<subscriptionId>" --resource-group "<resource_group_name>"
Si votre rubrique système Event Grid est appliquée à l’étendue du groupe d’administration, la syntaxe du paramètre --source
d’Azure CLI est un peu différente. Voici un exemple :
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>"
Créer un point de terminaison de message
Avant de nous abonner à la rubrique, nous allons créer le point de terminaison pour le message de l’événement. En règle générale, le point de terminaison entreprend des actions en fonction des données d’événement. Pour simplifier ce guide de démarrage rapide, vous allez déployer une application web prédéfinie qui affiche les messages d’événement. La solution déployée comprend un plan App Service, une offre App Service Web Apps et du code source en provenance de GitHub.
Remplacez <your-site-name>
par un nom unique pour votre application web. Le nom de l’application web doit être unique, car il fait partie de l’entrée DNS (Domain Name System).
# 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
Le déploiement peut prendre quelques minutes. Après un déploiement réussi, visualisez votre application web pour vérifier qu’elle s’exécute. Dans un navigateur web, accédez à : https://<your-site-name>.azurewebsites.net
Vous devez voir le site sans messages affichés.
S’abonner à la rubrique système
Vous vous abonnez à une rubrique pour communiquer à Event Grid les événements qui vous intéressent, et où les envoyer. L’exemple suivant s’abonne à la rubrique système que vous avez créée et transmet l’URL à partir de votre application web en tant que point de terminaison destiné à recevoir les notifications d’événement. Remplacez <event_subscription_name>
par un nom pour votre abonnement aux événements. Pour <resource_group_name>
et <your-site-name>
, utilisez les valeurs que vous avez créées précédemment.
Le point de terminaison de votre application web doit inclure le suffixe /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
Affichez à nouveau votre application web, et notez qu’un événement de validation d’abonnement lui a été envoyé. Sélectionnez l’icône en forme d’œil pour développer les données d’événements. Event Grid envoie l’événement de validation pour que le point de terminaison puisse vérifier qu’il souhaite recevoir des données d’événement. L’application web inclut du code pour valider l’abonnement.
Créer une affectation de stratégie
Dans ce guide de démarrage rapide, vous créez une affectation de stratégie et vous attribuez la définition Exiger une étiquette sur les groupes de ressources. Cette définition de stratégie identifie les groupes de ressources qui ne contiennent pas l’étiquette configurée lors de l’attribution de stratégie.
Exécutez la commande suivante pour créer une attribution de stratégie dont l’étendue est définie sur le groupe de ressources destiné à contenir la rubrique 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\" } }'
La commande précédente utilise les informations suivantes :
- Name : nom réel de l’attribution. Dans cet exemple, nous utilisons requiredtags-events.
- DisplayName : nom d’affichage pour l’attribution de stratégie. En l’occurrence, vous utilisez Require tag on RG.
- Scope : une étendue détermine les ressources ou le regroupement de ressources sur lequel l’attribution de stratégie est appliquée. Elle va d’un abonnement à des groupes de ressources. Veillez à remplacer
<scope>
par le nom de votre groupe de ressources. Le format de l’étendue d’un groupe de ressources est/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
. - Policy : ID de définition de la stratégie, que vous utilisez pour créer l’attribution. En l’occurrence, il s’agit de l’ID de la définition de stratégie Require a tag on resource groups. Pour obtenir l’ID de définition de stratégie, exécutez cette commande :
az policy definition list --query "[?displayName=='Require a tag on resource groups']"
Une fois l’affectation de stratégie créée, attendez qu’une notification d’événement Microsoft.PolicyInsights.PolicyStateCreated
apparaisse dans l’application web. Au départ, le groupe de ressources que nous avons créé affiche la valeur NonCompliant pour le paramètre data.complianceState
.
Remarque
Si le groupe de ressources hérite d’autres attributions de stratégie de la hiérarchie des groupes d’administration ou des abonnements, les événements correspondants s’affichent également. Pour vérifier que l’événement concerne l’affectation dans ce tutoriel, évaluez la propriété data.policyDefinitionId
.
Déclencher une modification sur le groupe de ressources
Pour rendre le groupe de ressources conforme, une étiquette portant le nom EventTest est requise. Ajoutez l’étiquette au groupe de ressources avec la commande suivante, en remplaçant <subscriptionId>
par votre ID d’abonnement et <resourceGroup>
par le nom du groupe de ressources :
# 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
Une fois que vous avez ajouté la balise nécessaire au groupe de ressources, attendez qu’une notification d’événement Microsoft.PolicyInsights.PolicyStateChanged
apparaisse dans l’application web. Développez l’événement ; data.complianceState
a désormais pour valeur Compliant.
Dépannage
Si vous voyez une erreur semblable à ce qui suit, vérifiez que vous avez inscrit les deux fournisseurs de ressources au niveau de l’étendue à laquelle vous vous abonnez (groupe d’administration ou abonnement) :
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.'}]}
Nettoyer les ressources
Si vous envisagez de continuer à utiliser cette application web et l’abonnement aux événements Azure Policy, ne supprimez pas les ressources créées dans cet article. Sinon, utilisez la commande suivante pour supprimer les ressources créées avec cet article.
Remplacez <resource_group_name>
par le groupe de ressources que vous avez créé.
az group delete --name <resource_group_name>
Étapes suivantes
Vous savez désormais comment créer des rubriques et des abonnements aux événements pour Azure Policy. Découvrez plus en détail les événements de changement d’état de stratégie et Event Grid :