다음을 통해 공유


Azure Metadata 서비스: Linux VM의 예약된 이벤트

적용 대상: ✔️ Linux VM ✔️ 유연한 확장 집합 ✔️ 균일한 확장 집합

예약된 이벤트는 애플리케이션이 VM(가상 머신) 유지 관리를 준비할 시간을 부여하는 Azure Metadata Service입니다. 향후 유지 관리 이벤트(예: 재부팅)에 대한 정보를 제공하여 애플리케이션이 이에 대비하고 서비스 중단을 제한할 수 있도록 합니다. 이 기능은 Windows와 Linux 모두에서 PaaS 및 IaaS를 포함한 모든 Azure Virtual Machines 유형에 사용할 수 있습니다.

Linux에서 예약된 이벤트에 대한 자세한 내용은 Linux VM에 예약된 이벤트를 참조하세요.

예약된 이벤트는 예정된 이벤트에 대한 사전 알림을 제공합니다. 과거에 발생한 이벤트에 대한 사후 정보는 Azure Resource Graph의 VM 가용성 정보Azure 가상 머신에 대한 가용성 경고 규칙 만들기를 참조하세요.

참고 항목

예약된 이벤트는 모든 Azure 지역에서 일반 공급됩니다. 최신 릴리스 정보는 버전 및 지역 가용성을 참조하세요.

예약된 이벤트를 사용하는 이유는?

많은 애플리케이션에서 VM 유지 관리를 준비하는 시간을 활용할 수 있습니다. 이 시간은 가용성, 안정성 및 서비스 가능성을 향상시키는 다음을 비롯한 특정 애플리케이션 작업을 수행하는 데 사용할 수 있습니다.

  • 검사점 및 복원
  • 연결 드레이닝
  • 주 복제본 장애 조치(failover)
  • 부하 분산 장치 풀에서 제거
  • 이벤트 로깅
  • 정상 종료

예약된 이벤트를 사용하면 애플리케이션에서 유지 관리가 발생하는 시간을 검색하고 이로 인한 영향을 제한하는 작업을 트리거할 수 있습니다.

예약된 이벤트는 다음과 같은 경우에 이벤트를 제공합니다.

기본 사항

메타데이터 서비스는 VM 내에서 액세스할 수 있는 REST 엔드포인트를 사용하여 VM을 실행하는 정보를 공개합니다. 정보는 라우팅할 수 없는 IP를 통해 사용할 수 있으며 VM 외부에 노출되지 않습니다.

범위

예약된 이벤트는 다음으로 전달되며 다음을 통해 승인될 수 있습니다.

전체 가용성 집합의 모든 VM(가상 머신) 또는 가상 머신 확장 집합의 배치 그룹에 대한 예약된 이벤트는 가용성 영역 사용량에 관계없이 동일한 그룹의 다른 모든 VM 또는 집합에 전달됩니다.

따라서 이벤트의 Resources 필드를 확인하여 영향을 받는 VM을 식별합니다.

참고 항목

GPU 가속 가상 머신은 한 개의 장애 도메인(FD = 1) 내에서 확장 집합을 사용하여 영향을 받는 리소스에 대해 예약된 이벤트만 수신합니다. 이벤트는 동일한 배치 그룹의 모든 VM에 브로드캐스트되지 않습니다.

엔드포인트 검색

VNET 사용 VM의 경우 메타데이터 서비스를 정적 경로 조정 불가능 IP 169.254.169.254에서 사용할 수 있습니다. 예약된 이벤트의 최신 버전에 대한 전체 엔드포인트는 다음과 같습니다.

http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01

VM이 클라우드 서비스 및 클래식 VM의 기본 사례인 Virtual Network 내에서 만들어지지 않은 경우 사용할 IP 주소를 검색하려면 다른 논리가 필요합니다. 호스트 엔드포인트를 검색하는 방법을 알아보려면 이 샘플을 참조하세요.

버전 및 지역 가용성

