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.
  • A análise de alterações usa a funcionalidade Change Ator :
    • changedBy: quem iniciou uma alteração no seu recurso, como um ID de aplicativo ou o endereço de e-mail de uma pessoa autorizada.
    • clientType: Qual cliente fez a alteração, como o portal do Azure.
    • operation: Qual operação foi chamada, como Microsoft.Compute/virtualmachines/write.

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/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 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 definida changeTime 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ê recebe apenas as alterações.
  • Entenda quais outras propriedades foram alteradas quando um recurso altera o estado de conformidade.
    • A avaliação dessas propriedades extras pode fornecer informações sobre outras propriedades que talvez precisem 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.
  • O que significa Desconhecido ? 
    • Desconhecido é exibido quando a alteração aconteceu em um cliente que não é reconhecido. Os clientes são reconhecidos com base no agente do usuário e no ID do aplicativo cliente associados à solicitação de alteração original.
  • O que significa Sistema ?
    • O sistema é exibido como um changedBy valor quando ocorre uma alteração em segundo plano que não foi correlacionada com nenhuma ação direta do usuário.

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

Alterações nos últimos sete dias por quem e qual cliente e encomendado por contagem

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 

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