🔥 Spot, On-Demand, Reserved: 세 가지 가격 모델

2115자
25분

16:9 가로 강의 표지 일러스트레이션. 흰 배경. 가운데 시간 단위 청구서 한 장이 떠 있고 그 아래로 네 갈래 탭이 분기한다. 슬레이트 그레이 On-Demand, 앰버색 Spot, 에메랄드 그린 Savings Plan (시계 자물쇠), AWS 오렌지 Reserved (캘린더 자물쇠). 청구서 위에는 작은 EC2 인스턴스 아이콘과 m6i.large 라벨. 위쪽 띠에 EC2 Pricing Models 라벨. 절제된 sans-serif. 프로페셔널 IT 강의 표지 스타일

한 달 t3.medium 한 대를 서울 리전에 띄워 두고 처음 받아 본 청구서에서 EC2 한 줄을 봤다. 시간당 단가에 720시간을 정확히 곱한 금액이 거기 있었다. 켜 둔 시간만큼 정확히 빠지는, 가장 정직한 가격. 그날 처음으로 "그러면 이 한 줄을 깎는 다른 모델은 어떻게 생겼지?"를 진지하게 살펴봤다.

가격 페이지에서 마주친 답은 네 종류다. On-Demand, Spot, Savings Plans, Reserved Instances. 할인되는 방식과 그 대가로 받아들이는 부담이 모두 다르다. "관리형이 감추는 비용"이라는 표현을 CloudWatch 편부터 반복해 왔는데, EC2 가격 모델이 그 표현에 가장 잘 들어맞는다. 시간당 단가가 깎이는 대신 내가 운영해야 할 손잡이가 한 두 개씩 늘어난다.

On-Demand가 가격 모델의 출발점인 이유

On-Demand는 약정 없이 시간(또는 초) 단위로 켠 만큼만 비용을 부과한다. AWS 공식 EC2 On-Demand 가격 페이지에서 m6i.large는 us-east-1 기준 시간당 $0.096이다. 24/7로 한 달 켜 두면 $0.096 × 24 × 30 = $69.12. 서울 리전(ap-northeast-2)은 us-east-1 대비 단가가 다르므로, 정확한 서울 단가는 가격 페이지의 region 선택을 ap-northeast-2로 두고 직접 확인한다(아래 worked example의 $0.124/hr는 인용 시점에 확인한 가정값이다).

이 가격이 나머지 세 모델의 기준선이다. Spot이 "최대 90% 할인"이라고 말할 때의 100%, Savings Plans가 "최대 72%"라고 말할 때의 100%, Reserved Instance가 "최대 72%"라고 말할 때의 100%는 셋 다 On-Demand 시간 단가가 분모다. 그래서 어떤 절감을 이야기하든 On-Demand가 얼마인지부터 확실히 잡고 들어간다.

또 하나, On-Demand는 깎이는 대가로 무엇도 약속하지 않는 유일한 모델이다. 갑자기 인스턴스를 두 배로 늘려도 같은 시간당 단가가 그대로 적용되고, 한 시간 만에 전부 끄면 그 한 시간만 청구한다. 탄력 자체가 가치인 단계, 즉 부하의 형태가 아직 안 잡혔거나 6개월 안에 기술 스택을 바꿀 가능성이 큰 단계에서 이 기준선을 그대로 유지하는 것이 가끔 가장 합리적이다.

Spot은 어떻게 90%까지 깎이는가: spare capacity와 2분 통보의 거래

AWS의 Spot Instance 페이지는 시간당 가격을 On-Demand 대비 최대 90%까지 낮춰 준다고 적어 둔다. 실제 절감폭은 리전·인스턴스 타입·시간대에 따라 다르다. 90%는 상한선일 뿐 보장이 아니고, 어떤 풀에서는 단가가 On-Demand에 가깝게 올라가는 시점도 등장한다.

이 깊은 할인이 어디서 오느냐. AWS가 한 리전·한 가용영역의 한 인스턴스 타입에 평소 사용량보다 많은 capacity를 미리 깔아 둔다. 그 남는 capacity를 Spot이라는 이름으로 다시 시장에 내보낸다. 누군가가 같은 capacity를 On-Demand 가격에 사겠다고 하면, AWS는 Spot을 회수해서 그 요청에 줘야 한다. 그래서 Spot 인스턴스에는 언제든 회수가 가능하다는 한 가지 약속이 같이 따라온다.

