Exemplos de consulta do Advanced Resource Graph

O primeiro passo para compreender as consultas com Azure Resource Graph é obter uma compreensão básica da Linguagem de Consulta. Se ainda não estiver familiarizado com o Azure Data Explorer, recomenda-se que reveja os conceitos básicos para compreender como compor pedidos para os recursos que está a procurar.

Vamos examinar as seguintes consultas avançadas:

Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Suporte de idiomas

A CLI do Azure (por meio de uma extensão) e o Azure PowerShell (por meio de um módulo) suportam o Azure Resource Graph. Antes de executar qualquer uma das seguintes consultas, verifique se o ambiente está pronto. Veja CLI do Azure e Azure PowerShell para obter os passos para instalar e validar o seu ambiente shell escolhido.

Mostrar tipos de recursos e versões de API

O Gráfico de Recursos usa principalmente a versão não visualizada mais recente de uma API do Provedor de Recursos para GET propriedades de recursos durante uma atualização. Em alguns casos, a versão da API usada foi substituída para fornecer propriedades mais atuais ou amplamente utilizadas nos resultados. A consulta a seguir detalha a versão da API usada para coletar propriedades em cada tipo de recurso:

Resources
| distinct type, apiVersion
| where isnotnull(apiVersion)
| order by type asc
az graph query -q "Resources | distinct type, apiVersion | where isnotnull(apiVersion) | order by type asc"

Obter a capacidade e o tamanho do conjunto de dimensionamento de máquinas virtuais

Esta consulta procura recursos do conjunto de dimensionamento de máquinas virtuais e obtém vários detalhes, incluindo o tamanho da máquina virtual e a capacidade do conjunto de dimensionamento. A consulta utiliza a função toint() para converter a capacidade num número para poder ser ordenado. Por fim, o nome das colunas é mudado para propriedades de nome personalizadas.

Resources
| where type=~ 'microsoft.compute/virtualmachinescalesets'
| where name contains 'contoso'
| project subscriptionId, name, location, resourceGroup, Capacity = toint(sku.capacity), Tier = sku.name
| order by Capacity desc
az graph query -q "Resources | where type=~ 'microsoft.compute/virtualmachinescalesets' | where name contains 'contoso' | project subscriptionId, name, location, resourceGroup, Capacity = toint(sku.capacity), Tier = sku.name | order by Capacity desc"

Remover colunas dos resultados

A consulta a seguir usa summarize para contar recursos por assinatura, join para combiná-la com detalhes de assinatura da tabela ResourceContainers e, em seguida project-away , para remover algumas das colunas.

