⸻
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 조합으로
스팟 기반 인프라에서도 고가용, 유연성, 비용 절감이라는 세 마리 토끼를 잡을 수 있습니다.
스팟의 중단을 장애가 아닌 이벤트 기반 트리거로 활용하면
오히려 더욱 유연하고 탄력적인 인프라를 만들 수 있습니다.
카테고리 없음