회수가 결정되면 EC2가 2분 전 interruption notice를 인스턴스 메타데이터(/latest/meta-data/spot/instance-action)와 EventBridge로 함께 보낸다. 2분이 지나면 AWS가 stop 또는 terminate 동작을 시작한다. Hibernation 동작이 걸린 경우에는 interruption notice 자체의 적용이 다르므로, 일반 stop/terminate와 같은 2분 여유를 가정하지 않는 게 안전하다. 이 2분은 짧지만, 잘 설계된 워크로드는 그 안에 진행 중인 작업을 체크포인트하고, ECS/Kubernetes 같은 오케스트레이터가 워크로드를 다른 인스턴스로 이관한다.

평균 회수율은 어떨까. AWS Spot Instance Advisor는 직전 30일 데이터를 기준으로 인스턴스 타입·리전별 frequency of interruption을 < 5% / 5–10% / 10–15% / 15–20% / >20%의 다섯 단계로 표시한다. 전체 평균은 5% 미만으로 잡혀 있고, 일반 패밀리들이 자주 < 5% 칸에 분포한다(단 시점·리전 의존). 단, 이 숫자는 과거의 30일이지 내일의 보장이 아니다. capacity 부족이 한 번 터지면 그 칸이 며칠 사이에 바뀐다.

Spot 인스턴스 중단 시퀀스 다이어그램. 다섯 개의 액터 레인 (AWS EC2, Spot 인스턴스, EventBridge, IMDS 메타데이터, 애플리케이션)이 가로로 늘어선 위에서 시간 순서로 메시지가 흐른다. AWS EC2가 capacity를 회수하면 Spot 인스턴스가 EventBridge로 spot-interruption-warning 이벤트를, IMDS로 spot/instance-action 값을 동시에 발행한다. 애플리케이션은 IMDS를 폴링해 action을 읽고 2분 타이머를 시작, 그 안에 작업을 체크포인트하거나 다른 인스턴스로 워크로드를 이전한다. 2분 후 AWS EC2가 stop 또는 terminate를 실행한다. Hibernation 동작은 별도 흐름.

Spot 요청 시점에 어느 capacity 풀에서 인스턴스를 가져올지 결정하는 손잡이를 allocation strategy라고 부른다. 다섯 가지로, lowest-price, capacity-optimized(2019-08 도입), capacity-optimized-prioritized, diversified, price-capacity-optimized(2022-11 도입). 마지막 price-capacity-optimized가 가격과 회수 가능성을 동시에 보고 풀을 고른다. AWS가 2026년 현재 기본 권장으로 표기하고 있고, 새 fleet을 짤 때 이유 없이 lowest-price를 고르면 가격은 살짝 더 싸지만 회수율이 높아져 결과적으로 손해가 자주 난다.

여기서 "관리형이 감추는 비용"이 한 번 더 등장한다. Spot 시간당 단가는 분명 싸다. 그런데 그 단가를 누리려면 내가 운영해야 할 별도 인프라가 자란다. 인스턴스 타입을 충분히 다양화하고(여러 타입과 가용영역을 섞고), capacity rebalancing을 켜고, 2분 안에 작업을 옮길 lifecycle hook을 짜고, 회수가 빈번한 시간대를 모니터링한다. 이 운영 비용, 즉 사람 시간과 운영 복잡도가 m6i.large 한 대를 90% 깎는 대목에서는 잘 드러나지 않는다. 한 달에 m6i.large 100대를 24/7 운용하는 규모에서는 그 운영 비용이 절감액 안쪽으로 들어와 명백한 흑자가 되지만, 5대를 운용하는 소규모에서는 종종 적자다.

옛날에 있던 Spot Block, 1~6시간을 회수 없이 보장해 주던 옵션은 2021-07-01부로 신규 가입을 종료했고 기존 고객도 2022-12-31까지만 지원했다. 지금은 사용할 수 없는 옵션이라 아직도 일부 글에 남아 있는 "Spot Block 6시간 보장"은 더는 답이 아니다.

