Freigeben über


Abrufen von Ressourcenänderungen

Ressourcen werden während der alltäglichen Verwendung, Neukonfiguration und sogar der erneuten Bereitstellung geändert. Die meisten, jedoch nicht alle Änderungen sind beabsichtigt. Ihre Möglichkeiten:

  • Ermitteln, wann Änderungen an einer Azure Resource Manager-Eigenschaft festgestellt wurden
  • Anzeigen von Eigenschaftenänderungsdetails.
  • Abfragen von Änderungen im großen Stil für Ihre Abonnements, Ihre Verwaltungsgruppe oder Ihren Mandanten.

In diesem Artikel wird Folgendes behandelt:

  • Informationen zu den JSON-Nutzdaten
  • Abfragen von Ressourcenänderungen über Resource Graph mithilfe von PowerShell, der CLI oder des Azure-Portals
  • Abfragebeispiele und Best Practices zum Abfragen von Ressourcenänderungen
  • Änderungsanalyse verwendet Change Actor-Funktionalität:
    • changedBy: Wer eine Änderung in Ihrer Ressource initiiert hat, z. B. eine Anwendungs-ID oder die E-Mail-Adresse einer autorisierten Person.
    • clientType: Welcher Client die Änderung vorgenommen hat, z. B. das Azure-Portal.
    • operation: Welcher Vorgang aufgerufen wurde, z. B. Microsoft.Compute/virtualmachines/write. Das operation Feld in den Ressourcenänderungendaten stellt die Azure-rollenbasierten Zugriffssteuerungsberechtigungen dar, die zum Initiieren der Änderung verwendet werden.

Voraussetzungen

Grundlegendes zu Änderungsereigniseigenschaften

Wenn eine Ressource erstellt, aktualisiert oder gelöscht wird, wird eine neue Änderungsressource (Microsoft.Resources/changes) erstellt, um die geänderte Ressource zu erweitern und die geänderten Eigenschaften zu darstellen. Änderungsdatensätze sollten in weniger als fünf Minuten verfügbar sein. Einige Änderungsdetails werden möglicherweise vor anderen angezeigt. Die folgenden JSON-Beispielnutzdaten veranschaulichen die Änderungsressourceneigenschaften:

{
  "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",
    }
  }
}

Hier finden Sie den vollständigen Referenzleitfaden für Änderungsressourceneigenschaften.

Das operation Feld in den Ressourcenänderungendaten stellt die Azure-rollenbasierten Zugriffssteuerungsberechtigungen dar, die zum Initiieren der Änderung verwendet werden. Dieses Feld beschreibt nicht immer den tatsächlich ausgeführten Vorgang, sondern die Berechtigung (Autorisierungsaktion), die verwendet wurde. Entspricht beispielsweise Microsoft.Compute/virtualmachines/write der Berechtigung für den Vorgang PUT/providers/Microsoft.Compute/virtualmachines.

Um die Art der Änderung zu verstehen, die in der Ressource erfasst wurde (d. h. Erstellen, Löschen, Aktualisieren), empfehlen wir, das Feld anstelle des operation Felds zu verwendenchangeType, das stattdessen die Azure-rollenbasierten Zugriffssteuerungsberechtigungen darstellt, die zum Initiieren der Änderung verwendet werden.

Wenn der Clienttyp bekannt ist, zeigt das clientType Feld den Clientnamen an, z. B. "Azure-Portal". Wenn der Client angegeben, aber nicht bekannt ist, zeigt das Feld die Clientanwendungs-ID an.

Hinweis

Momentaufnahmen werden für gelöschte Ressourcen derzeit nicht unterstützt. Für Datensätze mit changeType: Löschen wird dies changesCount als 0 angezeigt, da die Ressource selbst gelöscht wird und keine Eigenschaften verbleiben. Bei Datensätzen mit changeType: Erstellen wird die changesCount Eigenschaft auch als 0 angezeigt, da jede Ressourceneigenschaft während der Ressourcenerstellung geändert wird, und die Protokollierung jeder Eigenschaftsänderung würde zu viel Rauschen verursachen.

Wenn neue Eigenschaften eingeführt werden, werden sie nicht als Änderungen angezeigt. Dies kann beispielsweise auftreten, wenn eine neue API-Version neue Eigenschaften einführt. Wenn neue Schlüssel auch ohne Werte zu Tags hinzugefügt werden, werden diese Änderungen nicht angezeigt.

Ausführen einer Abfrage

