Obtención de los cambios del recurso

Los recursos se modifican a través del uso diario, la reconfiguración e incluso la reimplementación. La mayoría de los cambios son así por diseño, pero a veces no lo son. Puede:

  • Buscar cuándo se detectaron cambios en una propiedad de Azure Resource Manager.
  • Ver los detalles del cambio de propiedad.
  • Consultar los cambios a gran escala en las suscripciones, grupos de administración o inquilinos.

En este artículo, aprenderá lo siguiente:

  • Aspecto del código JSON de la carga útil.
  • Consulta de los cambios en los recursos mediante Resource Graph con la CLI, PowerShell o Azure Portal.
  • Ejemplos de consultas y procedimientos recomendados para consultar los cambios en los recursos.

Requisitos previos

  • Para habilitar Azure PowerShell para consultar Azure Resource Graph, se debe agregar el módulo.
  • Para habilitar la CLI de Azure para consultar Azure Resource Graph, se debe agregar la extensión.

Descripción de las propiedades del evento de cambio

Cuando se crea, actualiza o elimina un recurso, se crea un nuevo recurso de cambio (Microsoft.Resources/changes) para ampliar el recurso modificado y representar las propiedades modificadas. Los registros de cambios deberían estar disponibles en menos de cinco minutos. En el ejemplo siguiente, la carga JSON muestra las propiedades de los recursos modificados:

{
  "targetResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "previousResourceSnapshotId": "08584889383111245807_37592049-3996-ece7-c583-3008aef9e0e1_4043682982_1712668574",
    "newResourceSnapshotId": "08584889377081305807_38788020-eeee-ffff-028f-6121bdac9cfe_4213468768_1712669177",
    "correlationId": "04ff69b3-e162-4583-9cd7-1a14a1ec2c61",
    "changedByType": "User",
    "changesCount": 2,
    "clientType": "ARM Template",
    "changedBy": "john@contoso.com",
    "operation": "microsoft.compute/virtualmachines/write",
    "timestamp": "2024-04-09T13:26:17.347+00:00"
  },
  "changes": {
    "properties.provisioningState": {
      "newValue": "Succeeded",
      "previousValue": "Updating",
      "changeCategory": "System",
      "propertyChangeType": "Update",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
      "changeCategory": "User",
      "propertyChangeType": "Insert"
    }
  }
}

Consulte la guía de referencia completa para las propiedades de los recursos modificados.

Ejecución de una consulta

Pruebe una consulta de Resource Graph basada en inquilinos de la tabla resourcechanges. La consulta devuelve los cinco cambios de recursos de Azure más recientes con la hora de cambio, el tipo de cambio, el identificador de recurso de destino, el tipo de recurso de destino y los detalles de cambio de cada registro de cambio.

# 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'

Puede actualizar esta consulta para especificar un nombre de columna más fácil de usar para la propiedad 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'

Para limitar los resultados de la consulta a los cambios más recientes, actualice la consulta para usar la cláusula order by en la propiedad changeTime definida por el usuario.

# 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'

También puede consultar por grupo de administración o suscripción con los parámetros -ManagementGroup o -Subscription respectivamente.

Nota:

Si la consulta no devuelve los resultados de una suscripción a la que ya tiene acceso, el valor predeterminado del cmdlet de PowerShell Search-AzGraph son las suscripciones en el contexto predeterminado.

Resource Graph Explorer también proporciona una interfaz limpia para convertir los de algunas consultas en un gráfico que se puede anclar a un panel de Azure.

Consulta de cambios en los recursos

Con Resource Graph, puede consultar las tablas resourcechanges, resourcecontainerchanges o healthresourcechanges para filtrar u ordenar por cualquiera de las propiedades del recurso modificado. En los ejemplos siguientes, se consulta la tabla resourcechanges, pero también se puede aplicar a las tablas resourcecontainerchanges y healthresourcechanges.

Nota:

Obtenga más información sobre los datos de healthresourcechanges en la documentación de Project Flash.

Ejemplos

Antes de consultar y analizar los cambios en los recursos, revise los procedimientos recomendados siguientes.

  • Consultar los eventos de cambio durante un período de tiempo específico y evaluar los detalles del cambio.
    • Esta consulta funciona mejor durante la administración de incidentes para comprender los cambios potencialmente relacionados.
  • Mantenga actualizada una base de datos de administración de configuración (CMDB).
    • En lugar de actualizar todos los recursos y sus conjuntos de propiedades completos con una frecuencia programada, solo recibirá los cambios.
  • Comprenda qué otras propiedades se pueden haber cambiado cuando un recurso cambia el "estado de cumplimiento".
    • La evaluación de estas propiedades adicionales puede proporcionar información sobre otras propiedades que quizás tengan que administrarse a través de una definición de Azure Policy.
  • El orden de los comandos de consulta es importante. En los ejemplos siguientes, la cláusula order by debe aparecer antes del comando limit.
    • El comando order by ordena los resultados de la consulta por la hora de cambio.
    • A continuación, el comando limit limita los resultados ordenados para asegurarse de que obtenga los cinco resultados más recientes.

Todos los cambios en el último período de 24 horas

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

Recursos eliminados en un grupo de recursos específico

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

Cambios en un valor de propiedad específico

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

Cambios de los recursos más recientes para los recursos creados en los últimos siete días

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

Cambios en el tamaño de la máquina virtual

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

Recuento de cambios por tipo de cambio y nombre de suscripción

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  

Cambios de los recursos más recientes para los recursos creados con una etiqueta determinada

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

Pasos siguientes