Ottenere le modifiche delle risorse

Le risorse vengono modificate nel corso dell'utilizzo giornaliero, della riconfigurazione e persino della ridistribuzione. Le modifiche possono essere apportate da un singolo utente o da un processo automatizzato. La maggior parte delle modifiche è prevista da progettazione, ma non tutte. Con gli ultimi quattordici giorni di modifiche, le modifiche alla configurazione delle risorse consentono di:

  • Capire quando sono state rilevate modifiche in una proprietà Azure Resource Manager
  • Per ogni modifica di risorsa, visualizzare i dettagli delle modifiche delle proprietà
  • Eseguire query sulle modifiche su larga scala tra le sottoscrizioni, il gruppo di gestione o il tenant

Il rilevamento delle modifiche e i dettagli sono utili per gli scenari di esempio seguenti:

  • Durante la gestione degli eventi imprevisti per comprendere le modifiche potenzialmente correlate. Eseguire una query per gli eventi di modifica durante un intervallo di tempo specifico e valutare i dettagli della modifica.
  • Mantenere aggiornato un database di gestione della configurazione, noto come CMDB. Anziché aggiornare tutte le risorse e i relativi set di proprietà completi in base a una frequenza pianificata, ottenere solo le modifiche.
  • Capire quali altre proprietà potrebbero essere state modificate quando una risorsa ha cambiato lo stato di conformità. La valutazione di queste proprietà aggiuntive può fornire informazioni dettagliate su altre proprietà che potrebbero essere necessarie per essere gestite tramite una definizione di Criteri di Azure.

Questo articolo illustra come eseguire query su modifiche alla configurazione delle risorse tramite Resource Graph. Per visualizzare queste informazioni nella portale di Azure, vedere Azure Resource Graph Explorer, cronologia delle modifiche di Criteri di Azure o cronologia delle modifiche del log attività di Azure. Per informazioni dettagliate sulle modifiche apportate alle applicazioni dal livello infrastruttura fino alla distribuzione delle applicazioni, vedere Usare Analisi delle modifiche alle applicazioni (anteprima) in Monitoraggio di Azure.

Nota

Le modifiche alla configurazione delle risorse sono relative alle proprietà di Azure Resource Manager. Per tenere traccia delle modifiche all'interno di una macchina virtuale, vedere il rilevamento modifiche di Automazione di Azure o la configurazione guest per le macchine virtuali di Criteri di Azure. Per visualizzare esempi di come eseguire query sulle risorse di Configurazione guest in Resource Graph, visualizzare le query di Azure Resource Graph per categoria- Criteri di Azure Configurazione guest.

Importante

Le modifiche alla configurazione delle risorse supportano solo le modifiche apportate ai tipi di risorsa dalla tabella Resources in Resource Graph. Ciò non include ancora le modifiche apportate alle risorse del contenitore di risorse, ad esempio sottoscrizioni e gruppi di risorse. Le modifiche sono queryabili per quattordici giorni. Per una conservazione più lunga, è possibile integrare la query Resource Graph con App per la logica di Azure ed esportare i risultati delle query in uno qualsiasi degli archivi dati di Azure ,ad esempio Log Analytics, per la conservazione desiderata.

Trovare gli eventi di modifica rilevati e visualizzare i dettagli delle modifiche

Quando una risorsa viene creata, aggiornata o eliminata, viene creata una nuova risorsa di modifica (Microsoft.Resources/changes) per estendere la risorsa modificata e rappresentare le proprietà modificate. I record delle modifiche devono essere disponibili in meno di cinque minuti.

Esempio di modifica del contenitore delle proprietà della risorsa:

{
  "targetResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "changesCount": 2,
    "correlationId": "88420d5d-8d0e-471f-9115-10d34750c617",
    "timestamp": "2021-12-07T09:25:41.756Z",
    "previousResourceSnapshotId": "ed90e35a-1661-42cc-a44c-e27f508005be",
    "newResourceSnapshotId": "6eac9d0f-63b4-4e7f-97a5-740c73757efb"
  },
  "changes": {
    "properties.provisioningState": {
      "newValue": "Succeeded",
      "previousValue": "Updating",
      "changeCategory": "System",
      "propertyChangeType": "Update"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
      "changeCategory": "User",
      "propertyChangeType": "Insert"
    }
  }
}

