Resourcewijzigingen ophalen
Resources veranderen in de loop van het dagelijks gebruik, herconfiguratie en zelfs opnieuw implementeren. De meeste verandering is standaard, maar soms niet. U kunt:
- Zien wanneer wijzigingen in een Azure Resource Manager-eigenschap zijn gedetecteerd.
- Details van eigenschapswijziging weergeven.
- Query's uitvoeren op wijzigingen op schaal in uw abonnementen, beheergroep of tenant.
In dit artikel leert u het volgende:
- Hoe de JSON van de nettolading eruitziet.
- Resourcewijzigingen opvragen via Resource Graph met behulp van de CLI, PowerShell of Azure Portal.
- Queryvoorbeelden en aanbevolen procedures voor het uitvoeren van query's op resourcewijzigingen.
- Wijzigingsanalyse maakt gebruik van de functie Change Actor :
changedBy
: Wie een wijziging heeft gestart in uw resource, zoals een app-id of het e-mailadres van een geautoriseerde persoon.clientType
: Welke client heeft de wijziging aangebracht, zoals Azure Portal.operation
: Welke bewerking werd aangeroepen, zoalsMicrosoft.Compute/virtualmachines/write
.
Vereisten
- Als u Azure PowerShell wilt inschakelen om een query uit te voeren op Azure Resource Graph, voegt u de module toe.
- Als u wilt dat Azure CLI query's uitvoert op Azure Resource Graph, voegt u de extensie toe.
Inzicht in eigenschappen van wijzigingsevenementen
Wanneer een resource wordt gemaakt, bijgewerkt of verwijderd, wordt er een nieuwe wijzigingsresource (Microsoft.Resources/changes
) gemaakt om de gewijzigde resource uit te breiden en de gewijzigde eigenschappen weer te geven. Wijzigingsrecords moeten binnen vijf minuten beschikbaar zijn. In het volgende voorbeeld van de JSON-nettolading ziet u de eigenschappen van de wijzigingsresource:
{
"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",
}
}
}
Zie de volledige referentiehandleiding voor het wijzigen van resource-eigenschappen.
Een query uitvoeren
Probeer een resourcegrafiekquery op basis van een tenant uit van de resourcechanges
tabel. De query retourneert de eerste vijf meest recente Azure-resourcewijzigingen met de wijzigingstijd, het wijzigingstype, de doelresource-id, het doelresourcetype en de details van elke wijzigingsrecord.
# 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'
U kunt deze query bijwerken om een gebruiksvriendelijkere kolomnaam op te geven voor de tijdstempeleigenschap .
# 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'
Als u de queryresultaten wilt beperken tot de meest recente wijzigingen, werkt u de query bij naar order by
de door de gebruiker gedefinieerde changeTime
eigenschap.
# 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'
U kunt ook query's uitvoeren op beheergroep of abonnement met respectievelijk de -ManagementGroup
of -Subscription
parameters.
Notitie
Als de query geen resultaten retourneert van een abonnement waartoe u al toegang hebt, wordt de Search-AzGraph
PowerShell-cmdlet standaard ingesteld op abonnementen in de standaardcontext.
Resource Graph Explorer biedt ook een schone interface voor het converteren van de resultaten van sommige query's naar een grafiek die kan worden vastgemaakt aan een Azure-dashboard.
Wijzigingen in queryresources
Met Resource Graph kunt u query's uitvoeren op de resourcechanges
, resourcecontainerchanges
of healthresourcechanges
tabellen om te filteren of te sorteren op een van de eigenschappen van de wijzigingsresource. In de volgende voorbeelden wordt een query uitgevoerd op de resourcechanges
tabel, maar kan ook worden toegepast op de resourcecontainerchanges
tabel of healthresourcechanges
tabel.
Notitie
Meer informatie over de healthresourcechanges
gegevens in de Project Flash-documentatie.
Voorbeelden
Bekijk de volgende aanbevolen procedures voordat u query's uitvoert op wijzigingen in uw resources en deze analyseert.
- Voer een query uit voor wijzigingsevenementen tijdens een specifiek tijdvenster en evalueer de wijzigingsgegevens.
- Deze query werkt het beste tijdens incidentbeheer om inzicht te krijgen in mogelijk gerelateerde wijzigingen.
- Houd een up-to-date CONFIGURATION Management Database (CMDB) bij.
- In plaats van alle resources en hun volledige eigenschappensets op een geplande frequentie te vernieuwen, ontvangt u alleen hun wijzigingen.
- Begrijpen welke andere eigenschappen zijn gewijzigd wanneer een resource de nalevingsstatus wijzigt.
- Evaluatie van deze extra eigenschappen kan inzicht bieden in andere eigenschappen die mogelijk moeten worden beheerd via een Azure Policy-definitie.
- De volgorde van queryopdrachten is belangrijk. In de volgende voorbeelden moet de
order by
opdracht vóór delimit
opdracht komen.- Met
order by
de opdracht worden de queryresultaten gesorteerd op basis van de wijzigingstijd. - De
limit
opdracht beperkt vervolgens de geordende resultaten om ervoor te zorgen dat u de vijf meest recente resultaten krijgt.
- Met
- Wat betekent Onbekend?
- Onbekend wordt weergegeven wanneer de wijziging is uitgevoerd op een client die niet wordt herkend. Clients worden herkend op basis van de gebruikersagent en clienttoepassings-id die is gekoppeld aan de oorspronkelijke wijzigingsaanvraag.
- Wat betekent Het systeem?
- Het systeem wordt weergegeven als een
changedBy
waarde wanneer er een achtergrondwijziging is opgetreden die niet is gecorreleerd met een directe gebruikersactie.
- Het systeem wordt weergegeven als een
Alle wijzigingen in de afgelopen periode van 24 uur
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
Resources die zijn verwijderd in een specifieke resourcegroep
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
Wijzigingen in een specifieke eigenschapswaarde
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
Wijzigingen in de afgelopen zeven dagen door wie en welke klant en welke besteld op aantal
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
Wijzigingen in de grootte van de virtuele machine
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
Aantal wijzigingen per wijzigingstype en abonnementsnaam
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
Meest recente resourcewijzigingen voor resources die zijn gemaakt met een bepaalde tag
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