Spot이 맞는 곳은 명확하다. 작업이 stateless이거나, 체크포인트로 한 번에 분 단위 진척을 잃어도 괜찮은 batch·CI/CD·렌더 파이프라인·머신러닝 학습. 반대로 금지해야 할 곳도 명확하다. 데이터베이스 같은 stateful 워크로드, 사용자가 5초 latency를 즉시 인지하는 OLTP, 또는 회수가 났을 때 사람이 24시간 retry를 받지 못하는 시스템. 이 두 칸을 헷갈리면 절감액이 다음 주 장애 보고서로 돌아온다.

Savings Plans는 어떻게 다른가: 시간당 약정이라는 새 차원

Savings Plans는 AWS가 2019년 11월 re:Invent에서 EC2·Fargate를 묶어 발표했고, Lambda 적용은 2020년 2월에 합류했다. Reserved Instance 모델보다 한 단계 유연한 약정을 도입한 것이 핵심이고, 약정의 단위가 인스턴스 타입이 아니라 시간당 달러($/hr)다.

작동 방식을 한 줄로 풀면 이렇다. 내가 "1년 동안 매시간 $10어치 EC2/Fargate/Lambda를 쓰겠다"고 약정한다. 그러면 그 시간당 $10까지의 사용분에는 SP 할인 단가를 적용한다. 시간당 $12를 쓴 시간은 $10어치를 SP 가격으로, 나머지 $2어치를 On-Demand 가격으로 청구한다. 시간당 $7만 쓴 시간이 있어도 $10을 그대로 청구한다(약속한 commitment). 그래서 SP는 "정말로 매시간 그만큼은 안 줄어들 것"이라고 확신하는 baseline에만 거는 게 안전하다.

종류는 네 가지다(2025년에 AWS가 Database Savings Plans를 추가했다). Compute Savings Plans는 EC2·Fargate·Lambda를 한 묶음으로 보고 인스턴스 패밀리·크기·OS·테넌시·리전을 자유롭게 바꿔도 할인이 따라간다. 최대 할인은 On-Demand 대비 up to 66%. EC2 Instance Savings Plans는 한 리전 안에서 한 패밀리(예: ap-northeast-2의 M6i 묶음)에만 적용되는 대신 더 깊게 up to 72%까지 할인 폭이 있다. 같은 패밀리 안에서는 size·OS·테넌시는 자유로이 바꿀 수 있지만, 리전이나 패밀리를 벗어나면 그 시간당 commitment를 AWS가 SP가 아니라 On-Demand 단가로 청구한다. 세 번째는 Machine Learning Savings Plans, 곧 SageMaker용으로 up to 64% 할인 폭이 있다.

EC2 가격 모델 최대 할인 비교 막대 차트. 다섯 개의 가로 막대가 위에서 아래로 정렬되어 있다. On-Demand는 100% 풀 길이의 슬레이트 그레이 baseline, Compute Savings Plan은 약 34% 길이의 에메랄드(up to 66% off), EC2 Instance Savings Plan은 약 28% 길이의 진한 에메랄드(up to 72% off), Standard Reserved Instance는 약 28% 길이의 AWS 오렌지(up to 72% off), Spot은 약 10~30% 가변 길이의 앰버색에 점선 그라데이션이 들어간 막대(up to 90% off, 시장 변동 영역). 각 모델 이름은 왼쪽, 할인 폭은 오른쪽에 라벨링.

적용 우선순위에도 한 가지 함정이 있다. 시간당 사용분에 SP를 적용할 때 AWS는 더 좁은 범위의 약정을 먼저 소진한다. EC2 Instance SP가 먼저 자기 패밀리·리전 안 사용분에 들어가고, 남은 사용분에 Compute SP가 적용된 뒤, 그래도 남으면 On-Demand 단가가 따라온다. 이 순서가 두 SP를 동시에 들고 있을 때 약정 오버랩을 막아 준다.

worked example 한 번 잡아 본다. 서울에서 m6i.large 5대를 24/7로 1년 운용한다고 가정한다. 시간당 5 × $0.124 ≈ $0.62, 한 달 약 $447, 1년 약 $5,360 어치 On-Demand가 bottom line이다. 여기에 EC2 Instance SP 1년 No Upfront(약 25~30% 할인을 흔히 본다)를 걸면 1년 약 $3,750~4,000 수준으로 줄어든다. 같은 조건에 Compute SP 1년 No Upfront(약 20~25% 할인)를 걸면 1년 약 $4,000~4,300. EC2 Instance SP가 더 깊지만, 1년 안에 패밀리를 m6i에서 c7g(Graviton)로 바꿀 가능성이 보이면 Compute SP가 손해가 적다. 1년 안에 패밀리·리전을 바꿀 가능성이 SP 종류의 결정 변수다.

