Azure Resource Graph 및 PowerShell 생존 가이드.

11436 단어 powershellkqlazure
Azure 리소스 그래프는 여러 구독에서 Azure 데이터에 액세스해야 할 때 매우 소중합니다. 강력한 도구이지만 PowerShell과 함께 사용하면 때때로 실망스러울 수 있습니다.
PowerShell을 사용하여 Azure Resource Graph에 대한 KQL 요청을 관리하는 방법을 살펴보겠습니다.

AZ 리소스 그래프 모듈

AZ PowerShell 모듈에는 포함되지 않았습니다. 당신은 설치해야합니다

Install-Module -Name Az.ResourceGraph -Scope CurrentUser


이 cmdlet을 설치합니다.
  • 검색-AzGraph
  • Get-AzResourceGraphQuery
  • New-AzResourceGraphQuery
  • AzResourceGraphQuery 제거
  • 업데이트-AzResourceGraphQuery

  • 마지막 4개의 cmdlet을 사용하면 기록된 쿼리를 관리할 수 있으며 첫 번째 cmdlet은 PowerShell에서 Azure Graph(Resource Graph, Monitor 등)를 직접 쿼리하는 데 사용됩니다.

    KQL의 오류 관리

    KQL 요청이 구문 오류와 같은 오류를 반환하면 어떻게 됩니까? PowerShell 예외가 아닌 KQL 오류로 출력됩니다. 이 상태에서는 표준 Catch/Try를 사용하여 예외를 캡처하는 것이 불가능해졌습니다.
    이를 방지하려면 사용자 지정 예외를 만들어야 합니다. PowerShell에서 사용자 지정 예외를 만들려면 예외 클래스에서 상속된 클래스를 만들어야 합니다.

    class AzResourceGraphException : Exception {
        [string] $additionalData
    
        AzResourceGraphException($Message, $additionalData) : base($Message) {
            $this.additionalData = $additionalData
        }
    }
    


    그것을 사용하려면

    $resourceGraphQuery = "Resource" 
    
    Search-AzGraph -Query $resourceGraphQuery -ErrorVariable grapherror -ErrorAction SilentlyContinue 
    
    if ($null -ne $grapherror.Length) {
    
        $errorJSON = $grapherror.ErrorDetails.Message | ConvertFrom-Json
    
        throw [AzResourceGraphException]::new($errorJSON.error.details.code, $errorJSON.error.details.message)
    
    }
    


    요청 작성

    KQL을 사용해 본 경험이 있다면 KQL 요청이 여러 줄에 걸릴 수 있다는 것을 알고 계실 것입니다. 여러 줄 쿼리는 더 명확하고 읽기 쉬우며 필요할 때 편집할 수 있습니다.
    PowerShell로 어떻게 동일한 작업을 수행할 수 있습니까?
    here-string을 사용하여 여러 줄 변수를 @""@로 묶을 수 있습니다.

    kqlQuery = @"
        Resources
        | join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project subscriptionName = name, subscriptionId) on subscriptionId
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | project VMResourceId = id, subscriptionId, subscriptionName, resourceGroup, resourceName = name, networkInterfaces = (properties.networkProfile.networkInterfaces)
        | mv-expand networkInterfaces
        | project VMResourceId, subscriptionId, subscriptionName, resourceGroup, resourceName, networkInterfaceId = tostring(networkInterfaces.id)
        | join kind=leftouter(
            Resources
            | where type =~ 'Microsoft.Network/networkInterfaces'
            | project id, ipConfigurations = (properties.ipConfigurations)
            | mv-expand ipConfigurations
            | project id, publicIpAddressId = tostring(ipConfigurations.properties.publicIPAddress.id), privateIp = ipConfigurations.properties.privateIPAddress
            | join kind = leftouter (
                Resources
                | where type =~ 'Microsoft.Network/publicIPAddresses'
                | project publicIpId=id, ipAddress=tostring(properties.ipAddress)
            ) on $left.publicIpAddressId == $right.publicIpId
        ) on  $left.networkInterfaceId == $right.id
        | project VMResourceId, subscriptionId, subscriptionName, resourceGroup, resourceName, ipAddress, privateIp
        | order by subscriptionId, subscriptionName, resourceGroup, resourceName
    "@
    


    제한 사항

    KQL로 데이터를 추출한다는 것은 필요한 데이터를 추출하기 위해 여러 테이블을 조인하는 것을 의미하는 경우가 많습니다. 이전 예에서는 3개의 테이블이 조인되었습니다.
    하지만 한 쿼리에서 4개 이상의 조인을 사용할 수 없다는 제한이 있습니다. 더 많은 조인을 사용하면 오류가 발생합니다.

    또한 기본적으로 데이터 세트의 크기가 제한되어 처음 100개의 결과만 반환됩니다. 더 많은 것을 원하면 –First 매개변수가 필요합니다. 반환할 최대 행 수를 정의하지만 1000개로 제한됩니다. 결과에 1000개 이상의 행이 포함된 경우 페이지 매김을 사용해야 합니다.

    쪽수 매기기

    쿼리당 1000개 이상의 행을 검색할 수 있지만 페이지 매김을 사용하여 데이터 세트를 검색할 수 있습니다.
    기술 중 하나는 –SkipToken 매개 변수를 사용하는 것입니다. 결과의 다음 페이지를 가져오는 데 사용됩니다.
    Search-AzGraph에서 반환된 개체에는 SkipToken 속성이 포함되어 있습니다. 문자열인 이 토큰은 이전 쿼리의 결과를 건너뛰기 위해 다음 쿼리에서 사용할 수 있습니다.
    작동하려면 결과에 ID가 포함되어야 합니다.

    $kqlQuery = @"
    Resources 
    | join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project subscriptionName = name, subscriptionId) on subscriptionId 
    | where type =~ 'Microsoft.Compute/virtualMachines' 
    | project VMResourceId = id, subscriptionName, resourceGroup, name 
    "@
    
    $batchSize = 1000
    $skipResult = 0 
    
    [System.Collections.Generic.List[string]]$kqlResult 
    
    while ($true) {
    
        if ($skipResult -gt 0) {
            $graphResult = Search-AzGraph -Query $kqlQuery   -first $batchSize -SkipToken $graphResult.SkipToken
        } 
        else {
            $graphResult = Search-AzGraph -Query $kqlQuery   -first $batchSize 
        }
    
        $kqlResult += $graphResult.data
    
        if ($graphResult.data.Count -lt $batchSize) {
            break;
        }
        $skipResult += $skipResult + $batchSize
    }
    


    모듈 문서here를 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기