Uzyskiwanie zmian zasobów

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

  • Znajdowanie wykrytych zmian we właściwości usługi 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.

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 zasobu zmiany:

{
  "targetResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "previousResourceSnapshotId": "08584889383111245807_37592049-3996-ece7-c583-3008aef9e0e1_4043682982_1712668574",
    "newResourceSnapshotId": "08584889377081305807_38788020-eeee-ffff-028f-6121bdac9cfe_4213468768_1712669177",
    "correlationId": "04ff69b3-e162-4583-9cd7-1a14a1ec2c61",
    "changedByType": "User",
    "changesCount": 2,
    "clientType": "ARM Template",
    "changedBy": "john@contoso.com",
    "operation": "microsoft.compute/virtualmachines/write",
    "timestamp": "2024-04-09T13:26:17.347+00:00"
  },
  "changes": {
    "properties.provisioningState": {
      "newValue": "Succeeded",
      "previousValue": "Updating",
      "changeCategory": "System",
      "propertyChangeType": "Update",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
      "changeCategory": "User",
      "propertyChangeType": "Insert"
    }
  }
}

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

Uruchamianie zapytania

Wypróbuj zapytanie usługi Resource Graph oparte na dzierżawie w resourcechanges tabeli. 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 changeTime zdefiniowanej przez 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 jest domyślnie subskrypcjami w kontekście domyślnym.

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 resourcechangeswzględem tabel , lub healthresourcechanges , resourcecontainerchangesaby filtrować lub sortować według dowolnych właściwości zasobu zmiany. Poniższe przykłady umożliwiają wykonywanie zapytań resourcechanges względem tabeli, ale można je również zastosować do resourcecontainerchanges tabeli lub 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ę, jakie inne właściwości mogły zostać zmienione, gdy zasób zmieni 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ć potrzebne do zarządzania za pomocą definicji usługi Azure Policy.
  • Kolejność poleceń zapytania jest ważna. W poniższych przykładach order by element musi zostać podany 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.

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

Najnowsze zmiany zasobów dla zasobów utworzonych w ciągu ostatnich siedmiu dni

resourcechanges
| extend targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType), changeTime = todatetime(properties.changeAttributes.timestamp)
| where changeTime > ago(7d) and changeType == "Create"
| project  targetResourceId, changeType, changeTime
| join ( Resources | extend targetResourceId=id) on targetResourceId
| order by changeTime desc
| project changeTime, changeType, id, resourceGroup, type, properties

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