Delen via


Zelfstudie: Gebeurtenissen van wijziging van beleidsstatus routeren naar Event Grid met Azure CLI

In dit artikel leert u hoe u Azure Policy-gebeurtenisabonnementen instelt om gebeurtenissen voor beleidsstatuswijziging naar een webeindpunt te verzenden. Azure Policy-gebruikers kunnen zich abonneren op gebeurtenissen die worden verzonden wanneer wijzigingen in beleidsstatussen op resources plaatsvinden. Deze gebeurtenissen kunnen webhook, Azure Functions, Azure Storage Queues of een andere gebeurtenis-handler activeren die wordt ondersteund door Azure Event Grid. Normaal gesproken verzendt u gebeurtenissen naar een eindpunt dat de gebeurtenisgegevens verwerkt en vervolgens in actie komt. Ter vereenvoudiging van deze zelfstudie verzendt u de gebeurtenissen naar een web-app die de berichten verzamelt en weergeeft.

Vereisten

  • Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.
  • Voor deze quickstart moet u versie 2.0.76 of hoger van Azure CLI uitvoeren. Voer az --version uit om de versie te zoeken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.

Een brongroep maken

Event Grid-onderwerpen zijn Azure-resources en moeten in een Azure-resourcegroep worden geplaatst. De resourcegroep is een logische verzameling waarin Azure-resources worden geïmplementeerd en beheerd.

Een resourcegroep maken met de opdracht az group create.

In het volgende voorbeeld wordt een resourcegroep gemaakt met de naam <resource_group_name> op de locatie westus . Vervang <resource_group_name> door een unieke naam voor uw resourcegroep.

# Log in first with az login if you're not using Cloud Shell

az group create --name <resource_group_name> --location westus

Een Event Grid-systeemonderwerp maken

Nu we een resourcegroep hebben, maken we een systeemonderwerp. Een systeemonderwerp in Event Grid vertegenwoordigt een of meer gebeurtenissen die zijn gepubliceerd door Azure-services, zoals Azure Policy en Azure Event Hubs. In dit systeemonderwerp wordt het Microsoft.PolicyInsights.PolicyStates onderwerptype gebruikt voor statuswijzigingen in Azure Policy.

Eerst moet u de PolicyInsights resourceproviders EventGrid (RPs) registreren bij het juiste beheerbereik. Azure Portal autoregisters die u voor het eerst aanroept, maar Azure CLI niet.

# 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> Vervang vervolgens in de scope parameter door de id van uw abonnement en <resource_group_name> in resource-group de parameter door de eerder gemaakte resourcegroep.

az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/subscriptions/<subscriptionId>" --resource-group "<resource_group_name>"

Als uw Event Grid-systeemonderwerp wordt toegepast op het bereik van de beheergroep, is de syntaxis van de Azure CLI-parameter --source iets anders. Hier volgt een voorbeeld:

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>"

Het eindpunt van een bericht maken

Voordat u zich abonneert op het onderwerp, gaan we het eindpunt voor het gebeurtenisbericht maken. Het eindpunt onderneemt normaal gesproken actie op basis van de gebeurtenisgegevens. Ter vereenvoudiging van deze quickstart implementeert u een vooraf gemaakte web-app die de gebeurtenisberichten weergeeft. De geïmplementeerde oplossing omvat een App Service-plan, een App Service-web-app en broncode van GitHub.

