Post

AWS EC2 비용 최적화


AWS에는 많은 기능이 있다고 생각됩니다. 그 중, 실제로 애플리케이션 서버가 돌아가는 EC2를 어떤 기준으로 선택해야 하는지 알아보며 실제 제가 프로젝트에 사용했던 클라우드 구조의 비용을 낮춰보려고 합니다.


1. 요금 플랜 선택 (온디맨드, 절감형, 스팟)


EC2를 구매하는 방법에는 시간,초 단위로 서버 자원을 지불하는 온디맨드 방식, 1년~3년 기간으로 일정 사용량을 약정하여 최대 72%까지 절감하는 모델인 절감형 모델 그리고 AWS에서 미사용하는 EC2를 구매하는 스팟 인스턴스 방식이 있습니다.

먼저, 온디맨드 방식은 초당 비용을 지불하는 방식으로 인스턴스를 생성한 순간부터 비용 지불이 시작됩니다. 가장 보편적인 방식으로 빠르고 쉽게 인스턴스를 사용할 수 있다는 장점이 있습니다.

제가 진행한 프로젝트에서는 이런 장점을 바탕으로 초기에 대부분의 서버를 온디맨드 방식으로 사용하였습니다. 하지만 생각보다 많이 나오는 비용을 보며 좋은 방법이 아님을 깨닫았고 이를 바탕으로 비용을 절감하는 방법을 찾아보게 되었습니다.

다음은, 절감형 방식으로 휴대폰을 약정으로 구매하면 할인이 들어가는 것과 비슷하게 서버를 특정 시간만큼 빌린다고 약정으로 구매하는 방식입니다.
예를 들어, 한달을 30일로 볼 때, 이는 720시간이고 1년은 8640시간입니다. 1년 약정으로 서버 1대를 사용한다면 8640시간을 약정으로 구매하는 대신 온디맨드를 1년 사용하는 것보다 저렴하게 구매할 수 있습니다. 하지만, 서버를 생성하지 않아도 이 비용은 계속 지불되기 때문에 해당 기간동안 서버의 사용이 예상되는 경우에 사용하는 것을 추천합니다.
8640시간이 넘어가면 온디맨드 요금으로 부과되고 결제 방식으로는 선결제, 부분 선결제 그리고 선결제 없음(월마다 결제)이 있습니다. 선결제를 할 수록 할인율이 높아지므로 실제 1년은 운영할 것이라고 확신 된다면 선결제로 진행하는 것이 좋은 선택이라고 생각합니다.

절감형 플랜에는 Compute Savings PlansEC2 Instance Savings Plans이 있습니다. Compute Savings Plans는 EC2의 패밀리, Fargate, Lamda 사용량에 적용되는 요금 플랜으로 해당 항목들에 대해서 약정으로 구매한 시간만큼은 할인된 가격으로 이용할 수 있습니다. 범용성이 좋은 플랜으로 실제 이런 기능들이 필요한 서비스라면 선택해 볼 수 있을거 같습니다. EC2 Instance Savings Plans은 특정 EC2 인스턴스 패밀리만 약정으로 싸게 구매하는 방식입니다. 예를 들어, 나는 t3버전만 필요한 상황이라면 이 플랜을 선택하여 Compute Savings Plans보다 좀 더 저렴하게 약정을 구매할 수 있습니다.

이를 바탕으로 생각해보면, 제가 진행하는 프로젝트는 적어도 1년은 유지될 것이고 특정 EC2 패밀리리만 필요한 상황에서 저는 온디맨드 방식에서 EC2 Inctance Saving Plans로 변경하기로 결정하였습니다.

마지막으로, 스팟 인스턴스 방식은 비용이 최대 90% 저렴하다는 장점이 있지만 AWS 서버 용량이 부족할 때 중단될 수 있다는 문제가 있습니다. 따라서 실제 운영하는 서비스에 사용하기에는 무리가 있고 내부적으로 테스트용 서버를 둘 때 스팟 인스턴스를 고려해보면 좋을 것 같다고 생각하였습니다.

실제로 프로젝트에 사용하는 테스트 서버를 온디맨드로 사용하고 있었는데 이것을 스팟 인스턴스로 사용하기로 결정하였습니다.


2. OS 선택 기준


EC2를 생성할 때 가장 먼저 선택해야하는 것이 바로 OS이다. 저는 많은 OS 중에 공부를 하며 가장 많이 접했던 Amazon Linux와 Ubuntu를 중심으로 선택해보려고 합니다.

Amazon Linux는 AWS 환경과 호환성이 뛰어나다는 장점이 있습니다. 하지만, 롤링 업데이트 특성상 서버를 사용하다가 서버의 인스턴스 상태가 변경될 수 있다는 위험이 있습니다.

인스턴스의 상태가 변경된다면 내가 배포한 서버의 환경이 변경된다는 것으로 연쇄적인 의존성 문제가 발생할 수 있다는 위험이 존재했습니다. 또한 어떤 오류가 났을 때 해결 방법이 AWS에 문의하기가 최선의 방법이라는 점은 개발자로서 가장 답답한 해결책이라고 생각하였습니다.

그에 반해 Ubuntu는 고정된 릴리스 모델(LTS)을 제공합니다. 이는 안정성과 예측 가능성을 중시하는 방식으로 보안/유지보수 업데이트만 제공합니다. 따라서 초기 환경 그대로 LTS 기간 동안 의존성에 대해 걱정하지 않아도 됩니다. 추가적으로 다양한 환경에서의 표준화나 활발한 커뮤니티가 Ubuntu의 사용을 더욱 편리하게 만들어 줍니다.
따라서, 이를 근거로 저는 Ubuntu로 서버를 생성하기로 결정하였습니다.

