DevOps는 전체 인프라스트럭쳐의 구축 및 관리뿐만이 아니라,
추가 리소스(예를 들어, 클라우드 리소스)를 사용할 경우, 이를 사용할 때의 비용을 최적화하는 것 또한 신경 써야 한다.
IBM에서는 이와 관련한 FinOps라는 용어를 소개하고 있다. finance와 DevOps의 합성어로,
클라우드 비용을 최적화하는 기술을 의미한다. 클라우드 리소스를 사용할 경우, 리소스의 효율성과 가치를 높이기 위해 협업하는 것이다.
https://www.ibm.com/kr-ko/topics/finops
FinOps란 무엇입니까? | IBM
FinOps는 하이브리드 및 멀티클라우드 환경에서 비즈니스 가치를 극대화하는 것을 목표로 하는 클라우드 재무 관리 분야이자 문화적 관행으로 발전하고 있습니다.
www.ibm.com
컨테이너 기술을 많이 사용해서 배포하는 입장에서, Docker Image를 저장하는 Docker Registry로써
일반적으로 Docker Hub를 많이 사용한다. Docker Hub의 경우, 1개의 private Repository를 무료로 제공하고 있고,
여러 개의 public Repository를 사용할 수 있다.
반면, AWS도 Elastic Container Registry(이하 ECR)라는 Docker Registry를 제공한다.
그러나 Docker Hub와는 다르게 비용적인 압박이 어느 정도 있다. 하지만 대부분의 리소스를 AWS에서 사용한다면,
ECR을 통해서 도커 이미지를 관리하는 것 또한 나쁘지 않은 선택이다.
1. AWS Elastic Container Registry
AWS에서 제공하는 Docker Registry이다. Docker Hub와 동일하게 private, public repository를 제공한다.
다음과 같은 두 가지 특징이 있다.
- private
- region 별로 다르겠지만, ap-northeast-2(서울 region)에 저장이 가능하다.
- 이미지 암호화를 제공한다.
- public
- region 별로 다르겠지만, ap-northeast-2(서울 region)에 저장이 불가능하다.
참고로, 이전에는 us-east-1 region에서 사용했었다.
- region 별로 다르겠지만, ap-northeast-2(서울 region)에 저장이 불가능하다.
서울 region에 저장이 가능하기에 private쪽으로 눈이 가는 것은 당연할 것이다.
그러나...
2. ECR의 요금 편성
https://aws.amazon.com/ko/ecr/pricing/
완전관리형 컨테이너 레지스트리 - Amazon Elastic Container Registry 요금 - Amazon Web Services
데이터 "수신" 및 "송신"은 Amazon ECR에서 데이터를 수신하고 송신하는 것을 말합니다. 동일한 리전의 Amazon ECR 및 기타 서비스 사이에서 전송된 데이터(예: Amazon EC2, AWS Lambda, AWS App Runner 또는 AWS Farg
aws.amazon.com
https://calculator.aws/#/createCalculator/ECR
AWS Pricing Calculator
calculator.aws
계산은 위의 페이지에서 할 수 있다.
공식 홈페이지에서 제공하는 ECR의 요금 편성은 다음과 같다.
- 크게 Storage + 데이터 송/수신 비용 으로 나뉜다.
- Storage
- private : Storage가 500MB까지 프리티어 한도이고, 이후 1GB당 0.1 달러의 비용이 청구된다.
- public : 50GB까지가 프리티어 한도이고, 이후 1GB당 0.1 달러의 비용이 청구된다.
- 송/수신 비용
- private : 같은 리전 내로 송/수신을 진행할 경우 한도가 없다.
같은 서울 리전일 경우에는 무료라고 계산기에 나온다. - public : repository에 저장을 위한 수신은 무료,
- repository 송신의 경우, 두 가지로 나뉜다.
- AWS 인증 계정이 아닌 경우 500GB 프리티어 한도, 이후 GB당 0.09달러가 청구된다.
- AWS 인증 계정인 경우, 5TB가 프리티어 한도, 이후 GB당 0.09달러가 청구된다.
(리전 외 위치로 송신할 경우 그렇지만, 서울은 public repository가 없기에 이것을 사용한다고 생각하자.)
- repository 송신의 경우, 두 가지로 나뉜다.
- private : 같은 리전 내로 송/수신을 진행할 경우 한도가 없다.
3. 지난번 2달간의 프로젝트 기준으로 public, private repository 사용한 비용 계산
지난 2달 간의 프로젝트에서 우리는 총 170번의 이미지 생성을, 그리고 백엔드는 spring boot를 사용해서
이미지 당 평균적으로 250MB의 저장 공간을 사용했다.
그리고 선형적인 빈도로 이미지를 생성 및 저장하고, 기존에 생성된 이미지의 삭제는 없다는 고려하에 다음과 같이 계산이 가능하다.
- 첫 달 평균 storage 10.6 GB / 두 번째 달 평균 storage 31.9GB / 매달 약 21.25GB 송신
- public repository를 사용할 경우, 모두 프리티어 한도 내 이므로 두 달간 0달러의 청구 비용 (실제로 이때는 public의 비용 조건이 괜찮아 보여서 이를 사용했고, 그래서 ECR의 청구 비용은 없었다)
- private repository를 사용할 경우, 첫 달은 약 1달러, 두 번째 달은 약 3.14달러의 storage 비용이 청구
송/수신 비는 같은 리전에서 서비스 했으므로 무료라고 한다면, 두 달 간 합쳐서 약 4.14달러의 비용이 청구된다.
4. 이를 기반으로 현재 프로젝트에서 사용될 비용을 유추해 보자.
동일한 빈도, 그렇지만 이번에는 spring boot의 멀티모듈을 사용해서 이미지 저장용 레포지토리를 2개를 생산할 것이다.
이번에도 같은 선형적인 빈도, 같은 2달간 170번의 이미지 생성, 250MB의 이미지 용량을 가정할 때 다음과 같이 계산이 가능하다.
- 첫 달 평균 21.2GB / 두 번째 달 평균 63.8 GB / 매달 약 42.5GB 송신
- public repository를 사용할 경우, 첫 달은 무료, 두 번째 달은 평균 1.38 달러의 storage 비용.
그리고 송/수신 비용의 경우도 프리티어 한도 내이므로 무료라고 할 수 있다. (이상적인 조건에서 그렇다.)
=> 두 달 총 1.38 달러의 비용 청구 - private repository의 경우, 첫 달 비용 2.08달러, 다음 달은 6.33달러, 송/수신 비용은 무료이다. 두 달 총 8.41달러
아무리 봐도 public의 가성비를 private이 따라올 수가 없다. 그런데 왜 private을 사용해야만 할까?
5. 외부 위협에 시달리는 public repository
public은 다음과 같은 두 가지 문제점에 직면한다.
- 모두가 이미지를 다운로드하여 사용할 수 있기 때문에, 해당 이미지를 사용한 비즈니스 로직과 민감정보가 노출될 가능성이 존재한다.
- 악의적인 image pull을 통해 송신 비용이 감당되지 못할 정도로 커질 가능성이 존재한다.
만약 작정하고 악의적으로 image를 무작정 pull 할 경우, 5TB의 프리티어 송신 한도는 금방 넘어갈 것이다.
그렇기 때문에 이미지 암호화도 제공하고, 제한된 사용자만의 pull이 허용 가능해 송신 한도를 제어할 수 있는 private repository를
비용이 어느 정도 들더라도 사용할 수밖에 없는 것이다.
6. 그렇다면 어떻게 private repository를 통한 비용 절감을 노릴 수 있을까?
앞서 2의 비용항목에서 private repository의 비용문제는 결국 Storage에 달려있고 저장용량의 최적화로 해결할 수 있음을 알 수 있다.
앞서 이미지 storage 계산은 전부 해당 이미지들을 삭제하지 않는다는 판단 하에 계산된 비용들이다.
우리가 docker를 통해서 CI/CD를 한다고 가정했을 때,
만약 현재 최신 image의 생성이 잘 이루어졌다면 기존에 있던 이미지를 rollback용으로 두고,
그 이전의 이미지는 굳이 소유하고 있을 필요가 없다. 만일에 경우에 대비하더라도 1~2개 정도의 이전 버전의 이미지만을 저장해 두면 된다.
그러면 멀티 모듈이라는 전제하에 단일 환경(dev 환경) 기준 4~6개의 이미지만을 저장해 두면 될 것이고,
이는 약 1~1.5GB의 용량으로 프리티어 조건을 제외하면 월별 0.2 달러 내의 비용만으로 관리를 하는 식으로 보완이 가능해진다.
그리고 이는 Life Cycle Policy를 통해서 자동적인 관리가 가능하다.
지금은 좌측 Nav Bar에서 사라졌는데, 다음과 같이 적용할 수 있다.

여기로 들어간 후 아래처럼 작성한다면 un-tag 된 2개 이미지를 제외하고 나머지는 삭제되도록 수명 주기를 컨트롤할 수 있다.

수명 주기 관련 공식 문서
https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/lp_creation.html
Amazon ECR의 리포지토리에 대한 수명 주기 정책 생성 - Amazon ECR
문자열당 와일드카드(*) 는 최대 4개로 제한됩니다. 예를 들어, ["*test*1*2*3", "test*1*2*3*"]은(는) 유효하지만 ["test*1*2*3*4*5*6"]은(는) 유효하지 않습니다.
docs.aws.amazon.com
'연재작 > DevOps' 카테고리의 다른 글
AWS 무중단 배포 도입기 feat. CodeDeploy (0) | 2025.03.10 |
---|---|
Terraform 핵심 프로세스 (0) | 2025.01.29 |
Terraform을 통한 Infrastructure Provisioning (1) | 2025.01.27 |
MSA의 분산 트랜잭션, Saga 패턴 (1) | 2024.11.21 |
EC2 Tomcat Server pipeline 구축 + S3 정적 웹서버와 연동 (1) | 2024.11.09 |