Vervang <your-site-name> door een unieke naam voor de web-app. De naam van de web-app moet uniek zijn omdat deze deel uitmaakt van de DNS-vermelding (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

De implementatie kan enkele minuten duren. Na een geslaagde implementatie bekijkt u uw web-app om te controleren of deze wordt uitgevoerd. Navigeer in een webbrowser naar: https://<your-site-name>.azurewebsites.net

Op de site zouden momenteel geen berichten moeten wijn weergeven.

Abonneren op het systeemonderwerp

U abonneert u op een onderwerp om Event Grid te laten weten welke gebeurtenissen u wilt traceren en waar deze gebeurtenissen naartoe moeten worden gestuurd. In het volgende voorbeeld wordt geabonneerd op het systeemonderwerp dat u hebt gemaakt en wordt de URL van uw web-app doorgegeven als het eindpunt voor het ontvangen van gebeurtenismeldingen. Vervang <event_subscription_name> door een naam voor het gebeurtenisabonnement. Gebruik voor <resource_group_name> en <your-site-name> de waarden die u eerder hebt gemaakt.

Het eindpunt voor uw web-app moet het achtervoegsel /api/updates/ bevatten.

# 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

Bekijk uw web-app opnieuw en u ziet dat er een validatiegebeurtenis voor het abonnement is verzonden. Selecteer het oogpictogram om de gebeurtenisgegevens uit te breiden. Via Event Grid wordt de validatiegebeurtenis verzonden zodat het eindpunt kan controleren of de gebeurtenisgegevens in aanmerking komen om ontvangen te worden. De web-app bevat code waarmee het abonnement kan worden gevalideerd.

Schermopname van de validatiegebeurtenis van het Event Grid-abonnement in de vooraf gemaakte web-app.

Een beleidstoewijzing maken

In deze quickstart maakt u een beleidstoewijzing en wijst u de tag Vereisen voor de definitie van resourcegroepen toe. Deze beleidsdefinitie identificeert resourcegroepen waarvoor de tag ontbreekt die tijdens de beleidstoewijzing is geconfigureerd.

Voer de volgende opdracht uit om een beleidstoewijzing te maken die is afgestemd op de resourcegroep die u hebt gemaakt voor het Event Grid-onderwerp:

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

De voorgaande opdracht maakt gebruik van de volgende informatie:

  • Naam: de werkelijke naam van de toewijzing. In dit voorbeeld zijn requiredtags-events gebruikt.
  • Weergavenaam: de weergavenaam voor de beleidstoewijzing. In dit geval gebruikt u de tag Vereisen op RG.
  • Bereik: een bereik bepaalt voor welke resources of groep resources de beleidstoewijzing wordt afgedwongen. Dit kan variëren van een abonnement tot resourcegroepen. Vergeet niet om <scope> te vervangen door de naam van uw resourcegroep. De indeling voor een bereik van een resourcegroep is /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>.
  • Beleid : de id van de beleidsdefinitie, op basis waarvan u de toewijzing maakt. In dit geval is het de id van de beleidsdefinitie Vereisen van een tag voor resourcegroepen. Voer de volgende opdracht uit om de id van de beleidstoewijzing te verkrijgen: az policy definition list --query "[?displayName=='Require a tag on resource groups']"

Nadat u de beleidstoewijzing hebt gemaakt, wacht u tot er een Microsoft.PolicyInsights.PolicyStateCreated gebeurtenismelding wordt weergegeven in de web-app. De resourcegroep die we hebben gemaakt, toont een data.complianceState waarde van NonCompliant om te starten.

Schermopname van de gebeurtenis Policy Created voor het Event Grid-abonnement voor de resourcegroep in de vooraf gedefinieerde web-app.

Notitie

Als de resourcegroep andere beleidstoewijzingen over neemt van de abonnements- of beheergroephiërarchie, worden ook gebeurtenissen voor elke groep weergegeven. Controleer of de gebeurtenis voor de toewijzing in deze zelfstudie is door de data.policyDefinitionId eigenschap te evalueren.

Een wijziging activeren in de resourcegroep

Als u de resourcegroep compatibel wilt maken, is een tag met de naam EventTest vereist. Voeg de tag toe aan de resourcegroep door de volgende opdracht te vervangen door uw abonnements-id <subscriptionId> en <resourceGroup> door de naam van de resourcegroep:

# 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

Nadat u de vereiste tag aan de resourcegroep hebt toegevoegd, wacht u tot een Microsoft.PolicyInsights.PolicyStateChanged gebeurtenismelding wordt weergegeven in de web-app. Vouw de gebeurtenis uit en de data.complianceState waarde toont nu Compatibel.

Probleemoplossing

Als er een fout wordt weergegeven die vergelijkbaar is met een van de volgende, controleert u of u beide resourceproviders hebt geregistreerd op het bereik waarop u zich abonneert (beheergroep of 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.'}]}

Resources opschonen

Als u van plan bent om door te gaan met dit web-app- en Azure Policy-gebeurtenisabonnement, moet u de resources die in dit artikel zijn gemaakt, niet opschonen. Als u niet van plan bent om door te gaan, gebruikt u de volgende opdracht om de resources te verwijderen die u in dit artikel hebt gemaakt.

Vervang door <resource_group_name> de resourcegroep die u hebt gemaakt.

az group delete --name <resource_group_name>

Volgende stappen

Nu u weet hoe u onderwerpen en gebeurtenisabonnementen voor Azure Policy maakt, vindt u meer informatie over wijzigingen in beleidsstatussen en Event Grid: