다음을 통해 공유


자습서: Azure Functions를 사용하여 사전 및 사후 이벤트(미리 보기) 만들기

적용 대상: ✔️ Windows VM ✔️ Linux VM ✔️ 온-프레미스 환경 ✔️ Azure VM ✔️ Azure Arc 지원 서버.

이 자습서에서는 Azure Functions를 사용하여 패치 예약 워크플로에서 VM을 시작 및 중지하기 위한 사전 및 사후 이벤트를 만드는 방법을 설명합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 필수 조건
  • 함수 앱 만들기
  • 함수 만들기
  • 이벤트 구독 만들기

필수 조건

  1. PowerShell 7.2 Runbook을 사용하고 있는지 확인합니다.

  2. 관리 ID에 권한 할당 - 적절한 관리 ID에 권한을 할당할 수 있습니다. Runbook은 Automation 계정의 시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID를 사용할 수 있습니다.

    포털 또는 PowerShell cmdlet을 사용하여 각 ID에 권한을 할당할 수 있습니다.

    권한을 할당하려면 Azure Portal을 사용하여 Azure 역할 할당의 단계를 따릅니다.


  1. Az.ResourceGraph 모듈을 가져오고 모듈이 모듈 버전 2.0.3을 사용하여 ThreadJob으로 업데이트되었는지 확인합니다.

함수 앱 만들기

  1. 함수 앱 만들기 단계를 따릅니다.

  2. 함수 앱을 만든 후 리소스로 이동하고 다음 단계에 따라 종속성을 로드하는지 확인합니다.

    참고 항목

    처음으로 종속성을 로드해야 합니다.

    1. 함수 앱에서 앱 파일을 선택합니다.

    2. host.json에서 ManagedDependecyTrue로 설정하고 requirments.psd1을 선택합니다.

    3. requirements.psd1 아래에 다음 코드를 붙여넣습니다.

       @{
       'Az'='5.*' 
       'Az.ResourceGraph'='0.13.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. 저장을 선택합니다.

  3. 개요 탭에서 함수 앱을 다시 시작하여 requirments.psd1 파일에 작성된 종속성을 로드합니다.

함수 만들기

  1. 함수 앱을 만든 후 리소스로 이동하고 개요에서 Azure Portal에서 만들기를 선택합니다.

  2. 함수 만들기 창에서 다음을 선택합니다.

    1. 개발 환경 속성에서 포털에서 개발을 선택합니다.
    2. 템플릿 선택에서 Event Grid를 선택합니다.
    3. 템플릿 세부 정보에서 새 함수에 이름을 입력한 다음 만들기를 선택합니다. 함수를 만드는 동안 선택할 수 있는 옵션을 보여 주는 스크린샷.
  3. 이벤트 그리드 함수의 왼쪽 메뉴에서 코드+테스트를 선택하고 다음 코드를 붙여넣은 후 저장을 선택합니다.

    # Make sure that we are using eventGridEvent for parameter binding in Azure function.
    param($eventGridEvent, $TriggerMetadata)
    
    Connect-AzAccount -Identity
    
    # Install the Resource Graph module from PowerShell Gallery
    # Install-Module -Name Az.ResourceGraph
    
    $maintenanceRunId = $eventGridEvent.data.CorrelationId
    $resourceSubscriptionIds = $eventGridEvent.data.ResourceSubscriptionIds
    
    if ($resourceSubscriptionIds.Count -eq 0) {
        Write-Output "Resource subscriptions are not present."
        break
    }
    
    Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]"
    
    $argQuery = @"
        maintenanceresources 
        | where type =~ 'microsoft.maintenance/applyupdates'
        | where properties.correlationId =~ '$($maintenanceRunId)'
        | where id has '/providers/microsoft.compute/virtualmachines/'
        | project id, resourceId = tostring(properties.resourceId)
        | order by id asc
    "@
    
    Write-Output "Arg Query Used: $argQuery"
    
    $allMachines = [System.Collections.ArrayList]@()
    $skipToken = $null
    
    do
    {
        $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds
        $skipToken = $res.SkipToken
        $allMachines.AddRange($res.Data)
    } while ($skipToken -ne $null -and $skipToken.Length -ne 0)
    if ($allMachines.Count -eq 0) {
        Write-Output "No Machines were found."
        break
    }
    
    $jobIDs= New-Object System.Collections.Generic.List[System.Object]
    $startableStates = "stopped" , "stopping", "deallocated", "deallocating"
    
    $allMachines | ForEach-Object {
        $vmId =  $_.resourceId
    
        $split = $vmId -split "/";
        $subscriptionId = $split[2]; 
        $rg = $split[4];
        $name = $split[8];
    
        Write-Output ("Subscription Id: " + $subscriptionId)
    
        $mute = Set-AzContext -Subscription $subscriptionId
        $vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute
    
        $state = ($vm.Statuses[1].DisplayStatus -split " ")[1]
        if($state -in $startableStates) {
            Write-Output "Starting '$($name)' ..."
    
            $newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId
            $jobIDs.Add($newJob.Id)
        } else {
            Write-Output ($name + ": no action taken. State: " + $state) 
        }
    }
    
    $jobsList = $jobIDs.ToArray()
    if ($jobsList)
    {
        Write-Output "Waiting for machines to finish starting..."
        Wait-Job -Id $jobsList
    }
    
    foreach($id in $jobsList)
    {
        $job = Get-Job -Id $id
        if ($job.Error)
        {
            Write-Output $job.Error
        }
    }
    
  4. 왼쪽 메뉴에서 통합을 선택하고 트리거에서 이벤트 트리거 매개 변수 이름을 편집합니다. 코드+테스트 창에 제공된 것과 동일한 매개 변수 이름을 사용합니다. 이 예에서 매개 변수는 eventGridEvent입니다.

    eventGridEvent 매개 변수를 보여 주는 스크린샷.

  5. 저장을 선택합니다.

