경고를 사용하여 Azure Automation Runbook 트리거

Azure Monitor를 사용하여 대부분의 Azure 서비스에 대한 기본 수준의 메트릭과 로그를 모니터링합니다. 작업 그룹을 사용하거나 경고에 따라 작업을 자동화하기 위해 Azure Automation Runbook을 호출할 수 있습니다. 이 문서에서는 경고를 사용하여 Runbook을 구성하고 실행하는 방법을 보여 줍니다.

필수 조건

경고 유형

3가지 경고 유형으로 Automation Runbook을 사용할 수 있습니다.

  • 일반적인 경고
  • 활동 로그 경고
  • 실시간에 가까운 메트릭 경고

참고 항목

일반 경고 스키마는 Azure에서 경고 알림에 대한 소비 환경을 표준화합니다. 지금까지 Azure의 세 가지 경고 유형(메트릭, 로그 및 활동 로그)에는 자체 이메일 템플릿, 웹후크 스키마 등이 있었습니다. 자세히 알아보려면 일반 경고 스키마를 참조하세요.

경고가 Runbook을 호출할 때 실제 호출은 웹후크에 대한 HTTP POST 요청입니다. POST 요청의 본문에는 경고와 관련된 유용한 속성을 포함하는 JSON으로 포맷된 개체가 포함되어 있습니다. 다음 표에는 각 경고 유형에 대한 페이로드 스키마 링크가 나열되어 있습니다.

경고 설명 페이로드 스키마
일반 경고 현재 Azure에서 경고 알림에 대한 소비 환경을 표준화하는 일반 경고 스키마입니다. 일반 경고 페이로드 스키마입니다.
활동 로그 경고 Azure 활동 로그의 새 이벤트가 특정 조건과 일치하는 경우 알림을 보냅니다. 예를 들어 Delete VM 작업이 myProductionResourceGroup에서 발생하거나 새 Azure Service Health 이벤트가 활성 상태로 표시되는 경우입니다. 활동 로그 경고 페이로드 스키마
근 실시간 메트릭 경고 만들기 하나 이상의 플랫폼 수준 메트릭이 지정된 조건을 충족하는 경우 메트릭 경고보다 빠르게 알림을 보냅니다. 예를 들어 VM의 CPU % 값이 90보다 큰 경우 및 네트워크 입력의 값이 지난 5분 동안 500MB보다 큰 경우입니다. 근 실시간 메트릭 경고 페이로드 스키마

각 유형의 경고에서 제공되는 데이터가 다르기 때문에 각 경고 유형이 다르게 처리됩니다. 다음 섹션에서는 다양한 유형의 경고를 처리하는 Runbook을 만드는 방법에 대해 배웁니다.

관리 ID에 사용 권한 할당

적절한 관리 ID에 권한을 할당하여 가상 머신을 중지할 수 있도록 허용합니다. Runbook은 Automation 계정의 시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID를 사용할 수 있습니다. 각 ID에 권한을 할당하는 단계가 제공됩니다. 아래 단계에서는 PowerShell을 사용합니다. 포털 사용을 선호하는 경우 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

  1. Connect-AzAccount cmdlet을 사용하여 대화형으로 Azure에 로그인하고 지침을 따릅니다.

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. 아래 변수에 적절한 값을 제공한 다음, 스크립트를 실행합니다.

    $resourceGroup = "resourceGroup"
    $automationAccount = "AutomationAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    
  3. PowerShell cmdlet New-AzRoleAssignment를 사용하여 시스템 할당 관리 ID에 역할을 할당합니다.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. 사용자 할당 관리 ID에 역할을 할당합니다.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity)
    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  5. 시스템 할당 관리 ID의 경우 ClientId를 표시하고 나중에 사용할 수 있도록 값을 기록합니다.

    $UAMI.ClientId
    

경고를 처리할 Runbook 만들기

경고와 함께 Automation을 사용하려면 Runbook에 전달되는 경고 JSON 페이로드를 관리하는 Runbook이 필요합니다. 다음 Runbook 예제는 Azure 경고에서 호출되어야 합니다.

앞 섹션에서 설명한 것처럼 각 경고 유형은 서로 다른 스키마를 사용합니다. 스크립트는 WebhookData Runbook 입력 매개 변수의 경고에서 웹후크 데이터를 가져옵니다. 그런 다음, 스크립트가 JSON 페이로드를 평가하여 사용 중인 경고 유형을 확인합니다.

