Obter alterações do recurso

Os recursos mudam ao longo do uso diário, reconfiguração e até mesmo reimplantação. A maioria das mudanças é por design, mas às vezes não é. Pode:

  • Descubra quando as alterações foram detetadas numa propriedade do Azure Resource Manager.
  • Veja os detalhes da alteração da propriedade.
  • Consulte alterações em escala em suas assinaturas, grupo de gerenciamento ou locatário.

Neste artigo, vai aprender a:

  • Qual é a aparência do JSON de carga útil.
  • Como consultar alterações de recursos por meio do Gráfico de Recursos usando a CLI, o PowerShell ou o portal do Azure.
  • Exemplos de consulta e práticas recomendadas para consultar alterações de recursos.

Pré-requisitos

Compreender as propriedades do evento de alteração

Quando um recurso é criado, atualizado ou excluído, um novo recurso de alteração (Microsoft.Resources/changes) é criado para estender o recurso modificado e representar as propriedades alteradas. Os registros de alteração devem estar disponíveis em menos de cinco minutos. O exemplo de carga JSON a seguir demonstra as propriedades do recurso de alteração:

{
  "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 o guia de referência completo para alterar as propriedades do recurso.

Executar uma consulta

Experimente uma consulta do Gráfico de Recursos baseada em locatário da resourcechanges tabela. A consulta retorna as cinco primeiras alterações de recurso mais recentes do Azure com a hora de alteração, o tipo de alteração, a ID do recurso de destino, o tipo de recurso de destino e os detalhes da alteração de cada registro de alteração.

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

Você pode atualizar essa consulta para especificar um nome de coluna mais amigável para a propriedade 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 os resultados da consulta às alterações mais recentes, atualize a consulta para order by a propriedade changeTime definida pelo usuário.

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

Você também pode consultar por grupo de gerenciamento ou assinatura com os -ManagementGroup parâmetros ou -Subscription , respectivamente.

Nota

Se a consulta não retornar resultados de uma assinatura à qual você já tem acesso, o Search-AzGraph cmdlet do PowerShell assumirá como padrão assinaturas no contexto padrão.

O Resource Graph Explorer também fornece uma interface limpa para converter os resultados de algumas consultas em um gráfico que pode ser fixado em um painel do Azure.

Consultar alterações de recursos

Com o Gráfico de Recursos, você pode consultar as resourcechangestabelas , resourcecontainerchangesou healthresourcechanges para filtrar ou classificar por qualquer uma das propriedades do recurso de alteração. Os exemplos a seguir consultam a resourcechanges tabela, mas também podem ser aplicados à resourcecontainerchanges tabela ou healthresourcechanges .

Nota

Saiba mais sobre os healthresourcechanges dados na documentação do Project Flash.

Exemplos

Antes de consultar e analisar as alterações em seus recursos, revise as seguintes práticas recomendadas.

  • Consulte eventos de alteração durante uma janela de tempo específica e avalie os detalhes da alteração.
    • Essa consulta funciona melhor durante o gerenciamento de incidentes para entender as alterações potencialmente relacionadas.
  • Mantenha um banco de dados de gerenciamento de configuração (CMDB) atualizado.
    • Em vez de atualizar todos os recursos e seus conjuntos de propriedades completos em uma frequência agendada, você receberá apenas as alterações.
  • Entenda quais outras propriedades podem ter sido alteradas quando um recurso muda de "estado de conformidade".
    • A avaliação dessas propriedades extras pode fornecer informações sobre outras propriedades que podem precisar ser gerenciadas por meio de uma definição de Política do Azure.
  • A ordem dos comandos de consulta é importante. Nos exemplos a seguir, o order by deve vir antes do limit comando.
    • O order by comando ordena os resultados da consulta pelo tempo de alteração.
    • Em limit seguida, o comando limita os resultados ordenados para garantir que você obtenha os cinco resultados mais recentes.

Todas as alterações no ú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 excluídos em um 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

Alterações em um valor de propriedade 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

Últimas alterações de recursos para recursos criados nos últimos sete dias

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

Alterações no tamanho da 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

Contagem de alterações por tipo de alteração e nome da subscrição

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  

Últimas alterações de recursos para recursos criados com uma determinada 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

Próximos passos