클라우드 환경에서 서비스를 운영하다 보면, 나도 언제 생성했는지 모르는 리소스나 쓰임이 명확하지 않은 리소스들이 있다.
그런 경우 임시 방편으로 EC2
의 경우에는 인스턴스 중지를, RDS
의 경우에는 중지 후 최종 스냅샷을 생성 후 삭제 등 다양하게 리소스를 관리하게 된다.
그렇게 되면, 해당 EC2와 관련된 EBS
혹은 ELB
는 중지 상태로 유지할 수 없으니 삭제하지 않는 한 비용이 발생하게 된다.
또 남겨진 스냅샷의 경우에도 이제는 이게 쓰임이 있는 리소스 였는지, 아니였는지 정말 무한의 굴레에 빠지게 된다.
리소스를 삭제할수도 없는 이러한 상황에서 비용을 아낄 수 있는 가장 효율적인 방법을 일부 소개하려고 한다.
실제로 우리 회사에서는 해당 방법들을 적용시킨 이후에 비용을 무려 약 53.87%나 감소했다.
Savings Plans
첫번째는 현재 운영 중인 리소스에 대해 비용 절감을 할 수 있는 방법인 Savings Plans
이다. 해당 기능은 컴퓨팅 리소스만 적용할 수 있는 할인 플랜이다.
여기서 컴퓨팅 리소스라 함은 Amazon EC2
, AWS Lambda
및 AWS Fargate
가 있다.
Savings Plans는 다음과 같은 두 가지의 플랜을 제공한다.
Compute Savings Plans
: EC2, Lambda, Fargate용EC2 Instance Savings Plans
: EC2 전용
얼핏보면, 둘 다 EC2를 할인할 수 있는 플랜이기 때문에 뭐가 다른지 헷갈릴 수 있지만, Compute Savings Plans에 EC2 인스턴스 할인을 적용할 때는 특정 인스턴스 패밀리(ex. t2
, m4
, t4g
등) 를 지정하지 않고 할인 플랜을 적용시킬 수 있다.
반면 EC2 Instance Savings Plans는 특정 인스턴스 패밀리를 지정해줘야 한다. 하지만, Compute Savings Plans보다 최대 할인율이 약 6%정도 더 높다.
현재 운영하고 있는 서비스에서 사용하고 있는 특정 인스턴스 패밀리 셋이 정해져 있다면, EC2 Instance Savings Plans를 적용하는게 가장 비용 효율적이다.
그래서 적용하기 이전에 먼저 현재 운영하고 있는 리소스의 현황 파악 및 약정 요금 계산이 우선이다.
약정 요금은 Savings Plans 요금 소개 페이지에서 확인할 수 있다.
예를 들어, 1년동안 선결제 없이 ap-northeast-2(서울)
리전에서 사용한다고 가정하고 여러가지 케이스를 두고 설명하자면
EC2 인스턴스는
t3a.small
이 2개,t3a.medium
이 3개는 고정적으로 사용하는 리소스이고, 그 외의 사용하는 EC2는 변동이 많다. 그리고 Fargate에서는 CPU는 총 8vcpu를, 메모리를 총 16GB 사용하는 워크로드고정으로 사용하는 EC2 리소스는 EC2 Instance Savings Plans를, 나머지 변동이 있는 EC2 리소스와 Fargate 리소스는 Compute Savings Plans를 적용한다.
플랜 종류 시간 당 금액 (USD) EC2 Instance Savings Plans t3a.small(0.0141) * 2 + t3a.medium(0.0283) * 2 = 0.1131 Compute Savings Plans Fargate CPU(0.037248) * 8 + Fargate Memory(0.004088) * 16 = 0.363392 + α(변동 EC2 인스턴스)
EC2 인스턴스만 고정적으로 사용하는 경우
- 사용하는 인스턴스 패밀리만 계산하여 EC2 Instance Savings Plans를 적용
Savings Plans는 종량제이므로 사용하는 총 금액을 계산하여 지정해주면 된다.
1번 케이스를 기준으로 Savings Plans를 적용하는 방법은 간단하다.
AWS 콘솔에서 Savings Plans
를 검색하고 선택한다.
AWS Cost Management > Savings Plans > Purchase a Savings Plan 메뉴로 들어간다.
우선 Fargate 및 유동적인 EC2 인스턴스 리소스에 대한 할인을 적용한다.
Compute Savings Plans를 선택하고, Term(약정 기간), Hourly commitment(시간 당 약정 금액), Payment option(결제 옵션)을 설정하여 선 결제 없이 1년 동안 시간 당 0.45 달러를 약정한다.
결제 옵션에서 부분 선결제 혹은 전체 선결제를 선택하면 할인율이 더 높아진다.
시작 일자를 지정할 수 있다. UTC 기준이므로, 9시간 느리게 지정해주면 된다. 제일 아래 항목에서 요약된 내용을 볼 수 있고, 한 달에 총 얼마를 약정했는지 알 수 있다.
이제 나머지 고정적으로 사용하는 EC2 인스턴스 리소스에 대한 할인을 적용한다.
EC2 Instance Savings Plans를 선택하고, 아까와는 다르게 리전과 인스턴스 패밀리를 지정한다.
그리고 1번 케이스에 대해서 계산한대로, 약정 금액을 넣어준다.
두 가지의 약정을 카트에 담고 확인한 뒤 submit order 버튼을 눌러 구매하면 시작 일자를 기준으로 약정이 시작된다.
예약 인스턴스
EC2도 예약 인스턴스를 지정할 수 있다. 앞서 설명한 Savings Plans
보다 할인율이 약 최대 3%정도 높다. 하지만, 예약 인스턴스는 인스턴스 패밀리 단위도 아닌 지정된 인스턴스 타입을 지정해야 하기 때문에 좀 더 제한적이다.
때문에, 리소스를 탄력적으로 사용하기 위해 사용하는 서비스이니 만큼 관리의 편의성을 위해 필자는 컴퓨팅 리소스들은 Savings Plans를 적용했다.
할인을 받을 수 있는 방법은 다양하다. 현재 사용하고 있는 워크로드의 특성에 맞춰서 가장 효율적인 방식으로 적용하는 것이 중요하다.
하지만, Amazon RDS
는 예외다. 아직 Savings Plans를 적용할 수 없기 때문에, 예약 인스턴스를 지정해줘야 한다.
각 RDS 엔진 소개 페이지에서 요금표을 확인할 수 있다.
예약 인스턴스를 구매하려면, RDS > Reserved instances > Purchase Reserved DB Instance 메뉴로 들어간다.
Product description(RDS 엔진), DB instance class(인스턴스 타입), Deployment Option(AZ 설정 여부), Term(약정 기간), Offering type(결제 옵션)을 선택한다.
위의 옵션을 기준으로 Number of DB instances(약정 구매할 인스턴스 개수)를 지정하고, Submit 버튼을 클릭하여 구매한다.
EC2 인스턴스 스냅샷 아카이빙
AWS를 사용하다보면, EC2 인스턴스를 장기적으로 중지해두는 경우가 있는데 이런 경우 스냅샷이 좀 더 비용 효율적이기 때문에 스냅샷 형태로 보관하는 경우가 좋다.
또, 장기적으로 보관하는 스냅샷이기 때문에 90일 이상 복원할 필요가 없는 인스턴스도 있다.
이 경우에는 스냅샷 아카이빙
을 해주면 된다. 스냅샷은 매월 0.085USD/GB, 스냅샷 아카이빙은 매월 0.0125USD/GB가 청구되기 때문에 비용이 약 68%가 절감된다.
하지만, 고려 사항 및 제한 사항이 여러 가지 있다. 최소 90일 동안은 복원을 못한다든가, 복원하는데 72시간이 걸린다든가 등의 조건이 있으니, 참고하여 설정하면 된다.
EC2 > Elastic Block Store > Snapshots 메뉴로 들어가서, 아카이빙할 스냅샷을 선택하여 Archive snapshot을 클릭한다.
Archive snapshot을 클릭하여 아키이빙 한다.
다시 스냅샷 목록을 확인해보면 Storage Tier가 Standard
에서 Archive
로 변경되고 있다.
아무래도, 스냅샷이 많을 수 있기 때문에 AWS CLI
를 활용하는 것을 권장한다.
사용하지 않는 ELB 삭제
중지된 인스턴스에 연결된 ELB
의 경우 중지가 불가능하고 그렇다고, 삭제하기가 애매하다. ELB 개수가 많지 않다면 상관 없지만, 많으면 많을수록 설정 상태를 기억 혹은 저장해두기 어렵기 때문이다.
이럴 때는 Terraform
을 사용하여 현재 AWS 리소스 상태를 그대로 코드로 가져와 나중에 필요할 때마다 프로비저닝할 수 있도록 하면 된다.
Terraform에서 기본적으로 제공하는 import
기능은 리소스의 현재 상태 파일만 가져오기 때문에, 이것을 코드화 시키기 위해서는 Terraformer
라고 하는 GCP에서 제공해주는 도구를 사용하면 된다.
Terraform 및 Terraformer에 대한 내용은 여기서 자세히 다루지 않겠다.
Terraformer를 설치하고 아래의 명령어를 이용해 Terraform 코드로 import하면 된다.
> terraformer import aws --resources=alb --regions=ap-northeast-2
2023/02/27 16:06:20 aws importing region ap-northeast-2
2023/02/27 16:06:21 aws importing... alb
2023/02/27 16:06:21 aws done importing alb
2023/02/27 16:06:21 Number of resources for service alb: 1
2023/02/27 16:06:21 Refreshing state... aws_lb_listener.tfer--arn-003A-aws-003A-elasticloadbalancing-003A-ap-northeast-2-003A-523389639253-003A-listener-002F-app-002F-example-002F-33bbdabda99537b8-002F-fe5491ec08e090e6
2023/02/27 16:06:21 Refreshing state... aws_lb_target_group.tfer--example-tg
2023/02/27 16:06:21 Refreshing state... aws_lb.tfer--example
2023/02/27 16:06:22 Filtered number of resources for service alb: 1
2023/02/27 16:06:22 aws Connecting....
2023/02/27 16:06:22 aws save alb
2023/02/27 16:06:22 aws save tfstate for alb
제대로 import 됐는지 확인한다.
> cd generated/aws/alb
> ls -l
total 88
-rwxr-xr-x 1 southouse staff 805 Feb 27 16:06 lb.tf
-rwxr-xr-x 1 southouse staff 523 Feb 27 16:06 lb_listener.tf
-rwxr-xr-x 1 southouse staff 3385 Feb 27 16:06 lb_target_group.tf
-rwxr-xr-x 1 southouse staff 953 Feb 27 16:06 outputs.tf
-rwxr-xr-x 1 southouse staff 128 Feb 27 16:06 provider.tf
-rwxr-xr-x 1 southouse staff 17881 Feb 27 16:06 terraform.tfstate
-rwxr-xr-x 1 southouse staff 136 Feb 27 16:06 variables.tf
이제 사용하지 않는 ELB를 지우고, 나중에 필요할 때는 해당 파일에서 terraform apply
를 하면 된다.
그 외 다양한 방법
AWS 비용을 줄일 수 있는 방법은 이것 외에도 굉장히 다양하다. 예약 인스턴스도 RDS 뿐만 아니라 Redshift, ElastiCache 및 Elasticsearch에서도 적용이 가능하다.
또, S3 스토리지를 사용한다면 객체 수명 주기 정책 혹은 스토리지 계층을 변경하여 비용을 줄일 수 있다.
사용하는 워크로드, 애플리케이션마다 다양한 방법이 있기 때문에, 적절한 방법을 선택하여 비용 그리고 관리적 측면에서 비용 감소를 고려하는 것이 가장 중요하다.