Partilhar via


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 é. É possível:

  • Descubra quando as alterações foram detetadas em uma 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 da 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. O operation campo nos dados de alterações de recursos representa as permissões de controle de acesso baseadas em função do Azure usadas para iniciar a alteração.

Prerequisites

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. Alguns detalhes da alteração podem aparecer antes de outros. 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.

O operation campo nos dados de alterações de recursos representa as permissões de controle de acesso baseadas em função do Azure usadas para iniciar a alteração. Este campo nem sempre descreve a operação real executada, mas sim a permissão (ação de autorização) que foi usada. Por exemplo, Microsoft.Compute/virtualmachines/write corresponde à permissão para a operação PUT/providers/Microsoft.Compute/virtualmachines.

Para entender o tipo de alteração capturada no recurso (ou seja, Criar, Excluir, Atualizar), recomendamos que você use o changeType campo em vez do operation campo, que representa as permissões de controle de acesso baseadas em função do Azure usadas para iniciar a alteração.

Se o tipo de cliente for conhecido, o clientType campo mostrará o nome do cliente, como "Portal do Azure". Se o cliente for fornecido, mas não conhecido, o campo mostrará o ID do aplicativo cliente.

Note

Atualmente, não há suporte para snapshots para recursos excluídos. Para registros com changeType: Delete, o changesCount é mostrado como 0 porque o recurso em si é excluído e não há propriedades restantes. Para registros com changeType: Create, o também é mostrado como 0 porque cada propriedade de recurso é modificada durante a criação de recursos, e registrar changesCount cada alteração de propriedade causaria muito ruído.

Quando novas propriedades são introduzidas, elas não serão mostradas como alterações. Por exemplo, isso pode ocorrer quando uma nova versão da API introduz novas propriedades. Da mesma forma, se novas chaves forem adicionadas a tags sem valores, essas alterações não serão mostradas.

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.

Note

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 .

Note

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

Examples

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) up-toatualizado.
    • 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