Condividi tramite


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 esempio Microsoft.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 comando limit.
    • 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.
  • 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.

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

Passaggi successivi