Partager via


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, des fonctions Azure, des files d’attente de 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. Toutefois, 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.

Azure Cloud Shell

Azure héberge Azure Cloud Shell, un environnement d’interpréteur de commandes interactif que vous pouvez utiliser dans votre navigateur. Vous pouvez utiliser Bash ou PowerShell avec Cloud Shell pour utiliser les services Azure. Vous pouvez utiliser les commandes préinstallées Cloud Shell pour exécuter le code de cet article sans avoir à installer quoi que ce soit dans votre environnement local.

Pour démarrer Azure Cloud Shell :

Option Exemple/Lien
Sélectionnez Essayer dans le coin supérieur droite d’un bloc de codes ou de commandes. La sélection de Essayer ne copie pas automatiquement le code ni la commande dans Cloud Shell. Capture d’écran présentant un exemple d’essai pour Azure Cloud Shell.
Accédez à https://shell.azure.com ou sélectionnez le bouton Lancer Cloud Shell pour ouvrir Cloud Shell dans votre navigateur. Bouton permettant de lancer Azure Cloud Shell.
Sélectionnez le bouton Cloud Shell dans la barre de menus en haut à droite du portail Azure. Capture d’écran présentant le bouton Cloud Shell dans le portail Azure.

Pour utiliser Azure Cloud Shell :

  1. Démarrez Cloud Shell.

  2. Sélectionnez le bouton Copier sur un bloc de codes (ou un bloc de commandes) pour copier le code ou la commande.

  3. Collez le code ou la commande dans la session Cloud Shell en sélectionnant Ctrl+Maj+V sur Windows et Linux ou en sélectionnant Cmd+Maj+V sur macOS.

  4. Sélectionnez Entrée pour exécuter le code ou la commande.

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.

Tout d’abord, vous devez inscrire les fournisseurs de ressources PolicyInsights et EventGrid au niveau de l’étendue de gestion appropriée. Tandis que le portail Azure enregistre automatiquement les adresses de fournisseurs de ressources que vous appelez pour la première fois, 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

Ensuite, remplacez <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 Azure CLI --source 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, déployez 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.

# 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. Une fois le déploiement réussi, affichez 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.

Capture d’écran de l’événement de validation d’abonnement Event Grid dans l’application web prédéfinie

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. Assurez-vous de 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']"

Après avoir créé l’attribution de stratégie, 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.

Capture d’écran de l’événement de création d’état de stratégie dans l’abonnement Event Grid pour le groupe de ressources dans l’application web prédéfinie

Notes

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

Après avoir ajouté l’étiquette requise 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 similaire à l’une des opérations suivantes, assurez-vous 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 nom du groupe de ressources que vous avez créé plus haut.

az group delete --name <resource_group_name>

Étapes suivantes

Une fois que vous savez créer des rubriques et des abonnements aux événements pour Azure Policy, vous pouvez en découvrir plus sur les événements de changement d’état de stratégie et sur ce qu’Event Grid peut vous offrir :