이 예에서는 Azure VM(Virtual Machines)의 경고를 사용합니다. 페이로드에서 VM 데이터를 검색한 다음 해당 정보를 사용하여 VM을 중지합니다. Runbook이 실행되는 Automation 계정에서 연결을 설정해야 합니다. 경고를 사용하여 Runbook을 트리거하는 경우 트리거되는 Runbook에서 경고 상태를 확인하는 것이 중요합니다. 경고 상태가 변경될 때마다 Runbook이 트리거됩니다. 경고에는 여러 상태가 있으며 가장 일반적인 두 가지 상태는 활성화됨 및 해결됨입니다. Runbook이 두 번 이상 실행되지 않도록 Runbook 논리에서 상태를 확인합니다. 이 문서의 예제에서는 활성화된 상태인 경고만 찾는 방법을 보여 줍니다.

이 Runbook은 Automation 계정의 시스템이 할당한 관리 ID를 사용하여 VM에 대한 관리 작업을 수행하도록 Azure를 인증합니다. 이 Runbook은 사용자가 할당한 관리 ID를 사용하도록 쉽게 수정할 수 있습니다.

참고 항목

Automation 계정이 프라이빗 링크를 사용하고 공용 액세스사용 안 함으로 설정된 상태로 구성된 경우 Azure 경고(메트릭, 로그, 활동 로그)를 사용하여 Automation 웹후크를 트리거할 수 없으므로 공용 네트워크 액세스를 사용하는 것이 좋습니다.

이 예제를 사용하여 Runbook에서 호출한 Stop-AzureVmInResponsetoVMAlert을 만듭니다. PowerShell 스크립트를 수정하고 여러 다른 리소스와 함께 사용할 수 있습니다.

  1. Azure Portal에 로그인하고, Azure Automation 계정으로 이동합니다.

  2. 프로세스 자동화 아래에서 Runbook을 선택합니다.

  3. + Runbook 만들기를 선택합니다.

    1. Runbook 이름을 Stop-AzureVmInResponsetoVMAlert로 지정합니다.
    2. Runbook 형식 드롭다운 목록에서 PowerShell을 선택합니다.
    3. 만들기를 실행합니다.
  4. Runbook 편집기에서 다음 코드를 붙여넣습니다.

    [OutputType("PSAzureOperationResponse")]
    param
    (
        [Parameter (Mandatory=$false)]
        [object] $WebhookData
    )
    $ErrorActionPreference = "stop"
    
    if ($WebhookData)
    {
        # Get the data object from WebhookData
        $WebhookBody = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
    
        # Get the info needed to identify the VM (depends on the payload schema)
        $schemaId = $WebhookBody.schemaId
        Write-Verbose "schemaId: $schemaId" -Verbose
        if ($schemaId -eq "azureMonitorCommonAlertSchema") {
            # This is the common Metric Alert schema (released March 2019)
            $Essentials = [object] ($WebhookBody.data).essentials
            # Get the first target only as this script doesn't handle multiple
            $alertTargetIdArray = (($Essentials.alertTargetIds)[0]).Split("/")
            $SubId = ($alertTargetIdArray)[2]
            $ResourceGroupName = ($alertTargetIdArray)[4]
            $ResourceType = ($alertTargetIdArray)[6] + "/" + ($alertTargetIdArray)[7]
            $ResourceName = ($alertTargetIdArray)[-1]
            $status = $Essentials.monitorCondition
        }
        elseif ($schemaId -eq "AzureMonitorMetricAlert") {
            # This is the near-real-time Metric Alert schema
            $AlertContext = [object] ($WebhookBody.data).context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq "Microsoft.Insights/activityLogs") {
            # This is the Activity Log Alert schema
            $AlertContext = [object] (($WebhookBody.data).context).activityLog
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = (($AlertContext.resourceId).Split("/"))[-1]
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq $null) {
            # This is the original Metric Alert schema
            $AlertContext = [object] $WebhookBody.context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = $WebhookBody.status
        }
        else {
            # Schema not supported
            Write-Error "The alert data schema - $schemaId - is not supported."
        }
    
        Write-Verbose "status: $status" -Verbose
        if (($status -eq "Activated") -or ($status -eq "Fired"))
        {
            Write-Verbose "resourceType: $ResourceType" -Verbose
            Write-Verbose "resourceName: $ResourceName" -Verbose
            Write-Verbose "resourceGroupName: $ResourceGroupName" -Verbose
            Write-Verbose "subscriptionId: $SubId" -Verbose
    
            # Determine code path depending on the resourceType
            if ($ResourceType -eq "Microsoft.Compute/virtualMachines")
            {
                # This is an Resource Manager VM
                Write-Verbose "This is an Resource Manager VM." -Verbose
    
                # Ensures you do not inherit an AzContext in your runbook
                Disable-AzContextAutosave -Scope Process
    
                # Connect to Azure with system-assigned managed identity
                $AzureContext = (Connect-AzAccount -Identity).context
    
                # set and store context
                $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
    
                # Stop the Resource Manager VM
                Write-Verbose "Stopping the VM - $ResourceName - in resource group - $ResourceGroupName -" -Verbose
                Stop-AzVM -Name $ResourceName -ResourceGroupName $ResourceGroupName -DefaultProfile $AzureContext -Force
                # [OutputType(PSAzureOperationResponse")]
            }
            else {
                # ResourceType not supported
                Write-Error "$ResourceType is not a supported resource type for this runbook."
            }
        }
        else {
            # The alert status was not 'Activated' or 'Fired' so no action taken
            Write-Verbose ("No action taken. Alert status: " + $status) -Verbose
        }
    }
    else {
        # Error
        Write-Error "This runbook is meant to be started from an Azure alert webhook only."
    }
    
  5. 시스템이 할당한 관리 ID를 사용하여 Runbook을 실행하려면 코드를 그대로 둡니다. 사용자가 할당한 관리 ID를 사용하려면 다음을 수행합니다.

    1. 78번째 줄에서 $AzureContext = (Connect-AzAccount -Identity).context를 제거합니다.
    2. $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context로 바꿉니다.
    3. 앞에서 얻은 클라이언트 ID를 입력합니다.
  6. 저장, 게시를 선택한 다음 메시지가 표시되면 를 선택합니다.

  7. Runbook 페이지를 닫고 Automation 계정 페이지로 돌아갑니다.

