Запрос резервных копий с помощью Azure Resource Graph (ARG)

Вы можете запросить информацию о резервном копировании ресурсов Azure без дополнительных затрат, используя Azure Resource Graph (ARG). ARG — это служба Azure, предназначенная для расширения управления ресурсами Azure. Она нацелена на обеспечение эффективного исследования ресурсов с возможностью масштабирования запросов по заданному набору подписок. Основные преимущества использования ARG для запроса метаданных резервного копирования:

  • Возможность масштабируемого запроса ресурсов со сложной фильтрацией, группировкой и сортировкой по свойствам ресурсов.
  • Возможность получать информацию о резервных копиях в режиме реального времени, в том числе о выполняемых заданиях резервного копирования.
  • Возможность объединять данные, связанные с резервным копированием, с полезной информацией о связанных ресурсах Azure, таких как виртуальные машины Azure и учетные записи хранения.

Начало работы

Чтобы начать запрашивать резервные копии с помощью ARG, выполните следующие действия:

  1. Найдите Обозреватель Azure Resource Graph на портале Microsoft Azure. Выберите то же самое для перенаправления в редактор запросов ARG.

    Поиск в группе ресурсов Azure

    На левой панели отображаются все таблицы (и связанные с ними схемы), доступные для запроса.

    • Таблица RecoveryServicesResources содержит большую часть записей, связанных с резервным копированием, таких как сведения о задании, сведения об экземпляре резервного копирования и другие возможности.
    • Таблица Resources содержит информацию обо всех ресурсах Azure верхнего уровня, таких как хранилища Служб восстановления, виртуальные машины Azure, учетные записи хранения и т. д.

    Доступные таблицы и связанные схемы для запроса

  2. Чтобы изучить данные в любой из этих таблиц, напишите запросы Kusto в редакторе запросов и нажмите Выполнить запрос.

    Вы можете загрузить выходные данные этих запросов в формате CSV из обозревателя Resource Graph. Вы также можете использовать эти запросы в настраиваемой автоматизации с помощью любых клиентов автоматизации, поддерживаемых ARG, таких как PowerShell, CLI или SDK. Вы также можете создавать пользовательские книги на портале Microsoft Azure, используя ARG в качестве источника данных.

Примечание

  • Задачи по резервному копированию и восстановлению, созданные за последние 14 дней назад, доступны в ARG для запроса. Если вы хотите запросить исторические записи, рекомендуем использовать журналы Azure Monitor.
  • Служба ARG позволяет запрашивать ресурсы, для которых у вас есть соответствующие права RBAC.

Примеры запросов

Ниже приведены несколько примеров запросов ARG к данным резервного копирования, которые можно использовать в настраиваемых панелях мониторинга и для автоматизации.

Список всех виртуальных машин Azure, настроенных для резервного копирования