이 두 가지 OS 말고도 다른 OS들이 성능적으로 더 좋거나 커뮤니티가 더 활발할 수 있다고 생각합니다. 하지만 다른 OS를 선택하게 되면 그만큼 제가 모르는 부분에 대한 학습 비용이 들게 되고 이는 서버 비용을 감소시키는 목적에 부합하지 않다고 생각하여 가장 친숙한 2가지 OS만을 선정하여 비교해보았습니다.


3. 서버 사양 선택 (EC2 패밀리 선택)


AWS에서 서버는 패밀리로 묶여서 사용됩니다. t2, t3 등과 같은 것들이 하나의 패밀리입니다. AWS 인스턴스 유형으로는 여러가지 존재하고 그중 WAS나 웹서버의 경우 범용 유형이 적합한 사용처라고 판단하여 범용 유형에 해당하는 패밀리에서 선택하였습니다. 패밀리 유형으로는 t2, t3, t3a, t4g, m 유형이 존재합니다. 저는 몇가지 이유로 5가지 유형중 t3 패밀리를 선택하였습니다.

먼저, m 패밀리는 기업에서 사용되는 가장 일반적인 유형이라고 생각됩니다. 하지만, 비용적인 측면(t3와 2배~수십배 차이)에서 이 패밀리는 너무 이른 선택이라고 생각했고 가장 처음으로 선택에서 제외하였습니다. 다음은 ARM 프로세서 기반인 t4g 패밀리와 x86기반인 t3,t3a그리고 t2입니다. AWS 패밀리는 버전이 높을수록 비용은 절감되고 더 좋은 성능을 경험할 수 있습니다.

이를 비교 분석한 자료는 다음과 같은 사이트가 있는데 x86끼리 비교했을 때 t3a가 t3, t2보다 비용이 저렴하며 성능이 좋은 것을 확인할 수 있습니다. 벤치마크 성능비교

t4g랑 비교한 자료는 다음과 같습니다. 출처

1
2
3
4
5
6
7
+---------------+-------------+------------+-----------------------------------------------+
| Instance type | Single Core | Multi Core |               Test result link                |
+---------------+-------------+------------+-----------------------------------------------+
| t3.medium     |         731 |        845 | https://browser.geekbench.com/v5/cpu/20702082 |
| t3a.medium    |         657 |        869 | https://browser.geekbench.com/v5/cpu/20701968 |
| t4g.medium    |         754 |       1502 | https://browser.geekbench.com/v5/cpu/20701961 |
+---------------+-------------+------------+-----------------------------------------------+

값이 클수록 더 좋은 성능을 가리키는 지표로 Multi Core의 경우 2배 가까이 t4g의 성능이 좋다는 것을 알 수 있습니다.

이를 바탕으로 범용 서버 패밀리들 중 성능이 우수하고 비용이 저렴한 패밀리는 t4g 패밀리라는 것을 파악할 수 있었고 Srping Boot 서버 배포에 ARM 프로세서는 크게 문제 되지 않는다는 점을 근거로 최종적으로 t4g 패밀리를 선택하게 되었습니다. t4g 패밀리 내에도 micro부터 2xlarge까지 다양한 사양이 존재하는데 이는 이후 진행할 부하테스트를 통해 최적의 버전을 선택하려고 합니다.


4. 최종 비용 비교 계산

먼저 기존에 지출하던 EC2 서버 개수와 EC2 패밀리에 대해서 정리해 보겠습니다.

1
2
- t3.micro 2대(Test Server, Bastion Server)
- t3.small 최소 1대(Application Server)

이를, 비용을 절감하기 위한 방식을 적용한다면 다음과 같이 변경해 볼 수 있다고 생각합니다.

1
2
- 스팟 인스턴스 방식 2 : Test Server, Bastion Server
- 절감형 플랜(EC2 Instance Savings Plans = t4g family) 최소 1 : Application Server  

1년 약정기준으로 두 케이스의 비용을 비교해보면

1
2
이전 버전 : (0.013 * 2 + 0.026) * 8640 = 449.28 USD
다음 버전 : (0.0043 * 2 + 0.0126 ) * 8640 = 183.17 USD

0.013은 t3.micro의 시간당 가격이고 0.026은 t3.small의 시간당 가격입닌다. 0.0043의 경우 스팟 인스턴스의 t4g가격이고 0.0126은 절감형 플랜의 선결제 없음일 떄의 t4g 가격입니다.

선결제 없는 방식으로 계산하면 1년에 2.5 배정도 차이나는 금액이며 선결제 방식까지 도입하면 175.39 USD 가격까지 비용을 절감할 수 있습니다.


5. 결정에 도움이 되었던 사이트


먼저 가장 큰 도움은 역시 AWS 사이트였습니다. 생각보다 잘 정리되어있었고 한글 번역도 제대로 되어있어 읽기 불편함이 없었습니다.

구매 모델
인스턴스 유형

또한, 그 밖에 벤치마크 지표들에 대한 자료는 아래 사이트에서 도움을 많이 받았습니다.

ServerFault


6. 마무리하며…


서비스를 배포해서 운영하는 경우 실제 EC2 비용에 대해 민감하게 반응해야한다고 생각합니다. EC2의 요금모델과 패밀리 비교만으로도 2.5배의 비용 절감 효과를 경험해볼 수 있다는 사실은 새삼 놀라웠고 AWS 클라우드에 대한 지속적인 학습도 필요하다고 생각이 들었습니다.

This post is licensed under CC BY 4.0 by the author.

© HeechanN. Some rights reserved.