Azure Resource Graph 쿼리 언어 이해

Azure Resource Graph의 쿼리 언어는 다양한 연산자와 함수를 지원합니다. 각각은 KQL(Kusto Query Language)을 기반으로 작동합니다. Resource Graph에서 사용하는 쿼리 언어에 대해 알아보려면 KQL에 대한 자습서로 시작하세요.

이 문서에서는 Resource Graph에서 지원하는 언어 구성 요소에 대해 설명합니다.

Resource Graph 테이블

Resource Graph는 Azure Resource Manager 리소스 종류 및 해당 속성에 관해 저장하는 데이터에 대한 여러 테이블을 제공합니다. Resource Graph 테이블은 join 연산자와 함께 사용하여 관련 리소스 종류에서 속성을 가져올 수 있습니다.

Resource Graph 테이블은 join 버전을 지원합니다.

Resource Graph 테이블 다른 테이블을 join할 수 있나요? 설명
AdvisorResources Microsoft.Advisor관련 리소스를 포함합니다.
AlertsManagementResources Microsoft.AlertsManagement관련 리소스를 포함합니다.
AppServiceResources Microsoft.Web관련 리소스를 포함합니다.
AuthorizationResources Microsoft.Authorization관련 리소스를 포함합니다.
AWSResources Microsoft.AwsConnector관련 리소스를 포함합니다.
AzureBusinessContinuityResources Microsoft.AzureBusinessContinuity관련 리소스를 포함합니다.
ChaosResources Microsoft.Chaos관련 리소스를 포함합니다.
CommunityGalleryResources Microsoft.Compute관련 리소스를 포함합니다.
ComputeResources Microsoft.Compute Virtual Machine Scale Sets와 관련된 리소스를 포함합니다.
DesktopVirtualizationResources Microsoft.DesktopVirtualization관련 리소스를 포함합니다.
DnsResources Microsoft.Network관련 리소스를 포함합니다.
EdgeOrderResources Microsoft.EdgeOrder관련 리소스를 포함합니다.
ElasticsanResources Microsoft.ElasticSan관련 리소스를 포함합니다.
ExtendedLocationResources Microsoft.ExtendedLocation관련 리소스를 포함합니다.
FeatureResources Microsoft.Features관련 리소스를 포함합니다.
GuestConfigurationResources Microsoft.GuestConfiguration관련 리소스를 포함합니다.
HealthResourceChanges Microsoft.Resources관련 리소스를 포함합니다.
HealthResources Microsoft.ResourceHealth관련 리소스를 포함합니다.
InsightsResources Microsoft.Insights관련 리소스를 포함합니다.
IoTSecurityResources Microsoft.IoTSecurityMicrosoft.IoTFirmwareDefense관련 리소스를 포함합니다.
KubernetesConfigurationResources Microsoft.KubernetesConfiguration관련 리소스를 포함합니다.
KustoResources Microsoft.Kusto관련 리소스를 포함합니다.
MaintenanceResources Microsoft.Maintenance관련 리소스를 포함합니다.
ManagedServicesResources Microsoft.ManagedServices관련 리소스를 포함합니다.
MigrateResources Microsoft.OffAzure관련 리소스를 포함합니다.
NetworkResources Microsoft.Network관련 리소스를 포함합니다.
OrbitalResources Microsoft.Orbital관련 리소스를 포함합니다.
PatchAssessmentResources Azure Virtual Machines 패치 평가 Microsoft.ComputeMicrosoft.HybridCompute관련된 리소스를 포함합니다.
PatchInstallationResources Azure Virtual Machines 패치 설치 Microsoft.ComputeMicrosoft.HybridCompute관련된 리소스를 포함합니다.
PolicyResources Microsoft.PolicyInsights관련 리소스를 포함합니다.
RecoveryServicesResources Microsoft.DataProtectionMicrosoft.RecoveryServices관련 리소스를 포함합니다.
ResourceChanges Microsoft.Resources관련 리소스를 포함합니다.
ResourceContainerChanges Microsoft.Resources관련 리소스를 포함합니다.
ResourceContainers 관리 그룹(Microsoft.Management/managementGroups), 구독(Microsoft.Resources/subscriptions) 및 리소스 그룹(Microsoft.Resources/subscriptions/resourcegroups) 리소스 종류 및 데이터를 포함합니다.
리소스 쿼리에 테이블이 정의되지 않은 경우 기본 테이블입니다. 대부분의 Resource Manager 리소스 종류 및 속성이 포함되어 있습니다.
SecurityResources Microsoft.Security관련 리소스를 포함합니다.
ServiceFabricResources Microsoft.ServiceFabric관련 리소스를 포함합니다.
ServiceHealthResources Microsoft.ResourceHealth/events관련 리소스를 포함합니다.
SpotResources Microsoft.Compute관련 리소스를 포함합니다.
SupportResources Microsoft.Support관련 리소스를 포함합니다.
TagsResources Microsoft.Resources/tagnamespaces관련 리소스를 포함합니다.