Ogni risorsa di modifica ha le proprietà seguenti:

  • targetResourceId : id risorsa della risorsa in cui si è verificata la modifica.

  • targetResourceType : tipo di risorsa della risorsa in cui si è verificata la modifica.

  • changeType : descrive il tipo di modifica rilevata per l'intero record di modifica. I valori possibili sono: Create, Update e Delete. Il dizionario delle proprietà changes viene incluso solo quando changeType è Update. Per il caso Di eliminazione , la risorsa di modifica verrà comunque mantenuta come estensione della risorsa eliminata per quattordici giorni, anche se l'intero gruppo di risorse è stato eliminato. La risorsa di modifica non blocca le eliminazioni o influisce sul comportamento di eliminazione esistente.

  • changes - Dizionario delle proprietà della risorsa (con il nome della proprietà come chiave) che sono state aggiornate come parte della modifica:

    • propertyChangeType : descrive il tipo di modifica rilevata per la singola proprietà della risorsa. I valori possibili sono: Insert, Update, Remove.
    • previousValue : valore della proprietà della risorsa nello snapshot precedente. Il valore è Null quando changeType è Insert.
    • newValue : valore della proprietà della risorsa nel nuovo snapshot. Il valore è Null quando changeType è Remove.
    • changeCategory : descrive se la modifica della proprietà è il risultato di una modifica del valore (Utente) o di una differenza nelle versioni API a cui si fa riferimento (Sistema). I valori possibili sono: System e User.
  • changeAttributes - Matrice di metadati correlati alla modifica:

    • changesCount : numero di proprietà modificate come parte di questo record di modifiche.
    • correlationId : contiene l'ID per il rilevamento degli eventi correlati. Ogni distribuzione ha un ID di correlazione e tutte le azioni in un singolo modello condividono lo stesso ID di correlazione.
    • timestamp : datetime di quando è stata rilevata la modifica.
    • previousResourceSnapshotId : contiene l'ID dello snapshot della risorsa usato come stato precedente della risorsa.
    • newResourceSnapshotId : contiene l'ID dello snapshot della risorsa usato come nuovo stato della risorsa.

Come eseguire query su modifiche usando Resource Graph

Prerequisiti

Eseguire la query Resource Graph

È il momento di provare una query Resource Graph basata su tenant della tabella resourcechanges. La query restituisce le prime cinque modifiche apportate alle risorse di Azure più recenti con l'ora di modifica, il tipo di modifica, l'ID risorsa di destinazione, il tipo di risorsa di destinazione e i dettagli di ogni record di modifica. Per eseguire query in base al gruppo di gestione o alla sottoscrizione, usare i -ManagementGroup parametri o -Subscription .

  1. Eseguire la prima query di Azure Resource Graph:
# 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'

Nota

Poiché questo esempio di query non prevede un modificatore del tipo di ordinamento, ad esempio order by, se si esegue questa query più volte, è probabile che venga restituito un set di risorse diverso per ogni richiesta.

  1. Aggiornare la query per specificare un nome di colonna più descrittivo per la proprietà timestamp :
# Run Azure Resource Graph query with 'extend' to define a user-friendly name for properties.changeAttributes.timestamp 
az graph query -q 'resourcechanges | extend changeTime=todatetime(properties.changeAttributes.timestamp) | project changeTime, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | limit 5'
  1. Per ottenere le modifiche più recenti, aggiornare la query alla order by 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'

Nota

L'ordine dei comandi della query è importante. In questo esempio, deve order by precedere il limit comando . Questo ordine di comando ordina prima i risultati della query in base al tempo di modifica e quindi li limita per assicurarsi di ottenere i cinque risultati più recenti .

Quando la query finale viene eseguita più volte, supponendo che nessun elemento nell'ambiente cambi, i risultati restituiti sono coerenti e ordinati in base alla proprietà properties.changeAttributes.timestamp (o al nome definito dall'utente di changeTime), ma sono ancora limitati ai primi cinque risultati.

Nota

Se la query non restituisce risultati da una sottoscrizione a cui si ha già accesso, si noti che il Search-AzGraph cmdlet di PowerShell viene predefinito per le sottoscrizioni nel contesto predefinito. Per visualizzare l'elenco di ID di sottoscrizione che fanno parte del contesto predefinito, eseguire (Get-AzContext).Account.ExtendedProperties.Subscriptions. Per eseguire la ricerca in tutte le sottoscrizioni a cui si ha accesso, è possibile impostare PSDefaultParameterValues per il cmdlet Search-AzGraph eseguendo $PSDefaultParameterValues=@{"Search-AzGraph:Subscription"= $(Get-AzSubscription).ID}

Resource Graph Explorer fornisce anche un'interfaccia pulita per convertire i risultati di alcune query in un grafico che può essere aggiunto a un dashboard di Azure.

esempi di query Resource Graph

Con Resource Graph è possibile eseguire una query sulla tabella resourcechanges per filtrare o ordinare in base a una delle proprietà delle risorse di modifica:

Tutte le modifiche apportate nell'ultimo giorno

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

Eseguire una query sulla configurazione più recente delle risorse create negli ultimi sette giorni

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

Modifiche apportate 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 

Conteggio delle 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  

Eseguire una query sulla configurazione più recente della risorsa 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"  
| project  targetResourceId, changeType, createTime  
| join ( resources | extend targetResourceId=id) on targetResourceId  
| where tags[“Environment”] =~ “prod”  
| order by createTime desc  
| project createTime, id, resourceGroup, type 

Passaggi successivi