Självstudie: Dirigera principtillståndsändringshändelser till Event Grid med Azure CLI
I den här artikeln får du lära dig hur du konfigurerar Azure Policy-händelseprenumerationer för att skicka ändringshändelser för principtillstånd till en webbslutpunkt. Azure Policy-användare kan prenumerera på händelser som genereras när principtillståndsändringar sker på resurser. Dessa händelser kan utlösa webbkrokar, Azure Functions, Azure Storage-köer eller andra händelsehanterare som stöds av Azure Event Grid. Normalt kan du skicka händelser till en slutpunkt som bearbetar informationen om händelsen och utför åtgärder. För att förenkla den här självstudien skickar du händelserna till en webbapp som samlar in och visar meddelandena.
Förutsättningar
- Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
- Den här snabbstarten kräver att du kör Azure CLI version 2.0.76 eller senare. Kör
az --version
för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.
Skapa en resursgrupp
Event Grid-ämnen är Azure-resurser och måste placeras i en Azure-resursgrupp. Resursgruppen är en logisk samling där Azure-resurser distribueras och hanteras.
Skapa en resursgrupp med kommandot az group create.
I följande exempel skapas en resursgrupp med namnet <resource_group_name>
på platsen westus . Ersätt <resource_group_name>
med ett unikt namn för din resursgrupp.
# Log in first with az login if you're not using Cloud Shell
az group create --name <resource_group_name> --location westus
Skapa ett Event Grid-systemämne
Nu när vi har en resursgrupp skapar vi ett systemämne. Ett systemämne i Event Grid representerar en eller flera händelser som publicerats av Azure-tjänster som Azure Policy och Azure Event Hubs. Det här systemavsnittet använder ämnestypen Microsoft.PolicyInsights.PolicyStates
för ändringar av Azure Policy-tillstånd.
Först måste du registrera PolicyInsights
resursprovidrar EventGrid
(RPs) och i lämpligt hanteringsomfång. Azure Portal registrerar alla RP:er som du anropar för första gången, men det gör inte 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
Ersätt <subscriptionId>
sedan i parametern scope
med ID för din prenumeration och <resource_group_name>
i resource-group
parametern med den tidigare skapade resursgruppen.
az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/subscriptions/<subscriptionId>" --resource-group "<resource_group_name>"
Om ditt Event Grid-systemämne tillämpas på hanteringsgruppens omfång är Parametersyntaxen för Azure CLI --source
lite annorlunda. Här är ett exempel:
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>"
Skapa en slutpunkt för meddelanden
Innan du prenumererar på ämnet ska vi ska slutpunkten för händelsemeddelandet. Slutpunkten utför vanligtvis åtgärder baserat på informationen om händelsen. För att förenkla den här snabbstarten distribuerar du en fördefinierad webbapp som visar händelsemeddelandena. Den distribuerade lösningen innehåller en App Service-plan,en webbapp för App Service och källkod från GitHub.
Ersätt <your-site-name>
med ett unikt namn för din webbapp. Webbappens namn måste vara unikt eftersom det är en del av DNS-posten (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
Distributionen kan ta några minuter att slutföra. Efter en lyckad distribution visar du webbappen för att se till att den körs. I en webbläsare navigerar du till: https://<your-site-name>.azurewebsites.net
Webbplatsen bör visas utan några meddelanden.
Prenumerera på systemämnet
Du prenumererar på ett ämne därför att du vill ange för Event Grid vilka händelser du vill följa och vart du vill skicka händelserna. I följande exempel prenumererar du på det systemämne som du skapade och skickar URL:en från webbappen som slutpunkt för att ta emot händelsemeddelanden. Ersätt <event_subscription_name>
med ett namn för din händelseprenumeration. För <resource_group_name>
och <your-site-name>
använder du det värde du skapade tidigare.
Slutpunkten för ditt webbprogram måste innehålla suffixet /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
Visa webbappen igen och observera att en prenumerationsverifieringshändelse skickades till den. Välj ögonikonen för att utöka informationen om händelsen. Händelserutnätet skickar valideringshändelsen så att slutpunkten kan bekräfta att den vill ta emot händelsedata. Webbappen inkluderar kod för att verifiera prenumerationen.
Skapa en principtilldelning
I den här snabbstarten skapar du en principtilldelning och tilldelar definitionen Kräv en tagg för resursgrupper . Den här principdefinitionen identifierar resursgrupper som saknar taggen som konfigurerades under principtilldelningen.
Kör följande kommando för att skapa en principtilldelning som är begränsad till den resursgrupp som du skapade för att lagra Event Grid-ämnet:
# 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\" } }'
Föregående kommando använder följande information:
- Namn - det faktiska namnet på tilldelningen. I det här exemplet användes requiredtags-events .
- Visningsnamn – Visningsnamn för principtilldelningen. I det här fallet använder du Kräv tagg på RG.
- Omfång – Ett omfång avgör vilka resurser eller grupper med resurser som principtilldelningen används på. Det kan vara allt från en prenumeration till resursgrupper. Kom ihåg att ersätta
<scope>
med namnet på din resursgrupp. Formatet för ett resursgruppsomfång är/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
. - Princip – principdefinitions-ID, baserat på vilket du använder för att skapa tilldelningen. I det här fallet är det ID:t för principdefinitionen Kräv en tagg för resursgrupper. För att hämta principdefinitionens ID kör du det här kommandot:
az policy definition list --query "[?displayName=='Require a tag on resource groups']"
När du har skapat principtilldelningen väntar du på att ett Microsoft.PolicyInsights.PolicyStateCreated
händelsemeddelande ska visas i webbappen. Resursgruppen som vi skapade visar värdet data.complianceState
NonCompliant för att starta.
Kommentar
Om resursgruppen ärver andra principtilldelningar från prenumerations- eller hanteringsgruppshierarkin visas även händelser för var och en. Bekräfta att händelsen är för tilldelningen i den här självstudien data.policyDefinitionId
genom att utvärdera egenskapen.
Utlösa en ändring i resursgruppen
För att göra resursgruppen kompatibel krävs en tagg med namnet EventTest . Lägg till taggen i resursgruppen med följande kommando som <subscriptionId>
ersätter med ditt prenumerations-ID och <resourceGroup>
med namnet på resursgruppen:
# 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
När du har lagt till taggen som krävs i resursgruppen väntar du på att ett Microsoft.PolicyInsights.PolicyStateChanged
händelsemeddelande ska visas i webbappen. Expandera händelsen och data.complianceState
värdet visar nu Kompatibel.
Felsökning
Om du ser ett fel som liknar något av följande kontrollerar du att du har registrerat båda resursprovidrar i det omfång som du prenumererar på (hanteringsgrupp eller prenumeration):
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.'}]}
Rensa resurser
Om du planerar att fortsätta arbeta med den här webbappen och azure policy-händelseprenumerationen ska du inte rensa resurserna som skapas i den här artikeln. Om du inte planerar att fortsätta använder du följande kommando för att ta bort de resurser som du skapade i den här artikeln.
Ersätt <resource_group_name>
med den resursgrupp som du skapade.
az group delete --name <resource_group_name>
Nästa steg
Nu när du vet hur du skapar ämnen och händelseprenumerationer för Azure Policy kan du läsa mer om ändringshändelser för principtillstånd och Event Grid: