Samouczek: kierowanie zdarzeń zmiany stanu zasad do usługi Event Grid za pomocą interfejsu wiersza polecenia platformy Azure

Z tego artykułu dowiesz się, jak skonfigurować subskrypcje zdarzeń usługi Azure Policy w celu wysyłania zdarzeń zmiany stanu zasad do internetowego punktu końcowego. Użytkownicy usługi Azure Policy mogą subskrybować zdarzenia emitowane w przypadku wystąpienia zmian stanu zasad w zasobach. Te zdarzenia mogą wyzwalać elementy webhook, usługę Azure Functions, kolejki usługi Azure Storage lub dowolną inną procedurę obsługi zdarzeń obsługiwaną przez usługę Azure Event Grid. Zazwyczaj użytkownik wysyła zdarzenia do punktu końcowego, w którym następuje przetwarzanie danych zdarzenia i są wykonywane akcje. Jednak w celu uproszczenia tego samouczka zdarzenia są wysyłane do aplikacji internetowej, która zbiera i wyświetla komunikaty.

Wymagania wstępne

  • Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

  • Ten przewodnik Szybki start wymaga uruchomienia interfejsu wiersza polecenia platformy Azure w wersji 2.0.76 lub nowszej. Aby dowiedzieć się, jaka wersja jest używana, uruchom polecenie az --version. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Azure Cloud Shell

Na platforma Azure hostowane jest Azure Cloud Shell, interaktywne środowisko powłoki, z którego można korzystać w przeglądarce. Do pracy z usługami platformy Azure można używać programu Bash lub PowerShell w środowisku Cloud Shell. Aby uruchomić kod w tym artykule, możesz użyć wstępnie zainstalowanych poleceń usługi Cloud Shell bez konieczności instalowania niczego w środowisku lokalnym.

Aby uruchomić środowisko Azure Cloud Shell:

Opcja Przykład/link
Wybierz pozycję Wypróbuj w prawym górnym rogu bloku kodu lub polecenia. Wybranie pozycji Wypróbuj nie powoduje automatycznego skopiowania kodu lub polecenia do usługi Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Przejdź do witryny https://shell.azure.com lub wybierz przycisk Uruchom Cloud Shell, aby otworzyć środowisko Cloud Shell w przeglądarce. Button to launch Azure Cloud Shell.
Wybierz przycisk Cloud Shell na pasku menu w prawym górnym rogu witryny Azure Portal. Screenshot that shows the Cloud Shell button in the Azure portal

Aby użyć usługi Azure Cloud Shell:

  1. Uruchom usługę Cloud Shell.

  2. Wybierz przycisk Kopiuj w bloku kodu (lub bloku poleceń), aby skopiować kod lub polecenie.

  3. Wklej kod lub polecenie do sesji usługi Cloud Shell, wybierając klawisze Ctrl+Shift V w systemach Windows i Linux lub wybierając pozycję Cmd+Shift++V w systemie macOS.

  4. Wybierz klawisz Enter, aby uruchomić kod lub polecenie.

Tworzenie grupy zasobów

Tematy usługi Event Grid to zasoby platformy Azure i muszą być umieszczone w grupie zasobów platformy Azure. Grupa zasobów to kolekcja logiczna przeznaczona do wdrażania zasobów platformy Azure i zarządzania nimi.

Utwórz grupę zasobów za pomocą polecenia az group create.

Poniższy przykład tworzy grupę zasobów o nazwie <resource_group_name> w lokalizacji westus . Zamień <resource_group_name> na unikatową nazwę grupy zasobów.

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

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

Tworzenie tematu systemu usługi Event Grid

Teraz, gdy mamy grupę zasobów, utworzymy temat systemowy. Temat systemowy w usłudze Event Grid reprezentuje co najmniej jedno zdarzenie opublikowane przez usługi platformy Azure, takie jak Azure Policy i Azure Event Hubs. W tym temacie systemowym jest używany typ tematu Microsoft.PolicyInsights.PolicyStates dla zmian stanu usługi Azure Policy.

Najpierw należy zarejestrować PolicyInsights dostawców zasobów i EventGrid w odpowiednim zakresie zarządzania. Podczas gdy witryna Azure Portal automatycznie rejestruje wszystkie wywołane przez Ciebie adresy IP po raz pierwszy, interfejs wiersza polecenia platformy Azure nie jest.

# 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

Następnie zastąp <subscriptionId> wartość w parametrze zakresu identyfikatorem subskrypcji i <resource_group_name> parametrem grupy zasobów wcześniej utworzoną grupą zasobów.

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

Jeśli temat systemu usługi Event Grid zostanie zastosowany do zakresu grupy zarządzania, składnia parametrów interfejsu wiersza polecenia --source platformy Azure jest nieco inna. Oto przykład:

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

Tworzenie punktu końcowego komunikatów

Przed zasubskrybowaniem tematu utwórzmy punkt końcowy dla komunikatów o zdarzeniach. Zazwyczaj w punkcie końcowym akcje są wykonywane na podstawie danych zdarzenia. Aby uprościć ten przewodnik Szybki Start, wdrożysz wstępnie zbudowaną aplikację sieci Web, która będzie wyświetlać komunikaty o zdarzeniach. Wdrożone rozwiązanie zawiera plan usługi App Service, aplikację internetową usługi App Service i kod źródłowy z repozytorium GitHub.

Zastąp <your-site-name> unikatową nazwą aplikacji internetowej. Nazwa aplikacji internetowej musi być unikatowa, ponieważ stanowi część wpisu 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

