Получение данных об изменении ресурса
Ресурсы изменяются с помощью ежедневного использования, перенастройки и даже повторного развертывания. Большая часть изменений вносится специально, но иногда это не так. Вы можете:
- просмотр времени обнаружения изменений для свойства Azure Resource Manager;
- Просмотр сведений об изменении свойства.
- Запрос изменений в масштабах подписки, группы управления или клиента.
В этой статье рассматриваются следующие вопросы:
- Как выглядит полезные данные JSON.
- Как запрашивать изменения ресурсов с помощью Resource Graph с помощью интерфейса командной строки, PowerShell или портал Azure.
- Примеры запросов и рекомендации по запросу изменений ресурсов.
- Анализ изменений использует функции субъекта изменений:
changedBy
: кто инициировал изменение ресурса, например идентификатор приложения или адрес электронной почты авторизованного лица.clientType
: какой клиент сделал изменение, например портал Azure.operation
: какая операция была вызвана, напримерMicrosoft.Compute/virtualmachines/write
.
Необходимые компоненты
- Чтобы включить Azure PowerShell для запроса Azure Resource Graph, добавьте модуль.
- Чтобы включить Azure CLI для запроса Azure Resource Graph, добавьте расширение.
Общие сведения о свойствах события изменения
При создании, обновлении или удалении ресурса создается новый ресурс изменения (Microsoft.Resources/changes
) для расширения измененного ресурса и представления измененных свойств. Записи изменений должны быть доступны менее чем за пять минут. В следующем примере полезных данных JSON демонстрируется изменение свойств ресурса:
{
"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",
}
}
}
Полный справочник по свойствам ресурсов см. в полном справочнике.
Выполнение запроса
Попробуйте выполнить запрос Графа ресурсов на основе клиента для 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 можно запрашивать resourcechanges
resourcecontainerchanges
таблицы или healthresourcechanges
таблицы для фильтрации или сортировки по любому из свойств ресурса изменения. Следующие примеры запрашивают таблицу resourcechanges
, но также могут применяться к resourcecontainerchanges
таблице или healthresourcechanges
таблице.
Примечание.
Дополнительные сведения о healthresourcechanges
данных в документации Project Flash.
Примеры
Прежде чем запрашивать и анализировать изменения в ресурсах, ознакомьтесь со следующими рекомендациями.
- Получение событий изменения за определенный период времени и оценка информации об этих изменениях.
- Этот запрос лучше всего работает во время управления инцидентами, чтобы понять потенциально связанные изменения.
- Обновляйте базу данных управления конфигурацией (CMDB).
- Вместо обновления всех ресурсов и их полных наборов свойств по запланированной частоте вы получаете только изменения.
- Узнайте, какие другие свойства были изменены при изменении состояния соответствия ресурсов.
- Оценка этих дополнительных свойств может предоставить аналитические сведения о других свойствах, которым может потребоваться управлять с помощью определения Политика Azure.
- Порядок команд запроса важен. В следующих примерах
order by
необходимо прийти перед командойlimit
.- Команда
order by
упорядочивает результаты запроса по времени изменения. - Затем
limit
команда ограничивает упорядоченные результаты, чтобы убедиться, что вы получите пять последних результатов.
- Команда
- Что значит Неизвестно ?
- Неизвестно, когда изменение произошло на клиенте, который не был распознан. Клиенты распознаются на основе идентификатора пользовательского агента и клиентского приложения, связанного с исходным запросом на изменение.
- Что означает система ?
- Система отображается как
changedBy
значение, когда произошло фоновое изменение, которое не было сопоставлено с каким-либо прямым действием пользователя.
- Система отображается как
Все изменения за последние 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 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
Изменения размера виртуальной машины
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