Reserved Instance는 SP와 무엇이 다른가: capacity까지 함께 잠그는 모델

Reserved Instance는 SP보다 더 오래된 모델이고, 약정 단위가 시간당 달러가 아니라 인스턴스 타입의 시간이다. 1년 또는 3년 동안 m6i.large 1대 분량의 capacity를 쓰겠다고 약속한다. Reserved Instance 가격 페이지에서 보면 두 갈래로 나뉜다.

Standard RI는 약정 후 인스턴스 패밀리·OS·테넌시·리전을 바꿀 수 없는 대신 가장 깊은 할인 폭이 있다(up to 72%, 3년 All Upfront 기준). Convertible RI는 약정 후에도 패밀리·OS·테넌시를 바꿀 수 있는 대신 할인 폭은 얕은 편이다(공식 가격 페이지 기준 up to 66%, 3년 All Upfront 기준). 셋의 결제 옵션은 All Upfront / Partial Upfront / No Upfront이고, 선결제할수록 할인 폭이 커진다.

여기에 또 한 갈래가 더 있다. RI를 Regional 범위로 잡으면 한 리전 안 어느 가용영역에서도 할인이 따라가지만 capacity 보장은 없다. Zonal 범위로 잡으면 한 가용영역에 capacity를 잠가 두는 대신 그 가용영역을 벗어나면 할인이 안 따라간다. capacity가 부족해 launch가 실패하는 상황을 피하려면 zonal RI가 답이지만, 그만큼 운영 자유도는 좁다.

여기서 On-Demand Capacity Reservation이라는, 2018-10에 AWS가 출시한 별도 기능이 등장한다. ODCR은 약정 없이 한 가용영역에 capacity를 잠그는 도구다. 잠가 둔 capacity는 시간당 On-Demand 가격으로 청구하고, 약정이 없으니 언제든 cancel할 수 있다. ODCR 위에 SP나 Regional RI 할인은 적용 가능하다. 대신 Zonal RI는 자체적으로 capacity 보장 기능을 가지므로 ODCR과 별도 도구로 본다. capacity 보장과 할인을 분리하고 싶으면 ODCR + Compute SP 조합이 자연스럽다.

EC2 가격 모델 결정 트리 다이어그램. 최상단 'Workload Profile?' 다이아몬드에서 네 갈래로 분기. 왼쪽 가지 'Steady 24/7 baseline?'을 따라가 'Family/region likely to change in 1 yr?' 다음 분기에서 yes는 에메랄드 박스 Compute Savings Plan, no는 에메랄드 박스 EC2 Instance SP / Standard Regional RI. 두 번째 가지 'Need AZ-locked capacity?' yes는 AWS 오렌지 박스 Standard Zonal RI 또는 ODCR + SP. 세 번째 가지 'Fault-tolerant batch / stateless?' yes는 앰버 박스 Spot Instances. 네 번째 가지 'New project < 3 months / volatile load?' yes는 슬레이트 박스 On-Demand. 결정 다이아몬드는 옅은 회색.

관리형이 감추는 비용: 약정한 capacity를 못 쓰는 상황

가격 모델 네 개 중 세 개가 시간당 단가를 깎는 대가로 약정을 받는다. 약정한 capacity를 약정 기간 동안 다 쓰면 깎인 단가만큼 정확히 절감 효과가 있다. 약속한 만큼을 못 쓰면 어떻게 될까. SP는 시간당 commitment에 미치지 못해도 그 commitment를 그대로 청구한다. RI는 인스턴스를 켜지 않아도 약정 시간만큼 청구하고, Standard RI라면 RI Marketplace에서 일부 되팔 수 있지만(Convertible RI는 판매 불가), 기본은 침전 비용이다.

내가 작년에 굴리던 한 팀에서는 c5.xlarge 10대를 1년 Standard RI로 잡아 두었는데, 6개월 만에 워크로드가 Lambda + Fargate로 옮겨 갔다. 남은 6개월의 RI는 사용량 0으로 그대로 비용을 부과받았고, Marketplace에서 절반쯤 회수했다. 결과적으로 같은 6개월을 On-Demand로 굴렸으면 더 쌌을 케이스다. 그날 이후 1년 안에 스택이 바뀔 가능성이 보이면 약정을 안 거는 쪽으로 룰을 잡았다.