경고 만들기

경고는 경고에 의해 트리거되는 작업 컬렉션인 작업 그룹을 사용합니다. Runbook은 작업 그룹에서 사용할 수 있는 많은 작업 중 하나일 뿐입니다.

  1. Automation 계정의 모니터링에서 경고를 선택합니다.

  2. + 새 경고 규칙을 선택하여 경고 규칙 만들기 페이지를 엽니다.

    The create alert rule page and subsections.

  3. 범위에서 리소스 편집을 선택합니다.

  4. 리소스 선택 페이지의 리소스 종류별 필터링 드롭다운 목록에서 가상 머신을 선택합니다.

  5. 모니터링하려는 가상 머신 옆의 상자를 선택합니다. 그런 다음 완료를 선택하여 경고 규칙 만들기 페이지로 돌아갑니다.

  6. 조건에서 조건 추가를 선택합니다.

  7. 신호 선택 페이지에서 검색 텍스트 상자에 Percentage CPU를 입력한 다음 결과에서 Percentage CPU를 선택합니다.

  8. 신호 논리 구성 페이지의 임계값 아래에 5와 같이 테스트 목적으로 초기 낮은 값을 입력합니다. 경고가 예상대로 작동하는지 확인한 후 돌아가서 이 값을 업데이트할 수 있습니다. 그런 다음 완료를 선택하여 경고 규칙 만들기 페이지로 돌아갑니다.

    Entering CPU percentage threshold value.

  9. 작업에서 작업 그룹 추가를 선택한 다음 +작업 그룹 만들기를 선택합니다.

    The create action group page with Basics tab open.

  10. 작업 그룹 만들기 페이지에서:

    1. 기본 탭에서 작업 그룹 이름표시 이름을 입력합니다.

    2. 작업 탭의 이름 텍스트 상자에 이름을 입력합니다. 그런 다음 작업 유형 드롭다운 목록에서 Automation Runbook을 선택하여 Runbook 구성 페이지를 엽니다.

      1. Runbook 원본 항목에 대해 사용자를 선택합니다.

      2. 구독 드롭다운 목록에서 구독을 선택합니다.

      3. Automation 계정 드롭다운 목록에서 Automation 계정을 선택합니다.

      4. Runbook 드롭다운 목록에서 Stop-AzureVmInResponsetoVMAlert을 선택합니다.

      5. 일반 경고 스키마 사용 항목에 대해 를 선택합니다.

      6. 확인을 선택하여 작업 그룹 만들기 페이지로 돌아갑니다.

        Configure runbook page with values.

    3. 검토 + 만들기를 선택한 다음 만들기를 선택하여 경고 규칙 만들기 페이지로 돌아갑니다.

  11. 경고 규칙 세부 정보에서 경고 규칙 이름 텍스트 상자

  12. 경고 규칙 만들기를 선택합니다. 만드는 활동 로그 경고근 실시간 경고에서 이 작업 그룹을 사용할 수 있습니다.