Resources
| summarize resourceCount=count() by subscriptionId
| join (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId
| project-away subscriptionId, subscriptionId1
az graph query -q "Resources | summarize resourceCount=count() by subscriptionId | join (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId| project-away subscriptionId, subscriptionId1"

Listar todos os nomes de etiquetas

Esta consulta começa com a etiqueta e cria um objeto JSON que lista todos os nomes de etiquetas exclusivos e os tipos correspondentes.

Resources
| project tags
| summarize buildschema(tags)
az graph query -q "Resources | project tags | summarize buildschema(tags)"

Máquinas virtuais correspondidas por regex

Esta consulta procura máquinas virtuais que correspondam a uma expressão regular (conhecida como regex). Os matches regex @ nos permite definir o regex para corresponder, que é ^Contoso(.*)[0-9]+$. Essa definição de regex é explicada como:

  • ^ – A correspondência tem de começar no início da cadeia de caracteres.
  • Contoso - a cadeia sensível às maiúsculas e minúsculas.
  • (.*) - Uma correspondência de subexpressão:
    • . – Corresponde a qualquer caracter único (exceto uma nova linha).
    • * – Corresponde ao elemento anterior zero ou mais vezes.
  • [0-9] – O grupo de caracteres corresponde aos números 0 a 9.
  • + – Corresponde ao elemento anterior uma ou mais vezes.
  • $ – A correspondência do elemento anterior deve ocorrer no final da cadeia de caracteres.

Depois da correspondência por nome, a consulta projeta o nome e ordena por nome em ordem crescente.

Resources
| where type =~ 'microsoft.compute/virtualmachines' and name matches regex @'^Contoso(.*)[0-9]+$'
| project name
| order by name asc
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' and name matches regex @'^Contoso(.*)[0-9]+\$' | project name | order by name asc"

Listar o Azure Cosmos DB com locais de gravação específicos

A consulta a seguir limita os recursos do Azure Cosmos DB, usa mv-expand para expandir o pacote de propriedades para properties.writeLocations, projeta campos específicos e limita os resultados ainda mais aos valores properties.writeLocations.locationName correspondentes a 'East US' ou 'West US'.

Resources
| where type =~ 'microsoft.documentdb/databaseaccounts'
| project id, name, writeLocations = (properties.writeLocations)
| mv-expand writeLocations
| project id, name, writeLocation = tostring(writeLocations.locationName)
| where writeLocation in ('East US', 'West US')
| summarize by id, name
az graph query -q "Resources | where type =~ 'microsoft.documentdb/databaseaccounts' | project id, name, writeLocations = (properties.writeLocations) | mv-expand writeLocations | project id, name, writeLocation = tostring(writeLocations.locationName) | where writeLocation in ('East US', 'West US') | summarize by id, name"

Cofres de chaves com nome de subscrição

A consulta a seguir mostra um uso complexo de join com tipo como leftouter. A consulta limita a tabela unida a recursos de assinaturas e inclui project apenas o campo original subscriptionId e o campo name renomeado para SubName. A renomeação de join campo evita adicioná-lo como nome1 , uma vez que o campo já existe em recursos. A tabela original é filtrada com where e o seguinte project inclui colunas de ambas as tabelas. O resultado da consulta são todos os cofres de chaves exibindo o tipo, o nome do cofre de chaves e o nome da assinatura em que ele está.

Resources
| join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId
| where type == 'microsoft.keyvault/vaults'
| project type, name, SubName
az graph query -q "Resources | join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId | where type == 'microsoft.keyvault/vaults' | project type, name, SubName"

Listar bancos de dados SQL e seus pools elásticos

A consulta a seguir usa leftouterjoin para reunir recursos do Banco de dados SQL e seus pools elásticos relacionados, se houver.

Resources
| where type =~ 'microsoft.sql/servers/databases'
| project databaseId = id, databaseName = name, elasticPoolId = tolower(tostring(properties.elasticPoolId))
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.sql/servers/elasticpools'
    | project elasticPoolId = tolower(id), elasticPoolName = name, elasticPoolState = properties.state)
on elasticPoolId
| project-away elasticPoolId1
az graph query -q "Resources | where type =~ 'microsoft.sql/servers/databases' | project databaseId = id, databaseName = name, elasticPoolId = tolower(tostring(properties.elasticPoolId)) | join kind=leftouter ( Resources | where type =~ 'microsoft.sql/servers/elasticpools' | project elasticPoolId = tolower(id), elasticPoolName = name, elasticPoolState = properties.state) on elasticPoolId | project-away elasticPoolId1"

Listar máquinas virtuais com sua interface de rede e IP público

Essa consulta usa dois comandos leftouterjoin para reunir máquinas virtuais criadas com o modelo de implantação do Resource Manager, suas interfaces de rede relacionadas e qualquer endereço IP público relacionado a essas interfaces de rede.

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend nics=array_length(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| where nics == 1 or nic.properties.primary =~ 'true' or isempty(nic)
| project vmId = id, vmName = name, vmSize=tostring(properties.hardwareProfile.vmSize), nicId = tostring(nic.id)
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/networkinterfaces'
    | extend ipConfigsCount=array_length(properties.ipConfigurations)
    | mv-expand ipconfig=properties.ipConfigurations
    | where ipConfigsCount == 1 or ipconfig.properties.primary =~ 'true'
    | project nicId = id, publicIpId = tostring(ipconfig.properties.publicIPAddress.id))
