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ładMicrosoft.Compute/virtualmachines/write
. Poleoperation
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",
}
}
}
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 poleceniemlimit
.- 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.
- Polecenie
- 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.
- System jest wyświetlany jako wartość
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