확인

VM이 실행 중인지 확인합니다. Runbook Stop-AzureVmInResponsetoVMAlert으로 이동하고 최근 작업 목록이 채워지는지 확인합니다. 완료된 작업이 나타나면 작업을 선택하고 출력을 검토합니다. 또한 VM이 중지되었는지 확인합니다.

Showing output from job.

일반적인 Azure VM 관리 작업

Azure Automation은 Runbook 갤러리에서 VM 다시 시작, VM 중지, VM 삭제, 스케일 업 및 스케일 업 시나리오와 같은 일반적인 Azure VM 관리 작업에 대한 스크립트를 제공합니다. 스크립트는 Azure Automation GitHub 리포지토리에서도 찾을 수 있습니다. 위 단계에서 언급한 대로 이러한 스크립트를 사용할 수도 있습니다.

Azure VM 관리 작업 세부 정보
Stop-Azure-VM-On-Alert 이 Runbook은 Azure 경고 트리거에 대한 응답으로 Azure Resource Manager VM을 중지합니다.

입력은 중지할 VM을 식별하는 데 필요한 정보가 포함된 경고 데이터입니다.

Runbook은 웹후크를 통해 Azure 경고에서 호출해야 합니다.

최신 버전의 Az 모듈을 자동화 계정에 추가해야 합니다.

관리 ID를 사용하도록 설정하고 자동화 계정에 대한 기여자 액세스 권한을 부여해야 합니다.
Restart-Azure-VM-On-Alert 이 Runbook은 Azure 경고 트리거에 대한 응답으로 Azure Resource Manager VM을 중지합니다.

입력은 중지할 VM을 식별하는 데 필요한 정보가 포함된 경고 데이터입니다.

Runbook은 웹후크를 통해 Azure 경고에서 호출해야 합니다.

최신 버전의 Az 모듈을 자동화 계정에 추가해야 합니다.

관리 ID를 사용하도록 설정하고 자동화 계정에 대한 기여자 액세스 권한을 부여해야 합니다.
Delete-Azure-VM-On-Alert 이 Runbook은 Azure 경고 트리거에 대한 응답으로 Azure Resource Manager VM을 중지합니다.

입력은 중지할 VM을 식별하는 데 필요한 정보가 포함된 경고 데이터입니다.

Runbook은 웹후크를 통해 Azure 경고에서 호출해야 합니다.

최신 버전의 Az 모듈을 자동화 계정에 추가해야 합니다.

관리 ID를 사용하도록 설정하고 자동화 계정에 대한 기여자 액세스 권한을 부여해야 합니다.
ScaleDown-Azure-VM-On-Alert 이 Runbook은 Azure 경고 트리거에 대한 응답으로 Azure Resource Manager VM을 중지합니다.

입력은 중지할 VM을 식별하는 데 필요한 정보가 포함된 경고 데이터입니다.

Runbook은 웹후크를 통해 Azure 경고에서 호출해야 합니다.

최신 버전의 Az 모듈을 자동화 계정에 추가해야 합니다.

관리 ID를 사용하도록 설정하고 자동화 계정에 대한 기여자 액세스 권한을 부여해야 합니다.
ScaleUp-Azure-VM-On-Alert 이 Runbook은 Azure 경고 트리거에 대한 응답으로 Azure Resource Manager VM을 중지합니다.

입력은 중지할 VM을 식별하는 데 필요한 정보가 포함된 경고 데이터입니다.

Runbook은 웹후크를 통해 Azure 경고에서 호출해야 합니다.

최신 버전의 Az 모듈을 자동화 계정에 추가해야 합니다.

관리 ID를 사용하도록 설정하고 자동화 계정에 대한 기여자 액세스 권한을 부여해야 합니다.

다음 단계