Exemplos de consultas avançadas do Resource Graph
A primeira etapa para consultas de reconhecimento com o Microsoft Azure Resource Graph é uma compreensão básica da Linguagem de Consulta. Se você já não estiver familiarizado com o Azure Data Explorer, é recomendável revisar os conceitos básicos para entender como compor solicitações para os recursos que está procurando.
Vamos percorrer as seguintes consultas avançadas:
- Mostrar a versão de API para cada tipo de recurso
- Obter capacidade e tamanho do conjunto de dimensionamento de máquina virtual
- Remover colunas dos resultados
- Listar todos os nomes de marca
- Máquinas virtuais correspondidas por regex
- Listar o Azure Cosmos DB com localizações de gravação específicas
- Cofres de chaves com o nome da assinatura
- Listar Bancos de Dados SQL e seus pools elásticos
- Listar máquinas virtuais com seu adaptador de rede e IP público
- Listar todas as extensões instaladas em uma máquina virtual
- Localizar contas de armazenamento com uma tag específica no grupo de recursos
- Combinar resultados de duas consultas em um único resultado
- Obter redes virtuais e sub-redes de interfaces de rede
- Resumir a máquina virtual pela propriedade estendida dos estados de energia
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Suporte ao idioma
A CLI do Azure (por meio de uma extensão) e o Azure PowerShell (por meio de um módulo) suportam o Gráfico de Recursos do Azure. Antes de executar qualquer uma das consultas a seguir, verifique se seu ambiente está preparado. Veja CLI do Azure e Azure PowerShell para obter as etapas instalar e validar o ambiente shell de escolha.
Mostrar a versão de API para cada tipo de recurso
O Resource Graph usa principalmente a versão mais recente de uma API do Provedor de Recursos que não seja uma versão prévia para as propriedades do recurso GET
durante uma atualização. Em alguns casos, a versão da API usada foi substituída para fornecer propriedades mais atuais ou amplamente usadas nos resultados. A seguinte consulta fornece detalhes da versão da API usada para coletar as 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 capacidade e tamanho do conjunto de dimensionamento de máquina virtual
Essa consulta procura por recursos VMSS e obtém os diversos detalhes, incluindo o tamanho da máquina virtual e a capacidade do conjunto de dimensionamento. A consulta usa a função toint()
para converter a capacidade em um número para que ela possa ser classificada. Por fim, as colunas são renomeadas para as propriedades nomeadas 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á-lo com detalhes da assinatura da tabela ResourceContainers e, em seguida, project-away
para remover algumas 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 marca
Essa consulta começa com a marca e cria um objeto JSON listando todos os nomes de marca exclusivos e seus tipos correspondentes.
Resources
| project tags
| summarize buildschema(tags)
az graph query -q "Resources | project tags | summarize buildschema(tags)"
Correspondência de máquinas virtuais por regex
Essa consulta procura por máquinas virtuais que correspondem a um expressão regular (conhecida como regex). O corresponde ao regex @ nos permite definir o regex para correspondência, que é ^Contoso(.*)[0-9]+$
.
Essa definição de regex é explicada como:
^
- a correspondência deve começar no início da cadeia de caracteres.Contoso
- a cadeia de caracteres com diferenciação de maiúsculas e minúsculas.(.*)
- uma correspondência de subexpressão:.
- corresponde a qualquer caractere único (exceto uma nova linha).*
- corresponde ao elemento anterior nenhuma ou mais vezes.
[0-9]
- correspondência de grupo de caracteres para os números de 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.
Após a 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 localizações de gravação específicas
A consulta a seguir limita-se aos recursos do Azure Cosmos DB, usa mv-expand
para expandir o recipiente de propriedades para properties.writeLocations, projetar campos específicos e limitar ainda mais os resultados aos valores properties.writeLocations.locationName correspondentes a 'Leste dos EUA' ou 'Oeste dos EUA'.
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 o nome da assinatura
A consulta a seguir mostra um uso complexo de join
com o tipo como leftouter. A consulta limita a tabela ingressada aos recursos de assinaturas e com project
para incluir apenas o campo original subscriptionId e o campo name renomeado para SubName. A renomeação do campo evita que join
o adicione como name1, uma vez que o campo já existe em resources. A tabela original é filtrada com where
e o project
a seguir inclui colunas das duas tabelas. O resultado da consulta é que todos os cofres de chaves exibem 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 usará leftouter join
para reunir recursos do Banco de Dados SQL e os pools elásticos relacionados deles, se tiverem algum.
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 seu adaptador de rede e IP público
Essa consulta usa os comandos leftouter join
para reunir máquinas virtuais criadas com o modelo de implantação do Resource Manager, os adaptadores de rede relacionados deles e quaisquer endereços IP públicos relacionados a esses adaptadores 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 das máquinas virtuais para obter a ID em letras maiúsculas (toupper()
), obter o nome e o tipo do sistema operacional e obter o tamanho da máquina virtual.
Obter a ID do recurso em letras maiúsculas é uma boa maneira de se preparar para unir-se a outra propriedade. Em seguida, a consulta usa join
com kind como leftouter para obter as extensões de máquina virtual, fazendo a correspondência com um substring
em letra maiúscula da ID da extensão. A parte da ID antes de "/extensions/<ExtensionName>" tem o mesmo formato que a ID da máquina virtual, portanto, usamos essa propriedade para o join
. summarize
é usado com make_list
no nome da extensão da máquina virtual para combinar o nome de cada extensão em que id, OSName, OSType e VMSize são os mesmos em uma só propriedade de matriz. Por fim, nós fazemos o order by
do OSName em letras minúsculas com asc. 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 inner join
para conectar contas de armazenamento a grupos de recursos que têm um nome e um valor de marca especificados que diferenciam maiúsculas de minúsculas.
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 e um valor de marca que não diferenciam maiúsculas de minúsculas, 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 Recursos.
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 regular parse
para obter os nomes da rede virtual e da sub-rede da propriedade de ID do recurso. Embora parse
habilite a coleta de dados de um campo complexo, se as propriedades existirem, será ideal acessá-las diretamente em vez de usar parse
.
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 dos estados de energia
Essa 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óximas etapas
- Veja exemplos de Consultas iniciais.
- Saiba mais sobre a linguagem de consulta.
- Saiba mais sobre como explorar recursos.