Получение данных об изменении ресурса

Ресурсы изменяются с помощью ежедневного использования, перенастройки и даже повторного развертывания. Большая часть изменений вносится специально, но иногда это не так. Вы можете:

  • просмотр времени обнаружения изменений для свойства Azure Resource Manager;
  • Просмотр сведений об изменении свойства.
  • Запрос изменений в масштабах подписки, группы управления или клиента.

В этой статье рассматриваются следующие вопросы:

  • Как выглядит полезные данные JSON.
  • Как запрашивать изменения ресурсов с помощью Resource Graph с помощью интерфейса командной строки, PowerShell или портал Azure.
  • Примеры запросов и рекомендации по запросу изменений ресурсов.

Необходимые компоненты

Общие сведения о свойствах события изменения

При создании, обновлении или удалении ресурса создается новый ресурс изменений (Microsoft.Resources/Changes), который расширяет измененный ресурс и представляет измененные свойства. Записи изменений должны быть доступны менее чем за пять минут. В следующем примере полезных данных JSON демонстрируется изменение свойств ресурса:

{
  "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"
    }
  }
}

Полный справочник по свойствам ресурсов см. в полном справочнике.

Выполнение запроса

Попробуйте выполнить запрос Графа ресурсов на основе клиента для resourcechanges таблицы. Запрос возвращает первые пять новейших изменений ресурсов Azure с указанием времени изменения, типа изменения, идентификатора целевого ресурса, типа целевого ресурса и сведений о каждой записи изменений.

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

Этот запрос можно обновить, чтобы указать более понятное имя столбца для свойства метки времени.

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

Чтобы ограничить результаты запроса последними изменениями, обновите запрос до order by определяемого пользователем свойства changeTime .

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

Вы также можете запросить группу управления или подписку с -Subscription-ManagementGroup помощью параметров или параметров соответственно.

Примечание.

Если запрос не возвращает результаты из подписки, к которой у вас уже есть доступ, Search-AzGraph командлет PowerShell по умолчанию использует подписки в контексте по умолчанию.

Resource Graph Explorer также содержит понятный интерфейс для преобразования результатов некоторых запросов в диаграмму, которую можно закрепить на панели мониторинга Azure.

Изменение ресурса запроса

С помощью Resource Graph можно запрашивать resourcechangesresourcecontainerchangesтаблицы или healthresourcechanges таблицы для фильтрации или сортировки по любому из свойств ресурса изменения. Следующие примеры запрашивают таблицу resourcechanges , но также могут применяться к resourcecontainerchanges таблице или healthresourcechanges таблице.

Примечание.

Дополнительные сведения о healthresourcechanges данных в документации Project Flash.

Примеры

Прежде чем запрашивать и анализировать изменения в ресурсах, ознакомьтесь со следующими рекомендациями.

  • Получение событий изменения за определенный период времени и оценка информации об этих изменениях.
    • Этот запрос лучше всего работает во время управления инцидентами, чтобы понять потенциально связанные изменения.
  • Обновляйте базу данных управления конфигурацией (CMDB).
    • Вместо обновления всех ресурсов и их полных наборов свойств по запланированной частоте вы получите только изменения.
  • Узнайте, какие другие свойства могут быть изменены при изменении состояния соответствия ресурса.
    • Изучение этих дополнительных свойств может помочь лучше понять другие свойства, которыми может быть необходимо управлять через определение Политики Azure.
  • Порядок команд запроса важен. В следующих примерах order by необходимо прийти перед командой limit .
    • Команда order by упорядочивает результаты запроса по времени изменения.
    • Затем limit команда ограничивает упорядоченные результаты, чтобы убедиться, что вы получите пять последних результатов.

Все изменения за последние 24-часовый период

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

Ресурсы, удаленные в определенной группе ресурсов

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

Изменения конкретного значения свойства

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

Последние изменения ресурсов для ресурсов, созданных за последние семь дней

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

Изменения размера виртуальной машины

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

Количество изменений по типу изменения и имени подписки

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  

Последние изменения ресурсов для ресурсов, созданных с определенным тегом

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

Следующие шаги