on nicId
| project-away nicId1
| summarize by vmId, vmName, vmSize, nicId, publicIpId
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/publicipaddresses'
    | project publicIpId = id, publicIpAddress = properties.ipAddress)
on publicIpId
| project-away publicIpId1
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' | extend nics=array_length(properties.networkProfile.networkInterfaces) | mv-expand nic=properties.networkProfile.networkInterfaces | where nics == 1 or nic.properties.primary =~ 'true' or isempty(nic) | project vmId = id, vmName = name, vmSize=tostring(properties.hardwareProfile.vmSize), nicId = tostring(nic.id) | join kind=leftouter ( Resources | where type =~ 'microsoft.network/networkinterfaces' | extend ipConfigsCount=array_length(properties.ipConfigurations) | mv-expand ipconfig=properties.ipConfigurations | where ipConfigsCount == 1 or ipconfig.properties.primary =~ 'true' | project nicId = id, publicIpId = tostring(ipconfig.properties.publicIPAddress.id)) on nicId | project-away nicId1 | summarize by vmId, vmName, vmSize, nicId, publicIpId | join kind=leftouter ( Resources | where type =~ 'microsoft.network/publicipaddresses' | project publicIpId = id, publicIpAddress = properties.ipAddress) on publicIpId | project-away publicIpId1"

Listar todas as extensões instaladas em uma máquina virtual

Primeiro, essa consulta usa extend no tipo de recurso de máquinas virtuais para obter a ID em maiúsculas (toupper()) a ID, obter o nome e o tipo do sistema operacional e obter o tamanho da máquina virtual. Obter o ID do recurso em maiúsculas é uma boa maneira de se preparar para ingressar em outra propriedade. Em seguida, a consulta usa com kind como leftouter para obter extensões de máquina virtual combinando um maiúsculo substring do ID da extensão.join A parte do ID antes de "/extensions/<ExtensionName>" é o mesmo formato que o ID das máquinas virtuais, portanto, usamos essa propriedade para o join. summarizeé então usado com make_list o nome da extensão de máquina virtual para combinar o nome de cada extensão onde id, OSName, OSType e VMSize são os mesmos em uma única propriedade de matriz. Por fim, nós o OSName de caixa inferior com asc.order by Por padrão, order by é decrescente.

Resources
| where type == 'microsoft.compute/virtualmachines'
| extend
    JoinID = toupper(id),
    OSName = tostring(properties.osProfile.computerName),
    OSType = tostring(properties.storageProfile.osDisk.osType),
    VMSize = tostring(properties.hardwareProfile.vmSize)
| join kind=leftouter(
    Resources
    | where type == 'microsoft.compute/virtualmachines/extensions'
    | extend
        VMId = toupper(substring(id, 0, indexof(id, '/extensions'))),
        ExtensionName = name
) on $left.JoinID == $right.VMId
| summarize Extensions = make_list(ExtensionName) by id, OSName, OSType, VMSize
| order by tolower(OSName) asc
az graph query -q "Resources | where type == 'microsoft.compute/virtualmachines' | extend JoinID = toupper(id), OSName = tostring(properties.osProfile.computerName), OSType = tostring(properties.storageProfile.osDisk.osType), VMSize = tostring(properties.hardwareProfile.vmSize) | join kind=leftouter( Resources | where type == 'microsoft.compute/virtualmachines/extensions' | extend VMId = toupper(substring(id, 0, indexof(id, '/extensions'))), ExtensionName = name ) on \$left.JoinID == \$right.VMId | summarize Extensions = make_list(ExtensionName) by id, OSName, OSType, VMSize | order by tolower(OSName) asc"

Localizar contas de armazenamento com uma tag específica no grupo de recursos

