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 App-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
.
Voraussetzungen
- Fügen Sie das Modul hinzu, um Azure PowerShell für die Abfrage von Azure Resource Graph zu aktivieren.
- Fügen Sie die Erweiterung hinzu, um die Azure-Befehlszeilenschnittstelle für die Abfrage von Azure Resource Graph zu aktivieren.
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. 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.
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 changeTime
-Eigenschaft sortiert werden (order by
).
# 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 -ManagementGroup
und -Subscription
können Sie auch nach Verwaltungsgruppe 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 demlimit
-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.
- Der
- 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.
- Das System wird als
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