Ottenere le modifiche delle risorse
Le risorse cambiano durante il corso dell’uso quotidiano, la riconfigurazione e persino la ridistribuzione. La maggior parte delle modifiche è prevista da progettazione, ma non tutte. È possibile:
- Scoprire quando sono state rilevate modifiche a una proprietà di Azure Resource Manager.
- Visualizzare i dettagli delle modifiche alle proprietà.
- Eseguire query sulle modifiche su larga scala tra sottoscrizioni, gruppi di gestione o tenant.
In questo articolo, imparerai a:
- Aspetto payload JSON.
- Come eseguire query sulle modifiche delle risorse tramite Resource Graph usando l'interfaccia della riga di comando, PowerShell o il portale di Azure.
- Esempi di query e procedure consigliate per l'esecuzione di query sulle modifiche delle risorse.
- L'analisi delle modifiche usa la funzionalità di Modifica dell'attore:
changedBy
: chi ha avviato una modifica nella risorsa, ad esempio un ID app o l'indirizzo di posta elettronica di una persona autorizzata.clientType
: quale client ha apportato la modifica, ad esempio Portale di Azure.operation
: quale operazione è stata chiamata, ad esempioMicrosoft.Compute/virtualmachines/write
.
Prerequisiti
- Per consentire ad Azure PowerShell di eseguire query su Azure Resource Graph, aggiungere il modulo.
- Per consentire all'interfaccia della riga di comando di Azure di eseguire query su Azure Resource Graph, aggiungere l'estensione.
Informazioni sulle proprietà degli eventi di modifica
Quando viene creata, aggiornata o eliminata una nuova risorsa di modifica (Microsoft.Resources/changes
) viene creata per estendere la risorsa modificata e rappresentare le proprietà modificate. I record delle modifiche devono essere disponibili in meno di cinque minuti. Il payload JSON di esempio seguente illustra le proprietà delle risorse di modifica:
{
"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",
}
}
}
Vedere la guida di riferimento completa per modificare le proprietà delle risorse.
Eseguire una query
Provare una query di Resource Graph basata su tenant della tabella resourcechanges
. La query restituisce le prime cinque modifiche più recenti delle risorse di Azure con l'ora di modifica, il tipo di modifica, l'ID risorsa di destinazione, il tipo di risorsa di destinazione e i dettagli delle modifiche di ogni record di modifica.
# 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'
È possibile aggiornare questa query per specificare un nome di colonna più semplice per la proprietà timestamp.
# 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'
Per limitare i risultati delle query alle modifiche più recenti, aggiornare la query in modo da order by
la proprietà changeTime
definita dall'utente.
# 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'
È anche possibile eseguire query dal gruppo di gestione o sottoscrizione con i parametri -ManagementGroup
o -Subscription
rispettivamente.
Nota
Se la query non restituisce risultati da una sottoscrizione a cui si ha già accesso, per impostazione predefinita il cmdlet di PowerShell Search-AzGraph
corrisponde alle sottoscrizioni nel contesto predefinito.
Resource Graph Explorer fornisce inoltre un'interfaccia pulita per la conversione dei risultati di alcune query in un grafico che può essere aggiunto a un dashboard di Azure.
Eseguire query delle modifiche alle risorse
Con Resource Graph è possibile eseguire una query sulle tabelle resourcechanges
, resourcecontainerchanges
o healthresourcechanges
per filtrare o ordinare in base a una delle proprietà delle risorse di modifica. Gli esempi seguenti eseguono una query sulla tabella resourcechanges
, ma possono essere applicati anche alla tabella resourcecontainerchanges
o healthresourcechanges
.
Nota
Altre informazioni sui dati di healthresourcechanges
in la documentazione di Project Flash.
Esempi
Prima di eseguire query e analizzare le modifiche nelle risorse, esaminare le procedure consigliate seguenti.
- Eseguire una query per gli eventi di modifica durante un intervallo di tempo specifico e valutare i dettagli della modifica.
- Questa query funziona meglio durante la gestione degli eventi imprevisti per comprendere le modifiche potenzialmente correlate.
- Mantenere un database di gestione della configurazione aggiornato (CMDB).
- Anziché aggiornare tutte le risorse e i relativi set di proprietà completi in base a una frequenza pianificata, si ricevono solo le modifiche.
- Comprendere quali altre proprietà sono state modificate quando una risorsa cambia stato di conformità.
- La valutazione di queste proprietà aggiuntive può fornire dati analitici su altre proprietà che potrebbero dover essere gestite tramite una definizione di Criteri di Azure.
- L'ordine dei comandi delle query è importante. Negli esempi seguenti, il
order by
deve venire prima del comandolimit
.- Il comando
order by
ordina i risultati della query in base all'ora di modifica. - Il comando
limit
limita quindi i risultati ordinati per assicurarsi di ottenere i cinque risultati più recenti.
- Il comando
- Cosa significa Sconosciuto?
- Sconosciuto viene visualizzato quando la modifica è avvenuta in un client non riconosciuto. I client vengono riconosciuti in base all'agente utente e all'ID dell’applicazione client associati alla richiesta di modifica originale.
- Cosa significa Sistema?
- Il sistema viene visualizzato come valore
changedBy
quando si è verificata una modifica dello sfondo non correlata a un'azione diretta dell'utente.
- Il sistema viene visualizzato come valore
Tutte le modifiche apportate all'ultimo periodo di 24 ore
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
Risorse eliminate in un gruppo di risorse specifico
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
Modifiche a un valore di proprietà specifico
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
Modifiche apportate negli ultimi sette giorni da chi e quali client e ordinati in base al conteggio
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
Modifiche alle dimensioni della macchina virtuale
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
Numero di modifiche in base al tipo di modifica e al nome della sottoscrizione
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
Modifiche più recenti delle risorse per le risorse create con un determinato 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