A consulta a seguir usa um internojoin para conectar contas de armazenamento com grupos de recursos que têm um nome de tag e um valor de tag que diferenciam maiúsculas de minúsculas especificados.

Resources
| where type =~ 'microsoft.storage/storageaccounts'
| join kind=inner (
    ResourceContainers
    | where type =~ 'microsoft.resources/subscriptions/resourcegroups'
    | where tags['Key1'] =~ 'Value1'
    | project subscriptionId, resourceGroup)
on subscriptionId, resourceGroup
| project-away subscriptionId1, resourceGroup1
az graph query -q "Resources | where type =~ 'microsoft.storage/storageaccounts' | join kind=inner ( ResourceContainers | where type =~ 'microsoft.resources/subscriptions/resourcegroups' | where tags['Key1'] =~ 'Value1' | project subscriptionId, resourceGroup) on subscriptionId, resourceGroup | project-away subscriptionId1, resourceGroup1"

Se for necessário procurar um nome de tag que não diferencie maiúsculas de minúsculas e um valor de tag, use mv-expand com o parâmetro bagexpansion . Essa consulta usa mais cota do que a consulta anterior, portanto, use mv-expand somente se necessário.

Resources
| where type =~ 'microsoft.storage/storageaccounts'
| join kind=inner (
    ResourceContainers
    | where type =~ 'microsoft.resources/subscriptions/resourcegroups'
    | mv-expand bagexpansion=array tags
    | where isnotempty(tags)
    | where tags[0] =~ 'key1' and tags[1] =~ 'value1'
    | project subscriptionId, resourceGroup)
on subscriptionId, resourceGroup
| project-away subscriptionId1, resourceGroup1
az graph query -q "Resources | where type =~ 'microsoft.storage/storageaccounts' | join kind=inner ( ResourceContainers | where type =~ 'microsoft.resources/subscriptions/resourcegroups' | mv-expand bagexpansion=array tags | where isnotempty(tags) | where tags[0] =~ 'key1' and tags[1] =~ 'value1' | project subscriptionId, resourceGroup) on subscriptionId, resourceGroup | project-away subscriptionId1, resourceGroup1"

Combinar resultados de duas consultas em um único resultado

A consulta a seguir usa union para obter resultados da tabela ResourceContainers e adicioná-los aos resultados da tabela Resources .

ResourceContainers
| where type=='microsoft.resources/subscriptions/resourcegroups' | project name, type  | limit 5
| union  (Resources | project name, type | limit 5)
az graph query -q "ResourceContainers | where type=='microsoft.resources/subscriptions/resourcegroups' | project name, type  | limit 5 | union  (Resources | project name, type | limit 5)"

Obter redes virtuais e sub-redes de interfaces de rede

Use uma expressão parse regular para obter os nomes de rede virtual e sub-rede da propriedade ID do recurso. Embora parse permita obter dados de um campo complexo, é ideal acessar propriedades diretamente se elas existirem, em vez de usar parseo .

Resources
| where type =~ 'microsoft.network/networkinterfaces'
| project id, ipConfigurations = properties.ipConfigurations
| mvexpand ipConfigurations
| project id, subnetId = tostring(ipConfigurations.properties.subnet.id)
| parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet
| project id, virtualNetwork, subnet
az graph query -q "Resources | where type =~ 'microsoft.network/networkinterfaces' | project id, ipConfigurations = properties.ipConfigurations | mvexpand ipConfigurations | project id, subnetId = tostring(ipConfigurations.properties.subnet.id) | parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet | project id, virtualNetwork, subnet"

Resumir a máquina virtual pela propriedade estendida de estados de energia

Esta consulta usa as propriedades estendidas em máquinas virtuais para resumir por estados de energia.

Resources
| where type == 'microsoft.compute/virtualmachines'
| summarize count() by tostring(properties.extended.instanceView.powerState.code)
az graph query -q "Resources | where type == 'microsoft.compute/virtualmachines' | summarize count() by tostring(properties.extended.instanceView.powerState.code)"

Próximos passos