Probieren Sie eine mandantenbasierte Resource Graph-Abfrage der resourcechanges-Tabelle auszuprobieren. Die Abfrage gibt die ersten fünf jüngsten Azure-Ressourcenänderungen mit Änderungszeit, Änderungstyp, Zielressourcen-ID, Zielressourcentyp und Änderungsdetails jedes Änderungsdatensatzes zurück.

# 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'

Sie können diese Abfrage aktualisieren, um einen benutzerfreundlicheren Spaltennamen für die timestamp-Eigenschaft anzugeben.

# 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'

Um die Abfrageergebnisse auf die neuesten Änderungen zu beschränken, aktualisieren Sie die Abfrage so, dass die Ergebnisse nach der benutzerdefinierten order by-Eigenschaft sortiert werden (changeTime).

# 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'

Mit den Parametern und -ManagementGroup können Sie auch nach -Subscription bzw. Abonnement abfragen.

Hinweis

Das PowerShell-Cmdlet Search-AzGraph verwendet standardmäßig Abonnements im Standardkontext, wenn die Abfrage keine Ergebnisse aus einem Abonnement zurückgibt, auf das Sie bereits Zugriff haben.

Der Resource Graph-Explorer bietet auch eine übersichtliche Oberfläche, auf der Sie die Ergebnisse mancher Abfragen in ein Diagramm umwandeln können, das Sie anschließend an ein Azure-Dashboard anheften können.

Abfragen von Ressourcenänderungen

Mit Resource Graph können Sie die Tabellen resourcechanges, resourcecontainerchanges oder healthresourcechanges abfragen, um nach einer der Änderungsressourceneigenschaften zu filtern oder zu sortieren. In den folgenden Beispielen wird die resourcechanges-Tabelle abfragt, aber das Beispiel kann auch auf die resourcecontainerchanges- und healthresourcechanges-Tabellen übertragen werden.

Hinweis

Weitere Informationen zu den healthresourcechanges-Daten finden Sie in der Project Flash-Dokumentation.

Beispiele

Informieren Sie sich vor dem Abfragen und Analysieren von Änderungen in Ihren Ressourcen über die folgenden Best Practices.

  • Sie können Änderungsereignisse in einem bestimmten Zeitfenster abfragen und die Änderungsdetails auswerten.
    • Diese Abfrage funktioniert am besten bei der Verwaltung von Incidents zum Suchen potenziell ähnlicher Änderungen.
  • Halten Sie eine Datenbank für die Konfigurationsverwaltung (Configuration Management Database, CMDB) auf dem neuesten Stand.
    • Anstatt alle Ressourcen und ihre vollständigen Eigenschaftensätze in festgelegten Intervallen zu aktualisieren, erhalten Sie nur deren Änderungen.
  • Verstehen Sie, welche anderen Eigenschaften geändert wurden, wenn ein Ressourcenkompatibilitätsstatus geändert wurde.
    • Die Auswertung dieser zusätzlichen Eigenschaften kann Einblicke in andere Eigenschaften bieten, die möglicherweise über eine Azure Policy-Definition verwaltet werden müssen.
  • Die Reihenfolge der Abfragebefehle ist wichtig. In den folgenden Beispielen muss der order by-Befehl vor dem limit-Befehl stehen.
    • Der order by-Befehl sortiert die Abfrageergebnisse nach der Änderungszeit.
    • Der limit-Befehl grenzt dann die sortierten Ergebnisse ein, um sicherzustellen, dass Sie die fünf neuesten Ergebnisse erhalten.
  • Was bedeutet Unbekannt? 
    • Unbekannt wird angezeigt, wenn die Änderung auf einem Client aufgetreten ist, der nicht erkannt wurde. Clients werden basierend auf dem Benutzer-Agent und der Clientanwendungs-ID erkannt, die der ursprünglichen Änderungsanforderung zugeordnet ist.
  • Was bedeutet System?
    • Das System wird als changedBy-Wert angezeigt, wenn eine Hintergrundänderung aufgetreten ist, die nicht mit einer direkten Benutzeraktion korreliert wurde.

Alle Änderungen im letzten 24-Stunden-Zeitraum

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

In einer bestimmten Ressourcengruppe gelöschte Ressourcen

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

Änderungen an einem bestimmten Eigenschaftswert

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

Änderungen in den letzten sieben Tagen nach dem Wer, Welcher Kunde und der Bestellungsanzahl

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 

VM-Größenänderungen

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

Anzahl von Änderungen nach Änderungstyp und Abonnementname

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  

Neueste Ressourcenänderungen für Ressourcen, die mit einem bestimmten Tag erstellt wurden

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

Nächste Schritte