aws 프리티어 만료 후 요금 줄이기(스케쥴링)

minyeob·2024년 1월 25일
0

aws

목록 보기
1/18
post-thumbnail

뜨헉!! AWS 요금폭탄 (로드밸런서, EC2 , RDS , Elastic Cache .. etc)

2023 관광데이터 활용공모전 프로젝트 서버의 aws 프리티어 기간이 끝나서 요금이 나오기 시작했다.


오토 스케일링(시간 기반)

일단 다른 계정으로 마이그레이션 하기 전
요금을 조금이라도 줄이기 위해서 엘라스틱 빈스톡의 “오토 스케일링” 기능을 이용해
리팩토링 작업을 하는 낮 9시~ 오후 18시 까지는 인스턴스를 키고 나머지 시간대에는 인스턴스를 끄도록 설정하는 작업을 하였다.

주의! 한국 시간이 아닌 UTC에 맞게 설정해야한다.

위와 같이 CronTab 을 이용해서 해당 시간대에 반복하여 인스턴스의 수를 조절해 주었다. 이번 기회를 통해 서버가 몰릴 시간에는 로드밸런서 및 이 기능을 통해 인스턴스를 좀 더 많이 배치하고 서버가 좀 뜸한 시간대에는 인스턴스를 적게 배치하여 요금을 줄이며 운영 할 수 있는 방법에 대해서 배우게 되었다.


RDS Scheduling(AWS Instance Scheduler)

EC2가 돌아가지 않는 시간대에 RDS도 같이 중지 시켜보도록 하자.

나는 여러가지를 찾아보며 AWS Instance Scheduler라는 것을 통해 RDS의 요금을 줄여보도록 하였다.

AWS Instance Scheduler란?

AWS Instance Scheduler는 EC2및 RDS 인스턴스의 시작 및 중지를 자동화하는 솔루션 입니다.

Instance Scheduler 아키텍처

아키텍쳐 설명

Lambda 함수는 CloudWatch 이벤트를 이용하여 호출이 되며, 스케줄러 호출 간격(Schedule Frequency)마다 실행 된다.

여기서, 일정은 DynamoDB에 테이블에 저장한다. AWS Lambda는 Amazon DynamoDB에 설정한 기간과 일정을 트리거 한다.

Lambda 함수는 실행될 때 마다 값을 검색하며, DynamoDB에 저장된 스케줄 정보와 Instance의 tag값을 기반으로 RDS와 EC2를 조회하고 Instance를 시작하고 중지한다.

AWS 서비스 설명

적용하기

1. AWS CloudFormation에서 스택 생성

아마존에서 제공하는 템플릿 파일을 사용하여 스택 생성. 다음과 같이 Amazon S3 URL 부분에 다음 주소를 붙여넣기.

https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/instance-scheduler.template

2. 스택 세부 정보 지정

Default time zone을 리전이 있는 'Asia/Seoul'로 변경

가장 아래 부분에 Started tags오 Stopped tags 설정. 다음을 클릭

3. 스택 옵션 구성

스택 옵션 구성에서는 기본 값을 그대로 둔 채 다음을 클릭한다.

4. DynamoDB 설정

CloudFormation에서 스택을 생성하면 DynamoDB에도 알아서 테이블이 추가된다.

Config table에 가보면 여러가지 config/schedule/period가 만들어졌을텐데
나는 config를 제외한 나머지 항목들을 모두 삭제하고 진행하였다.

period 항목 생성

JSON 뷰를 통해 위와 같이 period 항목 생성(인스턴스 시작 시간인 9시 5분전에 RDS를 키고 종료 시간인 18시 5분 후에 RDS를 끄도록 설정)

description : 항목에 대한 설명, 필수는 아닙니다.

type : period, config, schedule 등을 지정하는 곳입니다.

name : 항목의 이름입니다. 임의로 하면 되지만, 이걸 Schedule 항목에서 다시 불러와야 한다는 것을 생각하면서 만들어 줍니다.

weekdays : 어떤 요일에 적용할 지 지정할 수 있습니다. mon#1과 같이 지정할 수도 있는데, 이 경우엔 첫번째 월요일이라는 의미입니다.

monthdays : 현재 예시에서는 지정하지 않습니다. 한달 중 특정한 날짜를 지정할 수 있습니다. 1-3이면 매달 1일,2일,3일을 의미하는 식입니다.

begintime : 인스턴스를 시작할 시간. hh:mm으로 형식으로 지정합니다.

endtime : 인스턴스를 종료할 시간. hh:mm으로 형식으로 지정합니다.

참고로 'S'나 'SS'등은 자료형을 나타냅니다.

schedule 항목 생성

timezone : 스케줄이 사용할 표준 시간대입니다. 표준시가 지정되지 않은 경우 기본 시간 UTC로 설정이 됩니다. 서울 리전이라면 'Asia/Seoul'로 설정해 줍니다.

retain_running : 인스턴스가 예정된 종료 시간 이후로 사용자가 임의로 다시 시작했을 때, 이 실행을 막을 지를 설정할 수 있습니다.

stop_new_instance : 인스턴스가 실행 기간 외에 실행되는 경우 태그가 처음 지정될 때 인스턴스를 중지할 지 여부를 선택합니다. 기본적으로 이 필드는 true로 설정됩니다.

period : 아까 시간을 설정한 항목의 이름을 입력해 주어야 합니다.

name : 인스턴스에서 스케줄을 설정할 때 name에 입력한 이름을 주어야 합니다.

5. RDS 태그 설정

인스턴스를 제어할 RDS로 가서 태그를 다음과 같이 설정해 준다.

Schedule의 값은 DynamoDB에서 type을 schedule로 설정한 name의 값을 입력합니다.


느낀 점

이로써 DynamoDB에서 설정한 시간 값으로 RDS 인스턴스가 자동으로 중지하고 시작될 것이다.
여러대의 RDS를 다음과 같이 제어하고 운영하며 요금을 줄일 수 있는 방법에 대해서 공부할 수 있게 되었다. 또한 AWS의 각종 서비스를 사용해보며 Serverless 에 대해 더더욱 공부해 보고 싶어졌다!

다음 포스팅에는 근본적인 해결 방법인 프리티어 계정으로 마이그레이션을 해봐야 겠다!

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글