이벤트 구독 만들기

  1. Azure Portal에 로그인하고 Azure 업데이트 관리자로 이동합니다.
  2. 관리에서 컴퓨터, 유지 관리 구성을 선택합니다.
  3. 유지 관리 구성 페이지에서 구성을 선택합니다.
  4. 설정에서 이벤트를 선택합니다.
  5. 사전/사후 유지 관리 이벤트를 만들려면 +이벤트 구독을 선택합니다.
  6. 이벤트 구독 만들기 페이지에서 다음 세부 정보를 입력합니다.
    1. 이벤트 구독 세부 정보 섹션에 적절한 이름을 입력합니다.
    2. 스키마를 Event Grid 스키마로 유지합니다.
    3. 이벤트 유형 섹션에서 이벤트 유형으로 필터링합니다.
      1. 사전 이벤트를 보려면 사전 유지 관리 이벤트를 선택합니다.
        • 엔드포인트 세부 정보 섹션에서 Azure Function 엔드포인트를 선택하고 구성 및 엔드포인트를 선택합니다.
        • 이벤트를 트리거하려면 리소스 그룹, 함수 앱과 같은 적절한 세부 정보를 제공합니다.
      2. 사후 이벤트를 보려면 사후 유지 관리 이벤트를 선택합니다.
        • 엔드포인트 세부 정보 섹션에서 Azure Function 엔드포인트를 선택하고 구성 및 엔드포인트를 선택합니다.
        • 이벤트를 트리거하려면 리소스 그룹, 함수 앱과 같은 적절한 세부 정보를 제공합니다.
  7. 만들기를 실행합니다.

Azure Storage 계정과 이벤트 허브를 사용하여 이벤트를 저장하고 보내고 받을 수도 있습니다. 이벤트 허브를 만드는 방법스토리지 큐에 대해 자세히 알아봅니다.

다음 단계