RecoveryServicesResources 
| where type in~ ('Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems')
| extend vaultName = case(type =~ 'microsoft.dataprotection/backupVaults/backupInstances',split(split(id, '/Microsoft.DataProtection/backupVaults/')[1],'/')[0],type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems',split(split(id, '/Microsoft.RecoveryServices/vaults/')[1],'/')[0],'--')
| extend dataSourceType = case(type=~'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems',properties.backupManagementType,type =~ 'microsoft.dataprotection/backupVaults/backupInstances',properties.dataSourceSetInfo.datasourceType,'--')
| extend friendlyName = properties.friendlyName
| extend dsResourceGroup = split(split(properties.dataSourceInfo.resourceID, '/resourceGroups/')[1],'/')[0]
| extend dsSubscription = split(split(properties.dataSourceInfo.resourceID, '/subscriptions/')[1],'/')[0]
| extend lastRestorePoint = properties.lastRecoveryPoint
| extend primaryLocation = properties.dataSourceInfo.resourceLocation
| extend policyName = case(type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems',properties.policyName, type =~ 'microsoft.dataprotection/backupVaults/backupInstances', properties.policyInfo.name, '--')
| extend protectionState = properties.currentProtectionState
| where protectionState in~ ('ConfiguringProtection','ProtectionConfigured','ConfiguringProtectionFailed','ProtectionStopped','SoftDeleted','ProtectionError')

Список всех заданий резервного копирования на серверах баз данных Azure для PostgreSQL за последнюю неделю

RecoveryServicesResources 
| where type in~ ('Microsoft.DataProtection/backupVaults/backupJobs')
| extend vaultName = case(type =~ 'microsoft.dataprotection/backupVaults/backupJobs',properties.vaultName,type =~ 'Microsoft.RecoveryServices/vaults/backupJobs',split(split(id, '/Microsoft.RecoveryServices/vaults/')[1],'/')[0],'--')
| extend friendlyName = case(type =~ 'microsoft.dataprotection/backupVaults/backupJobs',strcat(properties.dataSourceSetName , '/', properties.dataSourceName),type =~ 'Microsoft.RecoveryServices/vaults/backupJobs', properties.entityFriendlyName, '--')
| extend dataSourceType = case(type =~ 'Microsoft.RecoveryServices/vaults/backupJobs',properties.backupManagementType,type =~ 'microsoft.dataprotection/backupVaults/backupJobs',properties.dataSourceType,'--')
| extend backupInstanceName = properties.backupInstanceId
| extend dsResourceGroup = split(split(properties.dataSourceId, '/resourceGroups/')[1],'/')[0]| extend dsSubscription = split(split(properties.dataSourceId, '/subscriptions/')[1],'/')[0]
| extend status = properties.status
| extend dataSourceId = properties.dataSourceId
| extend primaryLocation = properties.dataSourceLocation
| extend jobStatus = case (properties.status == 'Completed' or properties.status == 'CompletedWithWarnings','Succeeded',properties.status == 'Failed','Failed',properties.status == 'InProgress', 'Started', properties.status), operation = case(type =~ 'microsoft.dataprotection/backupVaults/backupJobs' and tolower(properties.operationCategory) =~ 'backup' and properties.isUserTriggered == 'true',strcat('adhoc',properties.operationCategory),type =~ 'microsoft.dataprotection/backupVaults/backupJobs', tolower(properties.operationCategory), type =~ 'Microsoft.RecoveryServices/vaults/backupJobs' and tolower(properties.operation) =~ 'backup' and properties.isUserTriggered == 'true',strcat('adhoc',properties.operation),type =~ 'Microsoft.RecoveryServices/vaults/backupJobs',tolower(properties.operation), '--'),startTime = todatetime(properties.startTime),endTime = properties.endTime, duration = properties.duration
| project id, name, friendlyName, resourceGroup, vaultName, dataSourceType, operation, jobStatus, startTime, duration, backupInstanceName, dsResourceGroup, dsSubscription, status, primaryLocation, dataSourceId
| where (startTime >= ago(7d))

Список всех виртуальных машин Azure, которые не были настроены для резервного копирования

Resources
| where type in~ ('microsoft.compute/virtualmachines','microsoft.classiccompute/virtualmachines') 
| extend resourceId=tolower(id) 
| join kind = leftouter ( RecoveryServicesResources
| where type == "microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems"
| where properties.backupManagementType == "AzureIaasVM"
| project resourceId = tolower(tostring(properties.sourceResourceId)), backupItemid = id, isBackedUp = isnotempty(id) ) on resourceId 
| extend isProtected = isnotempty(backupItemid)
| where (isProtected == (0))
| project id,name,resourceGroup,location,tags

Отображение всех политик резервного копирования, используемых для виртуальных машин Azure

RecoveryServicesResources
| where type == 'microsoft.recoveryservices/vaults/backuppolicies'
| extend vaultName = case(type == 'microsoft.recoveryservices/vaults/backuppolicies', split(split(id, 'microsoft.recoveryservices/vaults/')[1],'/')[0],type == 'microsoft.recoveryservices/vaults/backuppolicies', split(split(id, 'microsoft.recoveryservices/vaults/')[1],'/')[0],'--')
| extend datasourceType = case(type == 'microsoft.recoveryservices/vaults/backuppolicies', properties.backupManagementType,type == 'microsoft.dataprotection/backupVaults/backupPolicies',properties.datasourceTypes[0],'--')
| project id,name,vaultName,resourceGroup,properties,datasourceType
| where datasourceType == 'AzureIaasVM'

Список всех виртуальных машин, связанных с заданной политикой резервного копирования

RecoveryServicesResources
| where type == "microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems"
| project propertiesJSON = parse_json(properties)
| where propertiesJSON.backupManagementType == "AzureIaasVM"
| project VMID=propertiesJSON.sourceResourceId, PolicyID=propertiesJSON.policyId
| where PolicyID == "<ARM ID of the given policy>"

Список всех политик резервного копирования, используемых для серверов баз данных Azure для PostgreSQL

RecoveryServicesResources 
| where type in~ ('Microsoft.DataProtection/BackupVaults/backupPolicies')
| extend vaultName = case(type =~ 'microsoft.dataprotection/backupVaults/backupPolicies', split(split(id, '/Microsoft.DataProtection/backupVaults/')[1],'/')[0],type =~ 'microsoft.recoveryservices/vaults/backupPolicies', split(split(id, '/Microsoft.RecoveryServices/vaults/')[1],'/')[0],'--')
| extend datasourceType = case(type =~ 'Microsoft.RecoveryServices/vaults/backupPolicies', properties.backupManagementType,type =~ 'microsoft.dataprotection/backupVaults/backupPolicies',properties.datasourceTypes[0],'--')
| project id,name,vaultName,resourceGroup,properties,datasourceType
| where (datasourceType in~ ('Microsoft.DBforPostgreSQL/servers/databases'))

Дальнейшие действия

Подробнее об Azure Resource Graph