Wdrożenie może potrwać kilka minut. Po pomyślnym wdrożeniu należy wyświetlić aplikację sieci Web i upewnić się, że jest uruchomiona. W przeglądarce sieci Web przejdź do: https://<your-site-name>.azurewebsites.net

Powinna być widoczna witryna internetowa bez żadnych aktualnie wyświetlanych komunikatów.

Subskrybowanie tematu systemowego

Subskrybowanie tematu to dla usługi Event Grid informacja o tym, które zdarzenia chcesz śledzić i gdzie mają być one wysyłane. Poniższy przykład subskrybuje utworzony temat systemowy i przekazuje adres URL z aplikacji internetowej jako punkt końcowy w celu odbierania powiadomień o zdarzeniach. Zastąp element <event_subscription_name> nazwą Twojej subskrypcji zdarzeń. Jako parametrów <resource_group_name> i <your-site-name> użyj utworzonych wcześniej wartości.

Punkt końcowy dla aplikacji internetowej musi zawierać sufiks /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

Wyświetl aplikację sieci Web ponownie i zwróć uwagę, że zdarzenie sprawdzania poprawności subskrypcji zostało do niej wysłane. Wybierz ikonę oka, aby rozwinąć dane zdarzenia. Usługa Event Grid wysyła zdarzenie weryfikacji, aby w punkcie końcowym mogło nastąpić sprawdzenie, czy dane zdarzenia mają być odbierane. Aplikacja internetowa zawiera kod do sprawdzania poprawności subskrypcji.

Screenshot of the Event Grid subscription validation event in the pre-built web app.

Tworzenie przypisania zasad

W tym przewodniku Szybki start utworzysz przypisanie zasad i przypiszesz definicję Wymagaj tagu w grupach zasobów. Ta definicja zasad identyfikuje grupy zasobów, które nie mają tagu skonfigurowanego podczas przypisywania zasad.

Uruchom następujące polecenie, aby utworzyć przypisanie zasad o zakresie do grupy zasobów utworzonej w celu przechowywania tematu usługi 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\" } }'

Poprzednie polecenie korzysta z następujących informacji:

  • Nazwa —rzeczywista nazwa przypisania. W tym przykładzie użyto elementu requiredtags-events .
  • DisplayName — nazwa wyświetlana przypisania zasad. W takim przypadku używasz tagu Wymagaj w usłudze RG.
  • Zakres — zakres określa, jakie zasoby lub grupy zasobów są wymuszane w ramach przypisania zasad. Może obejmować zarówno subskrypcje, jak i grupy zasobów. Pamiętaj, aby zastąpić fragment <zakres> nazwą grupy zasobów. Format zakresu grupy zasobów to /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>.
  • Policy — identyfikator definicji zasad, na podstawie którego używasz do utworzenia przypisania. W takim przypadku jest to identyfikator definicji zasad Wymagaj tagu w grupach zasobów. Aby uzyskać identyfikator definicji zasad, uruchom następujące polecenie: az policy definition list --query "[?displayName=='Require a tag on resource groups']"

Po utworzeniu przypisania zasad poczekaj na Microsoft.Policy Szczegółowe informacje. PolicyStateUtwórz powiadomienie o zdarzeniu, które ma być wyświetlane w aplikacji internetowej. Utworzona grupa zasobów zawiera data.complianceState wartość NonCompliant , aby rozpocząć.

Screenshot of the Event Grid subscription Policy State Created event for the resource group in the pre-built web app.

Uwaga

Jeśli grupa zasobów dziedziczy inne przypisania zasad z hierarchii subskrypcji lub grupy zarządzania, wyświetlane są również zdarzenia dla każdej z nich. Upewnij się, że zdarzenie dotyczy przypisania w tym samouczku, oceniając data.policyDefinitionId właściwość.

Wyzwalanie zmiany w grupie zasobów

Aby zapewnić zgodność grupy zasobów, wymagany jest tag o nazwie EventTest . Dodaj tag do grupy zasobów za pomocą następującego polecenia, zastępując <subscriptionId> ciąg identyfikatorem subskrypcji i <resourceGroup> nazwą grupy zasobów:

# 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

Po dodaniu wymaganego tagu do grupy zasobów poczekaj na microsoft.Policy Szczegółowe informacje. PolicyStateChanged powiadomienie o zdarzeniu, które ma być wyświetlane w aplikacji internetowej. Rozwiń zdarzenie, a wartość jest teraz wyświetlana data.complianceState jako Zgodne.

Rozwiązywanie problemów

Jeśli zostanie wyświetlony błąd podobny do jednego z poniższych, upewnij się, że obaj dostawcy zasobów zarejestrowali się w zakresie, w którym subskrybujesz (grupę zarządzania lub subskrypcję):

  • 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.'}]}

Czyszczenie zasobów

Jeśli planujesz kontynuować pracę z tą aplikacją internetową i subskrypcją zdarzeń usługi Azure Policy, nie usuwaj zasobów utworzonych w tym artykule. Jeśli nie planujesz kontynuować, użyj następującego polecenia, aby usunąć zasoby utworzone w tym artykule.

Zamień <resource_group_name> na utworzoną powyżej grupę zasobów.

az group delete --name <resource_group_name>

Następne kroki

Teraz, gdy wiesz, jak tworzyć tematy i subskrypcje zdarzeń dla usługi Azure Policy, dowiedz się więcej o zdarzeniach zmiany stanu zasad i o tym, co usługa Event Grid może ci pomóc: