Udostępnij za pośrednictwem


Uzyskiwanie zmian zasobów

Zasoby zmieniają się w trakcie codziennego użytkowania, ponownej konfiguracji, a nawet ponownego wdrażania. Większość zmian jest zamierzona, ale czasami nie jest taka. Masz następujące możliwości:

  • Znajdź, kiedy wykryto zmiany we właściwości Azure Resource Manager.
  • Wyświetl szczegóły zmiany właściwości.
  • Wykonywanie zapytań o zmiany na dużą skalę w subskrypcjach, grupie zarządzania lub dzierżawie.

W tym artykule podano informacje o:

  • Jak wygląda kod JSON ładunku.
  • Jak wykonywać zapytania dotyczące zmian zasobów za pomocą usługi Resource Graph przy użyciu interfejsu wiersza polecenia, programu PowerShell lub witryny Azure Portal.
  • Przykłady zapytań i najlepsze rozwiązania dotyczące wykonywania zapytań dotyczących zmian zasobów.
  • Analiza zmian używa funkcji Change Actor :
    • changedBy: Kto zainicjował zmianę zasobu, na przykład identyfikator aplikacji lub adres e-mail osoby autoryzowanej.
    • clientType: Który klient dokonał zmiany, na przykład Azure portal.
    • operation: Która operacja została wywołana, na przykład Microsoft.Compute/virtualmachines/write. Pole operation w zasobie reprezentuje dane zmieniające uprawnienia kontroli dostępu opartej na rolach platformy Azure używane do inicjowania zmiany.

Wymagania wstępne

  • Aby umożliwić programowi Azure PowerShell wykonywanie zapytań względem usługi Azure Resource Graph, dodaj moduł .
  • Aby umożliwić interfejsowi wiersza polecenia platformy Azure wykonywanie zapytań względem usługi Azure Resource Graph, dodaj rozszerzenie.

Omówienie właściwości zdarzenia zmiany

Po utworzeniu, zaktualizowaniu lub usunięciu zasobu zostanie utworzony nowy zasób zmiany (Microsoft.Resources/changes), aby rozszerzyć zmodyfikowany zasób i reprezentować zmienione właściwości. Rekordy zmian powinny być dostępne w mniej niż pięć minut. Poniższy przykładowy ładunek JSON pokazuje właściwości zmiany zasobów:

{
  "targetResourceId": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "previousResourceSnapshotId": "11111111111111111111_22222222-3333-aaaa-bbbb-444444444444_5555555555_6666666666",
    "newResourceSnapshotId": "33333333333333333333_44444444-5555-ffff-gggg-666666666666_7777777777_8888888888",
    "correlationId": "11111111-1111-1111-1111-111111111111",
    "changedByType": "User",
    "changesCount": 2,
    "clientType": "Azure Portal",
    "changedBy": "john@contoso.com",
    "operation": "microsoft.compute/virtualmachines/write",
    "timestamp": "2024-06-12T13:26:17.347+00:00"
  },
  "changes": {
    "properties.provisioningState": {
      "newValue": "Succeeded",
      "previousValue": "Updating",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
    }
  }
}

Zapoznaj się z pełnym przewodnikiem referencyjnym, aby uzyskać informacje o zmianach właściwości zasobów.

Pole operation w danych zmiany zasobu reprezentuje uprawnienia kontroli dostępu opartej na rolach platformy Azure, używane do inicjowania zmiany. To pole nie zawsze opisuje rzeczywistą operację wykonaną, ale raczej uprawnienia (akcję autoryzacji), która została użyta. Na przykład Microsoft.Compute/virtualmachines/write odpowiada uprawnieniu dla operacji PUT/providers/Microsoft.Compute/virtualmachines.

Aby zrozumieć typ zmiany przechwyconej w zasobie (tj. tworzenie, usuwanie, aktualizowanie), zalecamy użycie changeType pola, a nie operation pola, które reprezentuje uprawnienia kontroli dostępu opartej na rolach platformy Azure używane do inicjowania zmiany.

Uwaga

Obecnie migawki nie są obsługiwane dla usuniętych zasobów. W przypadku rekordów z changeType: Usuń, changesCount jest wyświetlany jako 0, ponieważ sam zasób zostaje usunięty i nie ma pozostałych właściwości. W przypadku rekordów z elementem changeType: Utwórz, changesCount jest również pokazywane jako 0, ponieważ każda właściwość zasobu jest modyfikowana podczas tworzenia zasobu, a rejestrowanie każdej zmiany właściwości spowodowałoby zbyt dużo szumu.

Po wprowadzeniu nowych właściwości nie będą one wyświetlane jako zmiany. Na przykład może się to zdarzyć, gdy nowa wersja interfejsu API wprowadza nowe właściwości. Podobnie, jeśli nowe klucze zostaną dodane do tagów bez żadnych wartości, te zmiany nie zostaną wyświetlone.

Uruchamianie zapytania

Wypróbuj zapytanie dotyczące dzierżawcy w tabeli resourcechanges usługi Resource Graph. Zapytanie zwraca pierwsze pięć najnowszych zmian zasobów platformy Azure z czasem zmiany, typem zmiany, identyfikatorem zasobu docelowego, typem zasobu docelowego i szczegółami zmiany każdego rekordu zmiany.

# Login first with az login if not using Cloud Shell

# Run Azure Resource Graph query
az graph query -q 'resourcechanges | project properties.changeAttributes.timestamp, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | limit 5'

Możesz zaktualizować to zapytanie, aby określić bardziej przyjazną dla użytkownika nazwę kolumny dla właściwości znacznika czasu.

# Run Azure Resource Graph query with 'extend'
az graph query -q 'resourcechanges | extend changeTime=todatetime(properties.changeAttributes.timestamp) | project changeTime, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | limit 5'

Aby ograniczyć wyniki zapytania do najnowszych zmian, zaktualizuj zapytanie do order by właściwości zdefiniowanej przez changeTime użytkownika.

# Run Azure Resource Graph query with 'order by'
az graph query -q 'resourcechanges | extend changeTime=todatetime(properties.changeAttributes.timestamp) | project changeTime, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | order by changeTime desc | limit 5'

Możesz również wykonywać zapytania według grupy zarządzania lub subskrypcji z odpowiednio parametrami -ManagementGroup lub -Subscription .

Uwaga

Jeśli zapytanie nie zwraca wyników z subskrypcji, do której masz już dostęp, polecenie Search-AzGraph cmdlet programu PowerShell domyślnie używa subskrypcji w domyślnym kontekście.

Eksplorator usługi Resource Graph udostępnia również czysty interfejs umożliwiający konwertowanie wyników niektórych zapytań na wykres, który można przypiąć do pulpitu nawigacyjnego platformy Azure.

Wykonywanie zapytań o zmiany zasobów

Za pomocą usługi Resource Graph można wykonywać zapytania względem tabel resourcechanges, resourcecontainerchanges lub healthresourcechanges, aby filtrować lub sortować według dowolnych właściwości zmiany zasobów. Poniższe przykłady zapytują tabelę resourcechanges, ale można je również zastosować do tabeli resourcecontainerchanges lub tabeli healthresourcechanges.

Uwaga

Dowiedz się więcej o healthresourcechanges danych w dokumentacji programu Project Flash.

Przykłady

Przed wykonaniem zapytań i analizowaniem zmian w zasobach zapoznaj się z poniższymi najlepszymi rozwiązaniami.

  • Wykonaj zapytanie o zdarzenia zmiany w określonym przedziale czasu i oceń szczegóły zmiany.
    • To zapytanie działa najlepiej podczas zarządzania zdarzeniami, aby zrozumieć potencjalnie powiązane zmiany.
  • Aktualizuj aktualną bazę danych zarządzania konfiguracją (CMDB).
    • Zamiast odświeżać wszystkie zasoby i ich pełne zestawy właściwości zgodnie z zaplanowaną częstotliwością, zostaną wyświetlone tylko ich zmiany.
  • Dowiedz się, które inne właściwości zostały zmienione, gdy zasób zmienia stan zgodności.
    • Ocena tych dodatkowych właściwości może zapewnić wgląd w inne właściwości, które mogą być konieczne do zarządzania za pomocą definicji usługi Azure Policy.
  • Kolejność poleceń zapytania jest ważna. W poniższych przykładach order by musi wystąpić przed poleceniem limit.
    • Polecenie order by porządkuje wyniki zapytania według czasu zmiany.
    • Następnie limit polecenie ogranicza uporządkowane wyniki, aby upewnić się, że uzyskasz pięć najnowszych wyników.
  • Co to jest Nieznany ? 
    • Nieznane jest wyświetlane, gdy zmiana nastąpiła na nierozpoznanym kliencie. Klienci są rozpoznawani na podstawie agenta użytkownika i identyfikatora aplikacji klienckiej skojarzonej z oryginalnym żądaniem zmiany.
  • Co oznacza system ?
    • System jest wyświetlany jako wartość changedBy, gdy nastąpiła systemowa zmiana w tle, która nie była skorelowana z żadnym bezpośrednim działaniem użytkownika.

Wszystkie zmiany w ciągu ostatnich 24 godzin

resourcechanges
| extend changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId),
changeType = tostring(properties.changeType), correlationId = properties.changeAttributes.correlationId, 
changedProperties = properties.changes, changeCount = properties.changeAttributes.changesCount
| where changeTime > ago(1d)
| order by changeTime desc
| project changeTime, targetResourceId, changeType, correlationId, changeCount, changedProperties

Zasoby usunięte w określonej grupie zasobów

resourcechanges
| where resourceGroup == "myResourceGroup"
| extend changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId),
  changeType = tostring(properties.changeType), correlationId = properties.changeAttributes.correlationId
| where changeType == "Delete"
| order by changeTime desc
| project changeTime, resourceGroup, targetResourceId, changeType, correlationId

Zmiany określonej wartości właściwości

resourcechanges
| extend provisioningStateChange = properties.changes["properties.provisioningState"], changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType)
| where isnotempty(provisioningStateChange)and provisioningStateChange.newValue == "Succeeded"
| order by changeTime desc
| project changeTime, targetResourceId, changeType, provisioningStateChange.previousValue, provisioningStateChange.newValue

Zmiany w ciągu ostatnich siedmiu dni według tego, kto i który klient, i uporządkowane według liczby

resourcechanges 
| extend changeTime = todatetime(properties.changeAttributes.timestamp), 
  targetResourceId = tostring(properties.targetResourceId), 
  changeType = tostring(properties.changeType), changedBy = tostring(properties.changeAttributes.changedBy), 
  changedByType = properties.changeAttributes.changedByType, 
  clientType = tostring(properties.changeAttributes.clientType) 
| where changeTime > ago(7d) 
| project changeType, changedBy, changedByType, clientType 
| summarize count() by changedBy, changeType, clientType 
| order by count_ desc 

Zmiany rozmiaru maszyny wirtualnej

resourcechanges
| extend vmSize = properties.changes["properties.hardwareProfile.vmSize"], changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType) 
| where isnotempty(vmSize) 
| order by changeTime desc 
| project changeTime, targetResourceId, changeType, properties.changes, previousSize = vmSize.previousValue, newSize = vmSize.newValue

Liczba zmian według typu zmiany i nazwy subskrypcji

resourcechanges  
| extend changeType = tostring(properties.changeType), changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceType=tostring(properties.targetResourceType)  
| summarize count() by changeType, subscriptionId 
| join (resourcecontainers | where type=='microsoft.resources/subscriptions' | project SubscriptionName=name, subscriptionId) on subscriptionId 
| project-away subscriptionId, subscriptionId1
| order by count_ desc  

Najnowsze zmiany zasobów dla zasobów utworzonych przy użyciu określonego tagu

resourcechanges 
|extend targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType), createTime = todatetime(properties.changeAttributes.timestamp) 
| where createTime > ago(7d) and changeType == "Create" or changeType == "Update" or changeType == "Delete"
| project  targetResourceId, changeType, createTime 
| join ( resources | extend targetResourceId=id) on targetResourceId
| where tags ['Environment'] =~ 'prod' 
| order by createTime desc 
| project createTime, id, resourceGroup, type

Następne kroki