미사용 Azure 리소스 감지

각 팀이 배포를 담당하는 많은 수의 Azure 구독을 실행하는 경우 잠시 후 일부 고아 및 사용되지 않는 개체가 구독에 남아 있음을 알게 됩니다. 사용자가 VM을 생성하고 삭제 후 연결된 리소스를 제거하는 것을 잊었습니다. 그들은 또한 모든 응용 프로그램이 삭제된 후 남은 APP 서비스 계획을 만들었을 수 있습니다.
이는 어려울 수 있습니다. 이러한 리소스는 여전히 청구됩니다.
구독에서 혼자 남길 수 있는 3가지 유형의 리소스를 찾을 수 있습니다.
  • 공개 IP
  • 디스크
  • App Service 플랜

  • 어떻게 감지합니까? 둘 이상의 구독에 대해 이야기할 때 가장 효과적인 도구는 Azure Resource Graph입니다. 구독당 리소스 구독을 쿼리하는 대신 Azure 메타데이터를 쿼리합니다.
    이제 각 리소스에 대한 쿼리를 만드는 방법을 살펴보겠습니다.

    디스크의 경우

    resources
    | where type == "microsoft.compute/disks"
    


    그러나 VM에 연결되지 않은 디스크만 있으면 diskState 속성을 테스트하고 값이 Unattached인지 테스트해야 합니다.

    resources
    | where type == "microsoft.compute/disks"
    | where properties.diskState == "Unattached"
    


    *공용 IP의 경우 *

    resources
    | where type == "microsoft.network/publicipaddresses"
    


    독립 실행형 공용 IP를 가지려면 리소스에 연결되지 않은 IP를 사용하려면 IP 구성 ID가 없는지 테스트해야 합니다.

    resources
    | where type == "microsoft.network/publicipaddresses"
    | where isnull(properties.ipConfiguration.id)
    


    앱 서비스 플랜의 경우
    Azure 함수에서 사용하지 않는 계획을 찾아야 합니다.

    resources
    | where type == "microsoft.web/serverfarms"
    | where properties.kind <> "functionapp"
    


    연결된 웹사이트 없이 앱 서비스만 받으려면 mumbeOfSites 속성을 살펴봐야 합니다.

    resources
    | where type == "microsoft.web/serverfarms"
    | where properties.kind <> "functionapp" 
    | where properties.numberOfSites == 0
    


    그러나 이러한 모든 개체를 동시에 포함하는 단일 쿼리를 만들 수 있습니다.
    이를 위해서는 출력을 표준화해야 합니다. ResourceID, SubscriptionID, 리소스 그룹 및 리소스 이름의 3개 쿼리에 동일한 열이 있어야 하며 공용 IP 또는 App Service 계획에 대한 SKU 또는 계획에 대한 디스크 크기도 있어야 합니다. .

    새 쿼리는 다음과 같습니다.

    resources
    | where type == "microsoft.network/publicipaddresses"
    | where isnull(properties.ipConfiguration.id)
    | project id, subscriptionId, resourceGroup, resourceName = name, type, resourceValue = sku.name
    



    resources
    | where type == "microsoft.compute/disks"
    | where properties.diskState == 'Unattached'
    | project id, subscriptionId,resourceGroup, resourceName = name, type, resourceValue = properties.diskSizeBytes
    



    resources
    | where type == "microsoft.web/serverfarms"
    | where properties.kind <> "functionapp" 
    | where properties.numberOfSites == 0 
    | project id, subscriptionId,resourceGroup, resourceName = name, resourceValue = sku.tier
    


    고유한 쿼리를 생성하기 위한 해결책은 UNION을 사용하는 것입니다. UNION은 두 테이블을 단일 결과로 결합합니다. 통합 연산자를 사용하여 최대 3개의 쿼리를 결합할 수 있습니다.

    resources
    | where type == "microsoft.network/publicipaddresses"
    | where isnull(properties.ipConfiguration.id)
    | project id, subscriptionId, resourceGroup, resourceName = name, type, resourceValue = sku.name 
    | union (resources
        | where type == "microsoft.compute/disks"
        | where properties.diskState == 'Unattached'
        | project id, subscriptionId,resourceGroup, resourceName = name, type, resourceValue = properties.diskSizeBytes)
    |union (resources
        | where type == "microsoft.web/serverfarms"
        | where properties.kind <> "functionapp" 
        | where properties.numberOfSites == 0 
        | project id, subscriptionId,resourceGroup, resourceName = name, resourceValue = sku.tier)
    

    좋은 웹페이지 즐겨찾기