Spot 쪽의 숨은 비용은 다른 형태다. 시간당 단가가 90% 깎이는 대목에 운영 손잡이가 늘어난다. 인스턴스 타입 다양화, 가용영역 분산, capacity rebalancing, lifecycle hook, EventBridge 이벤트 처리. 5대를 굴리는 소규모에서는 이 운영 손잡이를 짜는 사람 시간이 절감액보다 더 비싸다. 100대 규모에서는 그 손잡이가 절감액 안쪽으로 잘 들어간다. 규모가 결정 변수다.

언제 쓰지 말아야 하는가

라우팅 테이블: 패킷이 어디로 가는지부터 매 섹션에서 한 번씩 되묻고 있는 질문, 즉 "언제 이 도구를 쓰지 말아야 하는가"를 가격 모델 위에서 한 번 더 본다.

Spot을 쓰지 말아야 할 곳. 데이터베이스 primary, 사용자가 5초 latency를 즉시 인지하는 OLTP, 회수가 났을 때 사람이 24시간 retry를 받지 못하는 시스템, 그리고 인프라 손잡이를 짤 사람 시간이 절감액보다 비싼 작은 규모(인스턴스 5대 미만 정도). Spot 90% 자랑이 차고 넘치지만, 이 네 경우에서 90%를 노리면 다음 분기에 장애 보고서가 돌아온다.

SP/RI를 쓰지 말아야 할 곳. 1년 안에 인스턴스 패밀리·리전·아키텍처가 바뀔 가능성이 보이는 단계(ARM·Graviton 검토 중, 멀티클라우드 검토 중, 회사 reorg 가능). 거기에 더해 부하의 baseline이 아직 안 잡힌 첫 6개월의 스타트업 단계. baseline을 모르고 1년 commit을 걸면 사용량이 commitment보다 적은 시간이 쌓여 깎인 단가가 무의미하다.

On-Demand만 쓰지 말아야 할 곳. 24/7로 켜 두는 baseline이 6개월 이상 명확한 곳. 그런 곳에서 SP/RI를 안 끼면 매시간 25~70%를 그냥 버리는 셈이다. 새 시스템에 EC2를 띄울 때 처음 3개월은 On-Demand로 사용량을 측정하고, 4개월차에 baseline 시간당 commitment를 SP로 거는 룰이 운영팀에 부담이 가장 적다.

가격 모델 한 번 더: 결정 변수는 시간당 baseline과 바꿀 가능성

결정 변수는 두 줄이다. 첫째, 24/7로 안정적으로 굴어가는 시간당 baseline이 얼마인가. 그 baseline 위에 SP를 거는 게 자연스럽다. 둘째, 1년 안에 그 baseline의 패밀리·리전·아키텍처를 바꿀 가능성이 얼마나 되는가. 바꿀 가능성이 크면 Compute SP, 작으면 EC2 Instance SP 또는 Standard RI. 그 위에 fault-tolerant 영역만 Spot으로 올리고, On-Demand는 세 모델로 못 가두는 변동 영역과 새 워크로드의 첫 3개월 측정 기간 정도를 담는다.

이어서 Auto Scaling Group을 본다. 가격 모델 위에서 결정한 baseline+탄력 영역이 거기서 처음으로 수요에 따라 자동으로 늘고 주는 손잡이를 만난다. ASG의 mixed instances policy가 SP/RI/On-Demand/Spot을 하나의 그룹으로 묶는 단계에서, 여기서 잡은 두 결정 변수가 다시 등장한다.

참고 자료

YouTube 영상

채널 보기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
투영과 예측, 그리고 선형 결합 | 선형대수학
직교성과 벡터 투영 | 선형대수학
행렬의 기본 연산 - 행렬 덧셈, 스칼라 곱, 전치 | 선형대수학
AI 추천 시스템의 원리, 벡터 사이의 각도와 코사인 유사도 | 선형대수학
숫자 하나가 AI 모델의 운명을 바꾼다? | 선형대수학
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
인공지능은 세상을 어떻게 숫자로 읽는가? - 이미지, 소리 그리고 텍스트가 행렬이 되는 원리 | 선형대수학