예약된 이벤트 서비스의 버전이 지정됩니다. 버전은 필수이며 현재 버전은 2020-07-01입니다.

버전 릴리스 종류 지역 릴리스 정보
2020-07-01 일반 공급 모두
  • 이벤트 기간에 대한 지원 추가
  • 2019-08-01 일반 공급 모두
  • EventSource에 대한 지원이 추가됨
  • 2019-04-01 일반 공급 모두
  • Event Description에 대한 지원이 추가됨
  • 2019-01-01 일반 공급 모두
  • Virtual Machine Scale Sets EventType ‘Terminate’에 대한 지원이 추가됨
  • 2017-11-01 일반 공급 모두
  • 스폿 VM 제거 EventType ‘Preempt’에 대한 지원이 추가됨
  • 2017-08-01 일반 공급 모두
  • IaaS VM의 리소스 이름에서 앞에 붙은 밑줄이 제거됨
  • 모든 요청에 대해 메타데이터 헤더 요구 사항이 적용됨
  • 2017-03-01 미리 보기를 모두
  • 초기 릴리스
  • 참고 항목

    예약된 이벤트의 이전 미리 보기 릴리스는 api-version으로 {latest}를 지원했습니다. 이 형식은 더 이상 지원되지 않으며 향후 사용되지 않을 예정입니다.

    Scheduled Events 사용 및 사용 안 함

    예약된 이벤트는 이벤트에 대한 요청을 처음 수행하는 서비스에 대해 사용할 수 있습니다. 첫 번째 호출에서는 최대 2분 동안 응답이 지연될 것으로 예상되며 5분 이내에 이벤트 수신이 시작됩니다. 24시간 동안 엔드포인트에 대한 요청을 수행하지 않으면 예약된 이벤트를 서비스에 사용할 수 없습니다.

    사용자 시작 유지 관리

    Azure Portal, API, CLI 또는 PowerShell을 통한 사용자 시작 VM 유지 관리로 인해 예정된 이벤트가 발생합니다. 그러면 애플리케이션에서 유지 관리 준비 논리를 테스트할 수 있으며 애플리케이션에서는 사용자 시작 유지 관리를 준비할 수 있습니다.

    VM을 다시 시작하는 경우 Reboot 형식인 이벤트가 예약됩니다. VM을 다시 배포하는 경우 Redeploy 형식인 이벤트가 예약됩니다. 일반적으로 사용자 이벤트 원본이 있는 이벤트는 사용자가 시작한 작업의 지연을 방지하기 위해 즉시 승인될 수 있습니다. 기본 VM이 응답하지 않는 경우 기본 및 보조 VM이 사용자 생성 예약 이벤트와 통신하고 승인하는 것이 좋습니다. 이벤트를 즉시 승인하면 애플리케이션을 다시 양호한 상태로 복구하는 데 지연이 발생하지 않습니다.

    Virtual Machine Scale Sets 게스트 OS 업그레이드 또는 이미지로 다시 설치에 대한 예약된 이벤트는 메모리 보존 업데이트만을 지원하는 범용 VM 크기에 대해 지원됩니다. G, M, N 및 H 시리즈에서는 작동하지 않습니다. Virtual Machine Scale Sets 게스트 OS 업그레이드 및 이미지로 다시 설치에 대한 예약된 이벤트는 기본적으로 사용하지 않도록 설정됩니다. 지원되는 VM 크기에서 이러한 작업에 예약된 이벤트를 사용하도록 설정하려면 먼저 OSImageNotificationProfile을 사용하여 사용하도록 설정합니다.

    API 사용

    대략적인 개요

    예약된 이벤트, 준비 및 복구를 처리하는 두 가지 주요 구성 요소가 있습니다. VM에 영향을 미치는 모든 현재 예약된 이벤트는 IMDS Scheduled Events 엔드포인트를 통해 읽을 수 있습니다. 이벤트가 터미널 상태에 도달하면 이벤트 목록에서 제거됩니다. 다음 다이어그램에서는 예약된 단일 이벤트에 발생할 수 있는 다양한 상태 전환을 보여줍니다.

    예약된 이벤트가 수행할 수 있는 다양한 전환을 보여주는 상태 다이어그램.

    EventStatus:"예약됨" 상태의 이벤트의 경우 워크로드를 준비하는 단계를 수행해야 합니다. 준비가 완료되면 예약된 이벤트 API를 사용하여 이벤트를 승인해야 합니다. 그러지 않으면 NotBefore 시간에 도달하면 이벤트가 자동으로 승인됩니다. VM이 공유 인프라에 있는 경우, 시스템은 동일한 하드웨어의 다른 모든 테넌트가 작업 또는 시간 제한도 승인할 때까지 기다립니다. 영향을 받은 모든 VM에서 승인을 수집하거나 NotBefore 시간에 도달하면 Azure는 EventStatus:"Started"를 사용하여 예약된 새 이벤트 페이로드를 생성하고 유지 관리 이벤트의 시작을 트리거합니다. 이벤트가 터미널 상태에 도달하면 이벤트 목록에서 제거됩니다. 이는 고객이 VM을 복구하는 신호 역할을 합니다.

    psudeo 코드는 애플리케이션에서 예약된 이벤트를 읽고 관리하는 방법에 대한 프로세스를 보여 줍니다.

    current_list_of_scheduled_events = get_latest_from_se_endpoint()
    #prepare for new events
    for each event in current_list_of_scheduled_events:
      if event not in previous_list_of_scheduled_events:
        prepare_for_event(event)
    #recover from completed events
    for each event in previous_list_of_scheduled_events:
      if event not in current_list_of_scheduled_events:
        receover_from_event(event)
    #prepare for future jobs
    previous_list_of_scheduled_events = current_list_of_scheduled_events
    

    예약된 이벤트는 흔히 고가용성 요구 사항이 있는 애플리케이션에 사용되기 때문에 고려해야 할 몇 가지 예외적인 사례가 있습니다.

    1. 예약된 이벤트가 완료되고 배열에서 제거되면 다른 EventStatus:"Scheduled(예약됨)" 이벤트를 비롯한 새 이벤트가 없을 경우 더 이상 영향을 주지 않습니다.
    2. Azure는 전체 집합에 걸쳐 유지 관리 작업을 모니터링하며, 드문 경우지만 유지 관리 작업이 적용하기에 너무 높은 위험이 있는지 판단합니다. 이 경우 예약된 이벤트가 "예약됨"에서 이벤트 배열에서 제거됨으로 직접 이동합니다.
    3. 하드웨어 오류가 있는 경우 Azure는 "예약됨" 상태를 무시하고 EventStatus:"Started" 상태로 즉시 이동합니다.
    4. 이벤트가 여전히 EventStatus:“Started(시작됨)” 상태인 동안 예약된 이벤트에 보급된 기간보다 짧은 기간에 다른 영향이 있을 수 있습니다.

    Azure 가용성 보장의 일환으로 다른 장애 도메인의 VM은 일상적인 유지 관리 작업의 영향을 동시에 받지 않습니다. 그러나 작업들이 하나씩 차례대로 직렬화될 수 있습니다. 한 장애 도메인의 VM은 다른 장애 도메인의 유지 관리가 완료된 직후 EventStatus:"Scheduled"를 사용하여 예약된 이벤트를 받을 수 있습니다. 선택한 아키텍처에 관계없이 항상 VM에 대해 보류 중인 새 이벤트를 계속 확인합니다.

    이벤트의 정확한 타이밍은 다양하지만 다음 다이어그램은 일반적인 유지 관리 작업이 진행되는 방식에 대한 대략적인 지침을 제공합니다.

    • EventStatus:"예약됨"에서 승인 시간 제한까지: 15분
    • 영향 기간: 7초
    • EventStatus:"Started"에서 Completed까지(이벤트 배열에서 제거된 이벤트): 10분

    예약된 이벤트의 흐름을 보여주는 타임라인 다이어그램.

    VM 가용성에 영향을 미치는 모든 작업은 예약된 이벤트를 생성합니다. 그러나 모든 예약된 이벤트가 Azure 활동 로그 또는 Resource Health와 같은 다른 Azure 화면에 표시되지는 않습니다. 예약된 이벤트를 정기적으로 확인하면 VM에 미치는 영향에 대한 가장 up-to날짜 정보가 있는지 확인합니다.

    머리글

    메타데이터 서비스를 쿼리할 때 요청이 실수로 리디렉션되지 않도록 Metadata:true 헤더를 제공해야 합니다. Metadata:true 헤더는 모든 예약된 이벤트 요청에 필요합니다. 헤더를 요청에 포함하지 않으면 메타데이터 서비스에서 "잘못된 요청" 응답이 발생합니다.

    이벤트 쿼리

    다음과 같이 호출하여 예약된 이벤트를 쿼리할 수 있습니다.

    Bash 샘플

    curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    PowerShell 샘플

    Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01" | ConvertTo-Json -Depth 64
    

    Python 샘플

    import json
    import requests
    
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    header = {'Metadata' : 'true'}
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    

    응답에는 예약된 이벤트의 배열이 포함됩니다. 빈 배열은 현재 예약된 이벤트가 없음을 의미합니다. 예약된 이벤트가 있는 경우 응답에 다음과 같은 이벤트의 배열이 포함됩니다.

    {
        "DocumentIncarnation": {IncarnationID},
        "Events": [
            {
                "EventId": {eventID},
                "EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
                "ResourceType": "VirtualMachine",
                "Resources": [{resourceName}],
                "EventStatus": "Scheduled" | "Started",
                "NotBefore": {timeInUTC},       
                "Description": {eventDescription},
                "EventSource" : "Platform" | "User",
                "DurationInSeconds" : {timeInSeconds},
            }
        ]
    }
    

    이벤트 속성

    재산 설명
    문서 화신 이벤트 배열이 변경되면 증가하는 정수입니다. 화신이 동일한 문서에는 동일한 이벤트 정보가 포함되며 이벤트가 변경되면 화신이 증가합니다.
    EventId 이 이벤트의 GUID(Globally Unique Identifier)입니다.

    예:
    • 602d9444-d2cd-49c7-8624-8643e7171297
    이벤트 유형 이 이벤트로 인해 예상되는 영향입니다.


    • Freeze: 가상 머신이 몇 초 동안 일시 중지되도록 예약됩니다. CPU와 네트워크 연결이 일시 중단될 수 있지만 메모리나 열려 있는 파일에는 영향을 미치지 않습니다.
    • Reboot: Virtual Machine을 다시 부팅하도록 예약합니다(비영구 메모리가 손실됨). 드문 경우: EventType:"Reboot(재부팅)"에 예약된 VM은 재부팅 대신 동결 이벤트가 발생할 수 있습니다. 이벤트가 완료되고 워크로드를 복원해도 안전한지 확인하려면 위의 지침을 따르세요.
    • Redeploy: Virtual Machine을 다른 노드로 이동하도록 예약합니다(임시 디스크가 손실됨).
    • Preempt: 스폿 가상 머신을 삭제하고 있습니다(임시 디스크가 손실됨). 이 이벤트는 최선을 다해 제공됩니다.
    • Terminate: 가상 머신을 삭제하도록 예약합니다.
    리소스 유형 이 이벤트가 영향을 주는 리소스 형식입니다.

    • VirtualMachine
    리소스 이 이벤트가 영향을 주는 리소스 목록입니다.

    예:
    • ["FrontEnd_IN_0", "BackEnd_IN_0"]
    이벤트 상태 이 이벤트의 상태입니다.

    • Scheduled: NotBefore 속성에 지정된 시간 이후 시작하도록 이 이벤트를 예약합니다.
    • Started: 이 이벤트가 시작되었습니다.
    Completed 또는 유사한 상태가 제공되지 않았습니다. 이벤트가 완료되면 더 이상 반환되지 않습니다.
    NotBefore 이 시간이 지난 후 이 이벤트가 시작될 수 있습니다. 이 이벤트는 이 시간 전에 시작되지 않도록 보장됩니다. 이벤트가 시작된 후에 발생하는 경우 빈칸으로 남습니다.

    예:
    • 2016년 9월 19일 월요일 18:29:47 GMT
    설명 이 이벤트에 대한 설명.

    예:
    • 호스트 서버가 유지 관리 중입니다.
    • 호스트 서버 인프라는 유지 관리를 진행 중입니다.
    • 메모리 유지 라이브 마이그레이션 작업으로 인해 가상 머신이 일시 중지되고 있습니다.
    • 권한 있는 사용자의 요청에 따라 가상 머신이 다시 시작됩니다.
    • 호스트 서버가 긴급 복구를 진행 중입니다.
    이벤트소스 (EventSource) 이벤트의 개시 장치입니다.

    예:
    • Platform: 플랫폼에서 이 이벤트를 시작했습니다.
    • User: 사용자가 이 이벤트를 시작했습니다.
    초 단위 지속시간 이벤트로 인한 중단의 예상 기간입니다. 영향 기간 동안 더 짧은 기간의 보조 영향이 있을 수 있습니다.

    예:
    • 9: 이벤트로 인한 중단은 9초 동안 지속됩니다.
    • 0: 이벤트가 VM을 중단하거나 가용성에 영향을 주지 않습니다(예: 네트워크 업데이트).
    • -1: 영향 지속 시간을 알 수 없거나 적용할 수 없는 경우 사용되는 기본값입니다.

    이벤트 예약

    각 이벤트는 이벤트 유형에 따라 향후 최소한의 시간으로 예약됩니다. 이 시간은 이벤트의 NotBefore 속성에 반영됩니다.

    이벤트 유형 최소 공지
    중지 15분
    재부팅 15분
    재배포 10분
    선점 30초
    끝내다 사용자 구성 가능: 5~15분

    즉, 이벤트가 발생하기 전에 최소 알림 시간까지 이벤트의 향후 일정을 검색할 수 있습니다. 이벤트가 예약되면 승인되거나 Started 시간이 경과한 후 NotBefore 상태로 이동합니다. 그러나 드문 경우이지만 Azure에서 작업을 시작하기 전에 취소합니다. 이 경우 이벤트가 이벤트 배열에서 제거되고 이전에 예약된 대로 영향이 발생하지 않습니다.

    참고 항목

    경우에 따라 Azure는 하드웨어 저하로 인한 호스트 오류를 예측할 수 있으며 마이그레이션을 예약하여 서비스 중단을 완화하려고 시도합니다. 영향을 받는 가상 머신은 NotBefore(일반적으로 며칠 후)로 예약된 이벤트를 수신합니다. 실제 시간은 예상 오류 위험 평가에 따라 다릅니다. Azure는 가능한 경우 7일 전에 미리 알림을 제공하려고 합니다. 하드웨어가 곧 실패할 가능성이 높은 경우 실제 통지 시간은 다양하며 더 짧을 수 있습니다. 시스템이 마이그레이션을 시작하기 전에 하드웨어에 장애가 발생하는 경우 서비스 위험을 최소화하기 위해 가능한 한 빨리 가상 머신을 자체 재배포하는 것이 좋습니다.

    참고 항목

    호스트 노드에서 하드웨어 오류가 발생하는 경우 Azure는 최소 알림 기간을 우회하고 영향을 받는 가상 머신에 대한 복구 프로세스를 즉시 시작합니다. 이렇게 하면 영향을 받는 VM이 응답할 수 없는 경우 복구 시간이 단축됩니다. 복구 프로세스 중에 영향을 받은 모든 VM에 대한 이벤트가 EventType = RebootEventStatus = Started으로 생성됩니다.

    폴링 주기

    원하는 빈도로 업데이트를 위해 엔드포인트를 폴링할 수 있습니다. 그러나 요청 간의 시간이 길수록 예정된 이벤트에 반응하는 데 더 많은 시간이 소요될 수 있습니다. 대부분의 이벤트는 5분에서 15분 정도의 사전 알림이 있지만, 어떤 경우에는 사전 알림이 30초 정도로 짧을 수도 있습니다. 완화 작업을 수행할 수 있는 시간을 충분히 확보하기 위해서, 1초에 한 번 서비스를 폴링하는 것이 좋습니다.

    이벤트 시작

    예정된 이벤트에 대해 알게 되고 정상 종료를 위한 논리를 완료한 후에 POST로 메타데이터 서비스에 대한 EventId 호출을 실행하여 처리 중인 이벤트를 승인할 수 있습니다. 이 호출은 가능한 경우 Azure에 최소 알림 시간을 단축할 수 있음을 나타냅니다. 승인 즉시 이벤트가 시작되지 않을 수 있습니다. 경우에 따라 Azure는 이벤트를 진행하기 전에 노드에서 호스트되는 모든 VM의 승인을 받아야 합니다.

    다음과 같은 JSON 샘플은 POST 요청 본문에 필요합니다. 요청에 StartRequests 목록이 포함되어야 합니다. 각 StartRequest는 빠르게 처리할 이벤트의 EventId를 포함합니다.

    {
    	"StartRequests" : [
    		{
    			"EventId": {EventId}
    		}
    	]
    }
    

    서비스는 다른 VM이 이미 이벤트를 승인한 경우에도 유효한 이벤트 ID가 전달되는 경우 항상 200 성공 코드를 반환합니다. 400 오류 코드는 요청 헤더 또는 페이로드의 형식이 잘못되었음을 나타냅니다.

    참고 항목

    이벤트는 POST 메시지 또는 NotBefore 시간이 경과하여 승인되지 않는 한 진행되지 않습니다. 여기에는 Azure Portal의 VM 다시 시작과 같이 사용자가 트리거한 이벤트가 포함됩니다.

    Bash 샘플

    curl -H Metadata:true -X POST -d '{"StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    PowerShell 샘플

    Invoke-RestMethod -Headers @{"Metadata" = "true"} -Method POST -body '{"StartRequests": [{"EventId": "5DD55B64-45AD-49D3-BBC9-F57D4EA97BD7"}]}' -Uri http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01 | ConvertTo-Json -Depth 64
    

    Python 샘플

    import json
    import requests
    
    def confirm_scheduled_event(event_id):  
       # This payload confirms a single event with id event_id
       payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
       response = requests.post("http://169.254.169.254/metadata/scheduledevents", 
                                headers =  {'Metadata' : 'true'}, 
                                params = {'api-version':'2020-07-01'}, 
                                data = payload)    
       return response.status_code
    

    참고 항목

    이벤트를 승인하면 해당 이벤트를 승인한 VM뿐만 아니라 이벤트의 모든 Resources에 대해 이벤트가 진행됩니다. 따라서 승인을 조정하는 리더를 선택하도록 선택할 수 있습니다. 이는 필드의 첫 번째 컴퓨터 Resources 처럼 간단할 수 있습니다.

    예제 응답

    다음 이벤트는 라이브 상태인 두 VM에서 다른 노드로 마이그레이션되는 예제입니다.

    DocumentIncarnation은(는) Events에 새 정보가 있을 때마다 변경됩니다. 이벤트의 승인을 통해 WestNO_0 및 WestNO_1 모두 동결을 진행할 수 있습니다.

    {
        "DocumentIncarnation":  1,
        "Events":  [
                   ]
    }
    
    {
        "DocumentIncarnation":  2,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Scheduled",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "Mon, 11 Apr 2022 22:26:58 GMT",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  3,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Started",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  4,
        "Events":  [
                   ]
    }
    
    

    Python 샘플

    샘플은 예약된 이벤트에 대한 메타데이터 서비스를 쿼리하고 각 미해결 이벤트를 승인합니다. vm-scheduled-events-mock-server 리포지토리의 Listener.py 파일에서 코드를 찾을 수 있습니다.

    #!/usr/bin/python
    import json
    import requests
    from time import sleep
    
    # The URL to access the metadata service
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    # This must be sent otherwise the request will be ignored
    header = {'Metadata' : 'true'}
    # Current version of the API
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    def confirm_scheduled_event(event_id):  
        # This payload confirms a single event with id event_id
        # You can confirm multiple events in a single request if needed      
        payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
        response = requests.post(metadata_url, 
                                headers= header,
                                params = query_params, 
                                data = payload)    
        return response.status_code
    
    def log(event): 
        # This is an optional placeholder for logging events to your system 
        print(event["Description"])
        return
    
    def advanced_sample(last_document_incarnation): 
        # Poll every second to see if there are new scheduled events to process
        # Since some events may have necessarily short warning periods, it is 
        # recommended to poll frequently
        found_document_incarnation = last_document_incarnation
        while (last_document_incarnation == found_document_incarnation):
            sleep(1)
            payload = get_scheduled_events()    
            found_document_incarnation = payload["DocumentIncarnation"]        
            
        # We recommend processing all events in a document together, 
        # even if you won't be actioning on them right away
        for event in payload["Events"]:
    
            # Events that already started, logged for tracking
            if (event["EventStatus"] == "Started"):
                log(event)
                
            # Approve all user initiated events. These are typically created by an 
            # administrator and approving them immediately can help to avoid delays 
            # in admin actions
            elif (event["EventSource"] == "User"):
                confirm_scheduled_event(event["EventId"])            
                
            # For this application, freeze events less that 9 seconds are considered
            # no impact. This will immediately approve them
            elif (event["EventType"] == "Freeze" and 
                int(event["DurationInSeconds"]) >= 0  and 
                int(event["DurationInSeconds"]) < 9):
                confirm_scheduled_event(event["EventId"])
                
            # Events that may be impactful (for example reboot or redeploy) may need custom 
            # handling for your application
            else: 
                #TODO Custom handling for impactful events
                log(event)
        print("Processed events from document: " + str(found_document_incarnation))
        return found_document_incarnation
    
    def main():
        # This will track the last set of events seen 
        last_document_incarnation = "-1"
    
        input_text = "\
            Press 1 to poll for new events \n\
            Press 2 to exit \n "
        program_exit = False 
    
        while program_exit == False:
            user_input = input(input_text)    
            if (user_input == "1"):                        
                last_document_incarnation = advanced_sample(last_document_incarnation)
            elif (user_input == "2"):
                program_exit = True       
    
    if __name__ == '__main__':
        main()
    

    예약된 이벤트 테스트

    예약된 이벤트에 대한 애플리케이션 응답을 테스트하는 두 가지 일반적인 방법은 사용자 모방 이벤트를 수동으로 트리거하거나 모의 서버를 사용하는 것입니다.

    VM 블레이드에서 '다시 부팅' 또는 '다시 배포' VM 옵션을 선택하여 Azure Portal 또는 Azure CLI를 통해 수동으로 재배포 및 다시 부팅 이벤트를 트리거할 수 있습니다. 그러면 이벤트가 만들어지고 워크로드로 전송됩니다.

    호스트 업데이트와 같은 여러 VM에 영향을 주는 작업은 요청 시 트리거할 수 없으므로 모의 서버를 대신 사용할 수 있습니다. vm-scheduled-events-mock-server는 개발 및 테스트를 위해 실제 이벤트 흐름을 재생하여 다양한 시나리오에 대한 애플리케이션의 응답을 테스트하기 위한 프레임워크를 제공합니다. 기본적으로 서버는 Azure에서 실행되고 가장 일반적인 사례를 나타내는 VM에서 캡처된 9가지 시나리오를 지원합니다. 애플리케이션의 특정 특성에 따라 더 많은 옵션을 포함하도록 시나리오를 확장할 수 있습니다.

    다음 단계