비용 절감의 유혹과 그에 따른 위험
Preemptible VM은 일반 온디맨드 인스턴스 대비 최대 91%까지 저렴한 비용으로 클라우드의 미사용 컴퓨팅 자원을 활용할 수 있는 강력한 옵션이다. GCP에서는 Preemptible VM, AWS에서는 Spot Instance로 불리며, 대규모 배치 처리, 머신러닝 학습, CI/CD 파이프라인 등에서 비용 효율성을 극대화하는 데 널리 사용된다. 그러나 이 저렴한 가격의 대가로, 해당 인스턴스는 언제든지 클라우드 제공업체에 의해 예고 없이 강제 종료될 수 있다는 중대한 제약을 갖는다.
많은 사용자가 “내 애플리케이션이 높은 부하를 일으켜서 종료된 것인가?”라고 오해하지만, 실제로는 인스턴스의 CPU 사용량이나 메모리 소모와는 무관하다. 종료 결정은 전적으로 클라우드 제공업체의 내부 자원 수요와 공급 상황에 의해 좌우된다. 따라서 Preemptible VM을 사용할 때는 단순히 비용 절감만을 고려할 것이 아니라, 종료 가능성을 전제로 한 철저한 아키텍처 설계와 운영 전략이 필수적이다.
이 가이드는 Preemptible VM의 강제 종료 원리를 명확히 분석하고, 종료 알림을 감지하는 기술적 방법, 안전하게 종료를 처리하는 자동화 스크립트, 그리고 장기적인 안정성과 가용성을 확보하기 위한 실무 전략까지 체계적으로 다룬다. 검색어: Preemptible VM 종료 원인, 선점형 인스턴스 안전 사용법, GCP Preemption Notice, AWS Spot Instance Graceful Shutdown.
Preemptible VM이 예고 없이 종료되는 이유와 기술적 대응
1. 강제 종료(Preemption)의 근본 원인
Preemptible VM의 강제 종료는 사용자의 애플리케이션 상태와는 무관하며, 클라우드 제공업체의 자원 관리 정책에 따라 발생한다. 주요 원인은 다음과 같다.
첫째, 자원 회수다. 특정 리전이나 가용 영역에서 온디맨드 인스턴스 또는 예약 인스턴스의 수요가 급증하면, 클라우드 제공업체는 Preemptible VM을 실행 중이던 물리적 자원을 회수하여 더 높은 우선순위의 워크로드에 재할당한다. 이는 전체 발생 사례의 약 85%를 차지하는 가장 흔한 원인이다.
둘째, 최대 실행 시간 제한이다. GCP의 경우 Preemptible VM은 정책상 최대 24시간까지만 실행 가능하며, 이 시간이 경과하면 자원 수요와 관계없이 자동으로 종료된다. 반면 AWS Spot Instance는 이러한 시간 제한이 없어 장기 실행이 가능하다.
셋째, 내부 시스템 유지보수다. 드물지만 클라우드 인프라의 계획된 패치, 하드웨어 교체, 소프트웨어 업데이트 등의 이유로 해당 VM이 위치한 호스트가 오프라인되면 함께 종료될 수 있다.
결론적으로, Preemptible VM의 수명은 사용자가 통제할 수 없으며, 종료 시점 예측도 불가능하다. 따라서 운영 전략은 “언제 종료되더라도 시스템이 정상적으로 복구되고 데이터가 보존되는가”에 초점을 맞춰야 한다.
2. 종료 알림 감지 메커니즘
다행히도 클라우드 제공업체는 완전한 예고 없는 종료를 방지하기 위해 사전 경고 메커니즘을 제공한다. 이를 활용하면 제한된 시간 내에 작업을 안전하게 마무리할 수 있다.
GCP의 경우, VM 종료 30초 전에 인스턴스의 메타데이터 서버에 특정 속성이 변경된다. 해당 속성은 http://metadata.google.internal/computeMetadata/v1/instance/preempted이며, 값이 TRUE로 전환되면 종료가 임박했음을 의미한다. 이 알림은 단 한 번만 발생하므로, 애플리케이션은 주기적으로 이 값을 폴링하여 변경을 감지해야 한다.
AWS는 약간 다른 방식을 사용한다. Spot Instance의 경우 종료 2분 전에 “Interruption Warning” 이벤트가 발생하고, 30초 전에는 “Termination Notice”가 전달된다. 이를 감지하려면 CloudWatch Events 또는 EventBridge를 통해 해당 이벤트를 구독하고, 실시간으로 처리 로직을 트리거해야 한다.
이처럼 GCP는 메타데이터 폴링 방식, AWS는 이벤트 기반 알림 방식을 제공하므로, 사용 중인 플랫폼에 맞는 감지 로직을 반드시 구현해야 한다.
3. Graceful Shutdown 자동화 스크립트
종료 알림을 감지했다면, 남은 짧은 시간(30초 또는 2분) 안에 진행 중인 작업을 중단하고 데이터를 안전하게 저장하는 절차가 필요하다. 이를 자동화하는 것이 Graceful Shutdown의 핵심이다.
다음은 GCP 환경에서 Python으로 작성된 종료 감지 및 처리 스크립트의 전체 흐름이다. 이 스크립트는 백그라운드에서 지속적으로 실행되며, 15초 간격으로 메타데이터를 확인한다.
스크립트는 먼저 메타데이터 서버에 요청을 보내 preempted 속성 값을 조회한다. 값이 TRUE로 변경되면 즉시 종료 절차를 시작한다. 첫 번째 단계는 실행 중인 애플리케이션 서비스를 정지시키는 것이다. systemctl stop 명령어를 통해 서비스를 안전하게 종료한다.
두 번째 단계는 처리 중인 데이터를 영구 스토리지로 백업하는 것이다. 로컬 디스크는 VM 종료와 함께 소멸되므로, 반드시 Persistent Disk 또는 Cloud Storage로 데이터를 이동해야 한다. 이를 위한 별도의 백업 스크립트를 호출한다.
마지막으로 모든 정리 작업이 완료되었음을 로그로 남기고, 시스템이 자동 종료될 때까지 대기한다. 이 모든 과정은 30초 이내에 완료되어야 하며, 타임아웃 처리를 통해 스크립트 자체가 블로킹되지 않도록 설계해야 한다.
AWS 환경에서도 유사한 로직을 적용할 수 있으며, Spot Instance 종료 이벤트 발생 시 Lambda 또는 사용자 데이터 스크립트를 통해 동일한 절차를 실행한다.
Preemptible VM을 안전하게 운영하기 위한 5대 실무 전략
1. 작업 분할과 상태 비저장 설계
대용량 작업을 작은 단위로 나누어 처리하면, 하나의 VM이 종료되더라도 손실이 최소화된다. 예를 들어, 10시간 분량의 데이터를 처리하는 대신 5분 단위의 태스크로 분할하고, 작업 큐(SQS, Cloud Tasks)를 통해 관리한다. 각 태스크는 독립적이며, 실패 시 다른 인스턴스가 재시도할 수 있도록 설계한다.
2. 관리형 인스턴스 그룹과 자동 복구
GCP의 Managed Instance Group(MIG) 또는 AWS의 Auto Scaling Group(ASG)을 활용하면, Preemptible VM이 종료되더라도 그룹이 자동으로 새로운 인스턴스를 프로비저닝한다. Auto Healing 기능을 활성화하면 헬스 체크 실패 시 즉시 복구가 이루어져 서비스 연속성을 보장한다.
3. 영구 스토리지 필수 사용
로컬 SSD는 고성능이지만 VM 종료 시 데이터가 영구적으로 삭제된다. 따라서 모든 상태 정보, 중간 결과, 로그는 Persistent Disk, EBS, Cloud Storage와 같은 영구 스토리지에 저장해야 한다. 새로운 인스턴스가 시작되면 최신 상태를 즉시 복구할 수 있다.
4. 용도 제한과 워크로드 분리
Preemptible VM은 배치 처리, 개발/테스트 환경, 대규모 병렬 컴퓨팅과 같은 비상태적이고 재시도 가능한 작업에만 사용해야 한다. 반면, 데이터베이스 마스터, 세션 관리 서버, 실시간 API와 같은 상태 의존적이고 고가용성이 요구되는 서비스에는 절대 사용해서는 안 된다.
5. 모니터링, 알람, 비용 추적 체계 구축
CloudWatch 또는 Cloud Monitoring을 통해 종료 이벤트를 실시간으로 감지하고, Slack 또는 이메일로 알림을 전송한다. 또한 Cost Explorer에서 Preemptible VM 사용량을 태그 기반으로 추적하여 예상치 못한 비용 증가를 조기에 탐지한다.
위험을 기회로 전환하는 운영 철학
Preemptible VM은 비용 절감의 강력한 도구이지만, 그 불안정성은 운영 복잡성을 증가시킨다. 그러나 종료 알림 감지, Graceful Shutdown 자동화, 분산 아키텍처 설계를 통해 이러한 위험을 체계적으로 관리할 수 있다. 결과적으로 월간 컴퓨팅 비용을 90% 이상 절감하면서도 99.9% 수준의 가용성을 달성하는 것이 충분히 가능하다.
실무에서는 “종료는 피할 수 없다”는 전제를 받아들이고, “종료되더라도 시스템은 스스로 회복한다”는 원칙을 모든 설계와 운영 프로세스에 내재화해야 한다. 이 가이드에 제시된 스크립트와 전략을 기반으로 Preemptible VM을 도입하면, 비용 효율성과 안정성을 동시에 확보할 수 있는 이상적인 클라우드 운영 환경을 구축할 수 있을 것이다.
Disclaimer: 본 블로그의 정보는 개인의 단순 참고 및 기록용으로 작성된 것이며, 개인적인 조사와 생각을 담은 내용이기에 오류가 있거나 편향된 내용이 있을 수 있습니다.