[DEVOPS] Decreased RDS Cost by 20% by making RDS Scheduler with EventBridge on Serverless Architecture
TABLE OF CONTENTS
1. How can I decrease cost of RDS usage?
RDS는 정지되면 7일만 정지되고 그 이후에는 자동적으로 다시 살아나므로 이번 실습에서는 lambda가 정지를 하고 일주일에 한 번씩 RDS가 사용되는지 체크하고 사용 안되면 정지시키는 RDS Scheduler 격인 lambda를 만들어보도록 한다.
일단 동작 Flow를 보도록 하자.
일단 이번에는 api gateway를 통해 lamba를 trigerring시켜서 rds를 멈추게 만든거 까지만 구현을 하고 이걸 나중에 알아서 EventBridge를 사용해서 cron 성격으로 변환해주도록 하자.
작업 순서는 아래와 같다.
일단 rds가 뜰 subnet Group을 만든 후 RDS 인스턴스/클러스터를 이 subnet group 위에 생성한 후 lambda가 사용할 IAM role을 생성한 후 소스 코드를 작성 후 lambda에 배포 후 테스트를 진행 한다.
2. Decreasing RDS cost
먼저 vpc는 그냥 default vpc를 사용하고, subnet은 2개를 만들어 준 다음(aws의 경우 맨 초기에 default vpc가 1개, default subnet이 4개가 생성이 되어 있는게 초기 세팅값이다) subnet을 만들어주자. DB instnace는 언제나 subnet group위에 떠야 하므로 subnet group을 만들어주자. subnet group Name은 현재 환경이름인 “dev”를 적어주고 vpc는 내가 만들었던 vpc를 선택해주고 az는 언제나 최소 2개 이상의 az를 선택해야 한다.
이렇게 subnet group이 만들어졌다면 Create db를 하되 test 용이므로 그냥 freetier를 사용하도록 하자. port 같은 경우도 mysql의 3306 같은 wellknown db service port가 아니라 custom port인 3310같은 것으로 지정해줘서 보안상으로 더 안정적으로 만들어주자.
이제 iam policy를 만들어줘야하는데 RDS를 stopDBCluster와 StopDBInstance라는 Action을 부여해주고 CloudWatch Logs를 생성할 수 있는 Action(CreateLogGroup, CreateLogStream, PutLogEvents) 또한 만들어주자. 또한 하나의 Lambda가 또 다른 Lambda를 실행할 수 있는 Action(InvokeFunction) 또한 추가해준 다음 이 policy를 구분할 수 있는 tag까지 만들어준 다음 생성을 완료해주자.
이제 IAM policy 생성이 끝났으므로 이 IAM policy를 담고 있는 IAM role를 생성해주자.
이제 소스코드를 작성해주자.
먼저 main.go의 Handler에는 getAwsSession()을 해서 stopRDS()를 해주자.
stopRDS()는 먼저 AWSSession을 활용해서 rds instance / Cluster과 connection을 맺은 후 stopdb를 해준다.
이후 go mod tidy → make build를 해서 정상적으로 빌드가 되는 것을 확인한번 해보고, serverless.yml에서 내가 만들어뒀던 IAM Role이 Lambda에 물리도록 이 IAM Role의 arn을 적어두고 배포를 해주자.
이제 테스트도 정상 수행 되는 것을 확인해주자.
그리고 rate(7 days)로 최대 정지기간인 일주일마다 정지 여부를 판단하기 위해 serverless framework 공식문서에 존재한 schedule 기능을 구현하도록 하자.
또한 지금은 db가 static하게 그 이름이 hardcoding으로 들어가 있는데 만약 db가 동적으로 늘어난다면 코드의 품질을 위해서 list로 가져와서 이 db list에 있는 것들을 stop시킬 수 있도록 하자.
또한 지금은 stopRDS 밖에 없는데 startRDS도 IAM Role에 action을 추가해줘서 따로 구성해주자.
배포가 완료되면 endpoint가 나오게 되고 이 endpoint로 curl 명령어를 날려서 db를 stop 상태로 만들어주자.
[Reference]
1. https://www.serverless.com/framework/docs-providers-aws-events-schedule
Serverless Framework - AWS Lambda Events - Scheduled & Recurring
The Serverless Framework documentation for AWS Lambda, API Gateway, EventBridge, DynamoDB and much more.
www.serverless.com
Schedule - AWS Serverless Application Model
EventBridge 이제 새로운 예약 기능인 EventBridge SchedulerAmazon을 제공합니다. EventBridge SchedulerAmazon은 하나의 중앙 관리형 서비스에서 작업을 생성, 실행 및 관리할 수 있는 서버리스 스케줄러입니다. Ev
docs.aws.amazon.com