개요
안녕하세요. 오늘은 DynamoDB에서의 비용계산에 대해서 알아보도록하겠습니다. 일반적으로 aws의 다른 SaaS 들은 서버 스펙과 거기서 사용하는 스토리지의 양, 그리고 네트워크 비용이 합해져서 비용이 계산됩니다. 그런데 이와는 다르게 DynamoDB 서버 스펙이 아닌 읽고 쓰는 데이터의 량 만큼을 계산해서 비용을 냅니다. 잘 사용하면 비용이 절감되지만 잘못사용하면 비용 폭탄을 맞게되는 이유입니다. 오늘은 DynamoDB의 비용 계산하는 방법에 대해서 알아보도록 하겠습니다.
DynamoDB 비용
DynamoDB의 비용 계산은 다소 복잡합니다. 비용에 영향을 주는 요소는 아래와 같습니다.
- 용량 모드(Capacity Mode)
- 읽기 및 쓰기 용량 단위(Capacity Unit)
- 스토리지 사용량
- 테이블 클래스 선택
- 보조 인덱스 사용
- 추가 기능 사용
- 예약 용량 구매
- 항목 크기 및 속성 이름 길이
- 데이터 전송 비용
- Time to Live(TTL) 설정
되게 다양한 요소에 의해서 비용이 산정됩니다. 오늘은 이중에 대표적으로 영향을 주는 용량 모드와 읽기 및 쓰기 용량 단위에 대해서 알아보고 이를 토대로 계산하는 방법까지 알아보도록 하겠습니다.
읽기 및 쓰기 용량 단위
DynamoDB는 쓰기와 읽기의 용량 단위를 기준으로 비용을 부과합니다. 읽기 용량 단위 Read Capacity Unit이라고 하고 쓰기 용량 단위를 Write Capacity Unit이라고 합니다. 이는 각각 줄여서 읽기 용량 단위를 RCU, 쓰기 용량 단위는 WCU라고 합니다. 이 RCU와 WCU는 프로비저닝의 기준이 되기도하고 비용 계산에서도 계산의 단위로 사용됩니다. 아래에서 자세히 각각 알아보겠습니다.
RCU
RCU는 읽기 용량 단위를 나타냅니다. 이는 DynamoDB에서 데이터를 읽을 시의 데이터 계산 단위입니다. 기본적으로 RCU는 2가지 방법에 대해서 각각 다른 용량 단위를 제공합니다.
1 RCU = 초당 1개의 Strong Consistent로 4KB까지 읽기
1 RCU = 초당 2개의 Eventually Consistent 4KB 읽기
각각 읽기 전략을 이해하기 위해서는 DynamoDB의 저장 구조를 먼저 이해할 필요가 있습니다.
DynamoDB는 Partition Key를 기준으로 Partition이 선택되어 Node 하나에 저장되게됩니다. 그리고 해당 Node에만 저장되는것이 아니라 이를 비동기 통신으로 복제본을 따서 여러곳에 둡니다. DynamoDB는 이러한 Leader - Follower 구조를 가지게됩니다. 이렇게 함으로써 장애 내성(Fail Tolalance)를 가질 수 있도록 합니다. 그리고 이런 구조를 가지기 때문에 어떤 노드에서 어떻게 읽느냐에 따라서 최신 데이터가 반영되지 않아서 데이터의 정합성의 차이가 있을 수 있습니다.
정리하면 아래와 같습니다.
- 최종 일관성(Eventually Consistency) - 여러 노드 중 하나에서 데이터를 읽어옵니다. Primary Node에서 읽을지 아니면 Secondary Node에서 읽을지는 랜덤입니다. 따라서 이는 최신 데이터일 수 있고 아닐수도 있습니다.
- 강력한 일관성(Strong Consistency) - Primary Node에서 데이터를 읽어옵니다. 따라서 반드시 최신 데이터라는 것을 보장할 수 있습니다.
위의 케이스를 토대로 아이템 크기가 동일하다면 RCU는 아래처럼 계산할 수 있습니다.
필요한 RCU = 올림[(아이템 크기 (KB) / 4)] × 초당 요청 수 × 일관성 유형 보정값 × 아이템 수
강력한 일관성 읽기 → 보정값 = 1
최종 일관성 읽기 → 보정값 = 0.5
WCU
WCU는 쓰기 용량 단위를 나타냅니다. 이는 DynamoDB에서 데이터를 쓰거나 삭제할 시의 데이터 계산 단위입니다. 쓰기에 대해서는 Consistency 종류에 따른 WCU 소비 차이는 없습니다.
1 WCU = 초당 1개의 1KB 쓰기 (Strongly Consistent)
필요한 WCU = 올림[(아이템 크기 (KB) / 1)] × 초당 요청 수 × 아이템 수
기본 쓰기 (Strongly Consistent) → 보정값 = 1
용량 모드(capacity mode)
DynamoDB에서는 두가지의 용량 모드(capacity mode)를 제공합니다. 프로비저닝 용량 모드(Provisioned capacity mode)와 온디맨드 용량 모드(On-demand capacity mode)입니다. 프로비저닝 용량 모드는 읽기와 쓰기 용량을 각각 설정해두고 거기에 맞춰 비용을 산정하는 것입니다. 온디맨드 용량 모드는 요청 횟수에 따라서 비용이 부과되는 방식입니다.
온디맨드 용량 모드
온디맨드 용량 모드를 선택하면 실제 사용한 만큼만 비용이 청구되지만, 기본적으로 용량 유닛(Capacity Unit)당 비용이 프로비저닝된 모드보다 높습니다.
서울 리전을 기준, 오늘날짜 기준으로 비용은 아래와 같습니다.
읽기 요청 단위(RCU): 1,000,000개 요청당 0.325 USD
쓰기 요청 단위(WCU): 1,000,000개 요청당 1.625 USD
기본적으로 온디맨드 용량 모드는 예측이 불가능하고 순간적인 스파이크가 많은 워크로드에서 적합하다고 합니다. DynamoDB에서 추천하는 워크로드는 아래와 같습니다.
- 시간이 지남에 따라 변화하는 트래픽 패턴
- 다양한 볼륨의 요청(배치 워크로드로 인한 요청)
- 예측할 수 없는 요청 타이밍(트래픽 급증 초래)
- 지정된 시간 동안 0 또는 피크의 30% 미만으로 떨어짐
AWS 문서에는 아래와 같은 트래픽 트랜드를 가지는 예측 불허한 워크로드를 예시로 들고 있습니다.
프로비저닝 용량 모드
프로비저닝된 용량 모드에서는 설정한 RCU와 WCU에 대한 비용이 청구됩니다. 따라서, 실제 사용량이 설정한 용량보다 적더라도 설정한 용량에 대한 비용이 부과됩니다. 하지만 온디맨드 용량에 비해서 더 단위 유닛 당 더 적은 비용을 냅니다.
서울 리전을 기준, 오늘날짜 기준으로 비용은 아래와 같습니다.
프로비저닝된 처리량 유형 시간당 요금
WCU(쓰기 용량 유닛) WCU당 USD 0.0007049
RCU(읽기 용량 유닛) RCU당 USD 0.00014098
프로비저닝 모드에서는 초당 사용 유닛으로, 즉 RCU/S WCU/S의 리소스 사용량 기준으로 오토스케일링이 적용되며 스케일 인과 스케일 아웃을 합니다. 이 때 스케일 아웃중에 용량 기준을 초과하면 스로틀링이 걸려서 timeout이 발생할 수 있습니다. 또한 max 치를 초과한다면 ProvisionedThroughputExceededException이 반환되어 데이터 처리가 원활하지 않을 수 있습니다.
온디맨드에 비해서 상대적으로 저렴하지만 이러한 한계가 있는 프로비저닝 모드는 아래와 같은 안정적인 트래픽 상황에 적합합니다.
- 지정된 시간 또는 날짜에 대한 안정적이고 예측 가능한 주기적 트래픽
- 제한적인 단기 트래픽 폭주
계산 예제
그렇다면 이제 위의 용량 모드와 용량 단위의 변수들을 통해서 실제로 예제를 만들어서 케이스별로 계산해보도록 하겠습니다.
아래와 같은 상황이라고 해보겠습니다.
읽기 요청: 하루에 1,000,000회의 강력한 일관성 읽기 요청을 수행하며, 각 항목의 크기는 1KB 입니다. 또한 해당 요청은 매초 균일하게 요청합니다.
쓰기 요청: 하루에 500,000회의 쓰기 요청을 수행하며, 각 항목의 크기는 1KB 입니다. 또한 해당 요청은 매초 균일하게 요청합니다.
온디맨드 용량 모드인 경우
온디맨드 모드에서는 애플리케이션의 실제 읽기 및 쓰기 요청 수에 따라 요금이 청구됩니다. RCU와 WCU 계산하는 단위를 다시 한번 생각해보도록하겠습니다.
읽기 요청 단위(RCU): 최대 4KB 크기의 항목에 대한 강력한 일관성 읽기 요청 1회는 1 RCU로 계산됩니다.
쓰기 요청 단위(WCU): 최대 1KB 크기의 항목에 대한 쓰기 요청 1회는 1 WCU로 계산됩니다.
읽기 요청을 보면 1KB의 Item에 대해서 100만번 읽기가 수행됩니다. 4KB 이하의 읽기라면 강력한 일관성의 경우 1개의 Item 당 1 RCU를 소모합니다. 그러면 전체적으로 하루에 100만 RCU를 사용한것으로 볼 수 있습니다. 쓰기 요청의 경우도 마찬가지로 1KB 이하이므로 1개의 Item 당 1 WCU를 소모합니다. 50만회의 쓰기 요청이기 때문에 50만 WCU를 소모한다고 볼 수 있습니다.
그렇다면 한국 리전에서의 비용으로 계산하면 1달의 비용은 아래와 같이 계산할 수 있습니다.
읽기 하루 비용 : 1,000,000 RCU × $0.325 USD = $0.325 USD
쓰기 하루 비용 : 500,000 WCU × $1.625 USD = $0.8125 USD
하루 총 비용: $0.325 USD + $0.8125 USD = $1.1375 USD
월간 예상 비용: $1.1375 USD × 30일 = $34.125 USD
프로비저닝 용량 모드
그렇다면 반대로 프로비저닝 용량 모드에서 비용을 계산해보도록 하겠습니다. 읽기의 경우 하루에 100만건 요청이고 이게 균등으로 들어오기 때문에 초당 RCU를 계산하여야합니다. 초당 RCU는 아래와 같습니다.
초당 RCU = 1,000,000 / (24 * 60 * 60) = 11.57, 이를 올림하면 초당 12 RCU의 프로비저닝을 통해서 운영할 수 있습니다.
WCU도 동일한 계산을하면 아래와 같습니다.
초당 WCU = 500,000 / (24 * 60 * 60) = 5.78, 이를 올림하면 초당 6 WCU의 프로비저닝을 통해서 운영할 수 있습니다.
초당 RCU와 WCU가 나왔기 때문에 월간 비용을 예상해볼 수 있습니다. 계산하면 아래와 같습니다.
월간 읽기 비용 : 12 RCU × $0.00013 USD × 24 (시간) × 30 (일) = $1.12 USD
월간 쓰기 비용 : 6 WCU × $0.00065 USD × 24 (시간) × 30 (일) = $2.80 USD
월간 총 비용 : $1.12 USD + $2.80 USD = $3.92 USD
계산 결론
이렇게 동일한 양의 요청을 처리할 수 있다고 했을 때 프로비저닝이 9배 정도 이득인것을 알 수 있습니다. 하지만 이것은 TPS가 완전 균등하게 들어오고 프로비저닝도 여유 없이 최적화 했을때의 가격입니다. 따라서 이는 현실에서는 거의 불가능한 케이스이긴합니다.
기타 유의 사항
비용계산과 관련해서 유의해야하는 점들을 별도로 나열해보았습니다.
- RCU와 WCU는 정수단위로 계산됩니다. 따라서 Eventually Consistency를 기준으로 초당 1개 읽었다고 해서 0.5 RCU가 아니라 1 RCU를 소모합니다.
- 프로비저닝의 오토스케일링의 기준은 초입니다.
- 프로비저닝에서 실제 비용 계산에서 사용되는 RCU 단위는 시간입니다. 즉, 1시간 평균내어서 용량 단위가 비용 계산 단위로 사용됩니다.
- 트랜잭셔널을 이용하면 트랜잭셔널은 열고 닫는 행위에 대해서 용량단위가 포함됩니다. 따라서 하나의 아이템당 1 CU가 추가로 포함됩니다. 사실상 아이템당 2배의 CU가 소모되게 됩니다.
- 여러 아이템을 조회하거나 쓰더라도 용량에 따른 WCU를 계산할 때 각 item 갯수마다 CU가 계산됩니다. 즉, 3.5 + 0.2의 Strong Consistency 읽기가 있었다면 이것은 1 + 1로 2 RCU를 소모하게 됩니다.
- 비용은 데이터를 읽는것을 기준으로 산정됩니다. Filter 또는 Projection을 통해서 Router에서 통신을 적게 받는다고 적게 계산되는것이 아닙니다.
- 단일 attribute를 update 하더라도 전체 item 크기를 기준으로 용량 단위가 계산됩니다.
마무리
오늘은 이렇게 DynamoDB의 비용 계산에 대해서 알아보았습니다.
멋모르고 사용하면 요금 폭탄을 맞을 수 있는 DynamoDB 잘 알고 쓰셔야합니다 !
감사합니다.
참고
[2] https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/read-write-operations.html
'datasource > DyanmoDB' 카테고리의 다른 글
[DynamoDB] DynamoDB에서 사용하는 용어 정리 (0) | 2025.02.13 |
---|---|
[DynamoDB] 그거 알아요 ? DynamoDB는 HTTP로 통신한다는거 (RDB 운영 이슈, Transaction, Conflict) (0) | 2025.02.09 |
[DynamoDB] 왜 DynamoDB와 같은 Wide Columns DB는 RDB에 비해서 더 확장성(scalability)을 가지는가 ? (0) | 2025.02.04 |
댓글