Compartir vía


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.
  • El análisis de cambios usa funcionalidad Cambiar actor:
    • changedBy: Quién inició un cambio en el recurso, como un identificador de aplicación o una dirección de correo electrónico de la persona autorizada.
    • clientType: Qué cliente realizó el cambio, como Azure Portal.
    • operation: Qué operación a la que se llamó, como Microsoft.Compute/virtualmachines/write.

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 de cambio nuevo (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/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",
    }
  }
}

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 a order by 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 en una frecuencia programada, solo recibirá sus cambios.
  • Comprenda qué otras propiedades se cambiaron cuando un recurso cambia estado de cumplimiento.
    • La evaluación de estas propiedades adicionales puede proporcionar información detallada sobre otras propiedades que podrían necesitar 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.
  • ¿Qué significa Desconocido ? 
    • Se muestra desconocido cuando se produjo el cambio en un cliente que no se reconoce. Los clientes se reconocen en función del agente de usuario y el identificador de aplicación cliente asociados a la solicitud de cambio original.
  • ¿Qué significa System?
    • El sistema se muestra como un valor de changedBy cuando se produjo un cambio en segundo plano que no estaba correlacionado con ninguna acción directa del usuario.

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 en los últimos siete días por quién y qué cliente y ordenados por recuento

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 

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