본문 바로가기
카테고리 없음

고가용성과 스팟 인스턴스를 동시에 잡는 전략: EC2 Auto Scaling + Lifecycle Hook + 스팟 복구 시나리오 완전 설계

by frontier12 2025. 5. 28.





1. 배경: 스팟 인스턴스는 왜 까다로운가?

AWS 스팟 인스턴스는 최대 90% 저렴한 대신 예고 없이 사라질 수 있음
→ “실서비스에 못 쓴다”는 낡은 인식이 존재함

하지만 다중 AZ, 적절한 롤링 정책, 스마트 Lifecycle Hook 조합으로
스팟 기반 고가용 인프라가 충분히 현실화됨

이 글에서는 단가 절감 + 중단 방어 + 재기동 자동화까지 가능한
지속 가능한 스팟 설계 패턴을 다룸



2. 기본 구성도

       +--------------------------+
       |        ALB               |
       +-----------+--------------+
                   |
        +----------v----------+
        |   Auto Scaling Group |
        | (on-demand + spot)   |
        +----------+----------+
                   |
     +-------------+-------------+
     |                           |
+----v-----+              +------v----+
| EC2 Spot |              | EC2 On-D  |
| (lifecycle hook)        | (stable)  |
+----------+              +----------+




3. 핵심 기술 요소

요소 기능 설명
Auto Scaling Group 온디맨드와 스팟 혼합 비율 정의 (e.g., 30:70)
Instance Refresh 인스턴스 자동 롤링, 교체 타이밍 제어
Lifecycle Hook 인스턴스 종료 전에 알림 → 데이터를 넘기거나 대체 전략 실행 가능
CloudWatch Event 스팟 중단 알림 2분 전 이벤트 수신
Lambda/Step Function 중단 감지 후 처리 자동화: 메시지 큐/대체 생성 등




4. ASG 스팟/온디 믹스 설정 예시 (Terraform)

mixed_instances_policy {
  instances_distribution {
    on_demand_percentage_above_base_capacity = 30
    spot_allocation_strategy                  = "capacity-optimized"
  }

  launch_template {
    launch_template_specification {
      launch_template_id = aws_launch_template.main.id
      version             = "$Latest"
    }
  }
}

주요 포인트:
• capacity-optimized: 가장 안정적으로 남은 용량 있는 스팟 풀 선택
• base_capacity: 필수 트래픽 담당용 온디 비율 확보



5. Spot Instance 중단 감지 + 대응 흐름
1. EC2 Spot Termination Notice 감지 (CloudWatch → SNS)
2. SNS → Lambda or Step Function 실행
3. 대상 인스턴스 ID 파악
4. 종료 전 작업 (Deregister from ALB, 로그 전송 등)
5. 새 인스턴스 PreWarm 요청

{
  "source": "aws.ec2",
  "detail-type": "EC2 Spot Instance Interruption Warning"
}




6. Lifecycle Hook 자동 처리 예시

resource "aws_autoscaling_lifecycle_hook" "spot_terminate" {
  name                   = "spot-terminate-hook"
  autoscaling_group_name = aws_autoscaling_group.app.name
  lifecycle_transition   = "autoscaling:EC2_INSTANCE_TERMINATING"
  heartbeat_timeout      = 300
  default_result         = "CONTINUE"
  notification_target_arn = aws_sns_topic.lifecycle.arn
  role_arn               = aws_iam_role.lifecycle.arn
}

Lambda 예제 (Deregister from ALB)

def handler(event, context):
    instance_id = event["detail"]["EC2InstanceId"]
    alb_client.deregister_targets(TargetGroupArn=TG_ARN, Targets=[{"Id": instance_id}])
    time.sleep(30)  # PreDrain
    complete_lifecycle_action(...)




7. 실전 운영 팁

항목 추천 전략
스팟 풀 고갈 방지 여러 AZ + 여러 인스턴스 타입 구성 (m5, c6i, t3 등 혼합)
로그 유실 방지 CloudWatch Agent or FluentBit로 중앙 수집
신속 복구 instance_refresh with min_healthy_percentage = 80
트래픽 유입 차단 종료 감지 즉시 ALB에서 Deregister 처리
Warm-Up 새 인스턴스 초기화 완료 시점까지 HealthCheck GracePeriod 조절




8. 결론

스팟 인스턴스를 실서비스에 쓰지 않는 시대는 끝났습니다.
Capacity-Optimized + Lifecycle Hook + CloudWatch + ALB Deregister 조합으로
스팟 기반 인프라에서도 고가용, 유연성, 비용 절감이라는 세 마리 토끼를 잡을 수 있습니다.

스팟의 중단을 장애가 아닌 이벤트 기반 트리거로 활용하면
오히려 더욱 유연하고 탄력적인 인프라를 만들 수 있습니다.