리소스 종류가 포함된 테이블 목록을 보려면 Azure Resource Graph 테이블 및 리소스 종류 참조로 이동합니다.

참고 항목

Resources는 기본 테이블입니다. Resources 테이블을 쿼리하는 동안 join 또는 union을 사용하지 않는 한 테이블 이름을 제공할 필요가 없습니다. 그러나 권장되는 방법은 항상 쿼리에 초기 테이블을 포함하는 것입니다.

각 테이블에서 사용할 수 있는 리소스 종류를 검색하려면 포털의 Resource Graph 탐색기를 사용합니다. 또는 <tableName> | distinct type 쿼리를 사용하여 해당 환경에 존재하는, 지정된 Resource Graph 테이블이 지원하는 리소스 종류의 목록을 가져올 수 있습니다.

다음 쿼리는 단순한 join을 보여 줍니다. 쿼리 결과는 열을 함께 혼합하며, 조인된 테이블의 모든 중복 열 이름(이 예에서는 ResourceContainers)에는 1이 추가됩니다. ResourceContainers 테이블에는 구독과 리소스 그룹 모두에 대한 종류가 있으므로 각 종류를 Resources 테이블의 리소스에 조인하는 데 사용할 수 있습니다.

Resources
| join ResourceContainers on subscriptionId
| limit 1

다음 쿼리는 join의 더 복잡한 사용법을 보여 줍니다. 먼저 쿼리는 project를 사용하여 Azure Key Vault 자격 증명 모음 리소스 종류에 대해 Resources에서 필드를 가져옵니다. 다음 단계에서는 join을 사용하여 ResourceContainers와 결과를 병합합니다. 이 경우의 형식은 첫 번째 테이블의 project 및 조인된 테이블의 project 모두에 있는 속성에 대한 구독입니다. 속성이 이미 Resources에서 프로젝션되었으므로 필드 이름을 바꾸면 join이 이를 name1으로 추가하는 것을 방지할 수 있습니다. 쿼리 결과는 키 자격 증명 모음의 유형, 이름, 위치 및 리소스 그룹과 해당 모음이 있는 구독 이름을 표시하는 단일 키 자격 증명 모음입니다.

Resources
| where type == 'microsoft.keyvault/vaults'
| project name, type, location, subscriptionId, resourceGroup
| join (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId
| project type, name, location, resourceGroup, SubName
| limit 1

참고 항목

project를 사용하여 join 결과를 제한하는 경우 join에서 두 테이블의 관계를 설정하기 위해 사용하는 subscriptionId 속성을 project에 포함해야 합니다.

확장 속성

미리 보기 기능으로서, Resource Graph의 일부 리소스 종류에는 Azure Resource Manager에서 제공하는 속성 이외에도 쿼리에 사용할 수 있는 추가 형식 관련 속성이 있습니다. 확장 속성이라고 하는 이 값의 집합은 properties.extended의 지원되는 리소스 종류에 있습니다. 확장 속성이 있는 리소스 종류를 표시하려면 다음 쿼리를 사용합니다.

Resources
| where isnotnull(properties.extended)
| distinct type
| order by type asc

예: instanceView.powerState.code를 기준으로 가상 컴퓨터 수 가져오기:

Resources
| where type == 'microsoft.compute/virtualmachines'
| summarize count() by tostring(properties.extended.instanceView.powerState.code)

Resource Graph 사용자 지정 언어 요소

공유 쿼리 구문(미리 보기)

미리 보기 기능으로서, 공유 쿼리는 Resource Graph 쿼리에서 직접 액세스할 수 있습니다. 이 시나리오에서는 표준 쿼리를 공유 쿼리로 만들고 다시 사용할 수 있습니다. Resource Graph 쿼리 내에서 공유 쿼리를 호출하려면 {{shared-query-uri}} 구문을 사용합니다. 공유 쿼리의 URI는 해당 쿼리의 설정 페이지에 있는 공유 쿼리의 리소스 ID입니다. 이 예에서 공유 쿼리 URI는 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SharedQueries/providers/Microsoft.ResourceGraph/queries/Count VMs by OS입니다. 이 URI는 다른 쿼리에서 참조하려는 구독, 리소스 그룹 및 공유 쿼리의 전체 이름을 가리킵니다. 이 쿼리는 자습서: 쿼리 만들기 및 공유에서 만든 쿼리와 동일합니다.

참고 항목

공유 쿼리를 참조하는 쿼리는 공유 쿼리로 저장할 수 없습니다.

예 1: 공유 쿼리만 사용:

이 Resource Graph 쿼리의 결과는 공유 쿼리에 저장된 쿼리와 동일합니다.

{{/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SharedQueries/providers/Microsoft.ResourceGraph/queries/Count VMs by OS}}

예 2: 공유 쿼리를 더 큰 쿼리의 일부로 포함:

이 쿼리는 먼저 공유 쿼리를 사용한 다음 limit을 사용하여 결과를 추가로 제한합니다.

{{/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SharedQueries/providers/Microsoft.ResourceGraph/queries/Count VMs by OS}}
| where properties_storageProfile_osDisk_osType =~ 'Windows'

지원되는 KQL 언어 요소

Resource Graph는 모든 KQL 데이터 형식, 스칼라 함수, 스칼라 연산자집계 함수의 하위 집합을 지원합니다. Resource Graph는 특정 테이블 형식 연산자를 지원하며, 그 중 일부는 동작이 서로 다릅니다.

지원되는 테이블 형식/최상위 수준 연산자

Resource Graph에서 지원하는 KQL 테이블 형식 연산자와 특정 샘플의 목록은 다음과 같습니다.

KQL Resource Graph 샘플 쿼리 주의
count 키 자격 증명 모음 계수
distinct 스토리지를 포함하는 리소스 표시
extend OS 유형별 가상 머신 개수 계산
join 구독 이름이 있는 키 자격 증명 모음 지원되는 조인 유형: innerunique, inner, leftouterfullouter. 단일 쿼리에서는 세 개의 join으로 제한되며 그중 하나는 교차 테이블 join일 수 있습니다. 모든 교차 테이블 join 사용이 ResourceResourceContainers 사이에 있는 경우 세 개의 교차 테이블 join이 허용됩니다. 브로드캐스트 조인과 같은 사용자 지정 조인 전략은 허용되지 않습니다. join을 사용할 수 있는 테이블은 Resource Graph 테이블을 참조하세요.
limit 모든 공용 IP 주소 나열 take의 동의어입니다. Skip에서 작동하지 않습니다.
mvexpand 레거시 연산자. mv-expand를 대신 사용합니다. RowLimit. 최댓값은 400입니다. 기본값은 128입니다.
mv-expand 특정 쓰기 위치를 사용하여 Azure Cosmos DB 나열 RowLimit. 최댓값은 400입니다. 기본값은 128입니다. 단일 쿼리의 mv-expand은 2개로 제한됩니다.
order 리소스를 이름별로 나열 sort의 동의어
parse 네트워크 인터페이스의 가상 네트워크 및 서브넷 가져오기 속성이 있는 경우 parse를 사용하는 대신 속성에 직접 액세스하는 것이 적합합니다.
project 리소스를 이름별로 나열
project-away 결과에서 열 제거
sort 리소스를 이름별로 나열 order의 동의어
summarize Azure 리소스 개수 계산 간소화된 첫 페이지만
take 모든 공용 IP 주소 나열 limit의 동의어입니다. Skip에서 작동하지 않습니다.
top 이름 및 해당 OS 유형별로 처음 5개의 가상 머신 표시
union 두 쿼리의 결과를 단일 결과로 결합 단일 테이블 허용: | union [kind= inner|outer] [withsource=ColumnName] Table 단일 쿼리에서는 3개의 union 레그로 제한됩니다. union 레그 테이블의 유사 항목 확인은 허용되지 않습니다. 단일 테이블 내에서 사용하거나 Resources 테이블과 ResourceContainers 테이블 간에 사용할 수 있습니다.
where 스토리지를 포함하는 리소스 표시

단일 Resource Graph SDK 쿼리에는 기본적으로 join 연산자 3개와 mv-expand 연산자 3개로 제한됩니다. 도움말 + 지원을 통해 테넌트에 대한 이 제한을 늘리도록 요청할 수 있습니다.

쿼리 열기 포털 환경을 지원하기 위해 Azure Resource Graph 탐색기는 Resource Graph SDK보다 전역 제한이 높습니다.

참고 항목

한도인 1을 초과하면 테이블을 오른쪽 테이블로 여러 번 참조할 수 없습니다. 그렇게 하면 DisallowedMaxNumberOfRemoteTables 코드와 함께 오류가 발생합니다.

쿼리 범위

쿼리에서 리소스가 반환되는 구독 또는 관리 그룹의 범위는 기본적으로 권한 있는 사용자의 컨텍스트에 따라 구독 목록으로 설정됩니다. 관리 그룹 또는 구독 목록이 정의되지 않은 경우 쿼리 범위는 모든 리소스이며 Azure Lighthouse 위임 리소스를 포함합니다.

쿼리할 구독 또는 관리 그룹 목록을 수동으로 정의하여 결과의 범위를 변경할 수 있습니다. 예를 들어 REST API managementGroups 속성은 관리 그룹의 이름과 다른 관리 그룹 ID를 사용합니다. managementGroups가 지정되면 지정된 관리 그룹 계층 구조 내 또는 아래에 있는 처음 10,000개 구독의 리소스가 포함됩니다. managementGroupssubscriptions와 동시에 사용할 수 없습니다.

예: ID가 myMGMy Management Group이라는 관리 그룹 계층 구조 내의 모든 리소스를 쿼리합니다.

  • REST API URI

    POST https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01
    
  • 요청 본문

    {
      "query": "Resources | summarize count()",
      "managementGroups": ["myMG"]
    }
    

AuthorizationScopeFilter 매개 변수를 사용하면 상위 범위에서 상속되는 AuthorizationResources 테이블의 Azure Policy 할당 및 Azure RBAC(Azure 역할 기반 액세스 제어) 역할 할당을 나열할 수 있습니다. AuthorizationScopeFilter 매개 변수는 PolicyResourcesAuthorizationResources 테이블에 대해 다음 값을 허용합니다.

  • AtScopeAndBelow(할당되지 않은 경우 기본값): 할당된 범위 및 모든 자식 범위에 대한 할당을 반환합니다.
  • AtScopeAndAbove: 할당된 범위와 모든 부모 범위에 대한 할당을 반환하지만 자식 범위는 반환하지 않습니다.
  • AtScopeAboveAndBelow: 할당된 범위, 모든 부모 범위 및 모든 자식 범위에 대한 할당을 반환합니다.
  • AtScopeExact: 할당된 범위에 대한 할당만 반환합니다. 부모 또는 자식 범위는 포함되지 않습니다.

참고 항목

AuthorizationScopeFilter 매개 변수를 사용하려면 요청에 2021-06-01-preview 이상의 API 버전을 사용해야 합니다.

예: myMG 관리 그룹 및 테넌트 루트(부모) 범위에서 모든 정책 할당을 가져옵니다.

  • REST API URI

    POST https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2021-06-01-preview
    
  • 요청 본문 샘플

    {
      "options": {
        "authorizationScopeFilter": "AtScopeAndAbove"
      },
      "query": "PolicyResources | where type =~ 'Microsoft.Authorization/PolicyAssignments'",
      "managementGroups": ["myMG"]
    }
    

예: mySubscriptionId 구독, 관리 그룹 및 테넌트 루트 범위에서 모든 정책 할당을 가져옵니다.

  • REST API URI

    POST https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2021-06-01-preview
    
  • 요청 본문 샘플

    {
      "options": {
        "authorizationScopeFilter": "AtScopeAndAbove"
      },
      "query": "PolicyResources | where type =~ 'Microsoft.Authorization/PolicyAssignments'",
      "subscriptions": ["mySubscriptionId"]
    }
    

이스케이프 문자

. 또는 $를 포함하는 일부 속성 이름은 쿼리에서 래핑하거나 이스케이프해야 합니다. 그렇지 않으면 속성 이름이 올바르게 해석되고 올바른 결과를 제공하지 않습니다.

  • 점(.): 대괄호를 사용하여 속성 이름 ['propertyname.withaperiod']를 묶습니다.

    odata.type 속성을 래핑하는 예제 쿼리:

    where type=~'Microsoft.Insights/alertRules' | project name, properties.condition.['odata.type']
    
  • 달러 기호($): 속성 이름의 문자를 이스케이프합니다. 사용되는 이스케이프 문자는 Resource Graph를 실행하는 셸에 따라 다릅니다.

    • Bash: 백슬래시(\)를 이스케이프 문자로 사용합니다.

      Bash에서 $type 속성을 이스케이프하는 예제 쿼리:

      where type=~'Microsoft.Insights/alertRules' | project name, properties.condition.\$type
      
    • cmd: 달러 기호($) 문자를 이스케이프 처리하지 마세요.

    • PowerShell: 백틱(`)을 이스케이프 문자로 사용합니다.

      PowerShell에서 속성 $type을 이스케이프하는 예제 쿼리:

      where type=~'Microsoft.Insights/alertRules' | project name, properties.condition.`$type
      

다음 단계