brunch

You can make anything
by writing

C.S.Lewis

by 강진우 Feb 14. 2021

AWS RDS Scheduled start/stop

클라우드의 비용을 최적화할 수 있는 가장 확실한 방법은 Right Sizing 일 것입니다. 용도에 맞는 정확한 사양의 인스턴스를 필요한 만큼 사용하는 것이 비용 최적화의 기본이죠. 그리고 그다음으로는 필요할 때만 사용하는 것이 중요해집니다. Pay as you go 비용 모델에 따라 사용하는 만큼만 과금되는 클라우드의 비용은 불필요할 때는 사용하지 않도록 하는 것이 비용 최적화에 도움이 됩니다. 하지만 이런 작업을 수작업으로 할 순 없습니다. 그래서 이번 글에서는 Lambda를 이용해서 AWS RDS를 스케줄화 해서 관리하는 방법에 대해서 살펴보려고 합니다. 특히 개발/스테이지 환경과 같이 새벽 시간대에는 사용하지 않는 리소스들, 그중에서도 가장 많은 비용이 발생하는 RDS를 대상으로 살펴보겠습니다.


자동화 시스템 구성


이번 글에서 구축하려는 자동화 시스템은 Cloudwatch EventLambda로 구성됩니다.

자동화 시스템 구성도

특정 시간이 되면 (예를 들어 00시) Cloudwatch Event가 깨어나서 Lambda 함수를 호출합니다. 그리고 호출된 Lambda 함수는 경우에 따라 RDS를 시작시키거나 중지시킵니다. 만약 00시에 실행되었다면 RDS를 중지시키도록, 06시에 실행되었다면 시작시키도록 하는 것이죠. 그렇게 해서 새벽 시간대에는 RDS의 비용이 발생하지 않도록 만들어 줍니다.


Lambda 함수 구성


함수의 구성은 간단합니다. RDS를 시작하게 하는 함수와 중지하게 하는 함수를 아래와 같이 구성합니다.

함수의 전체 코드는 https://github.com/DevopsArtFactory/lambda-examples/tree/main/manage-aws-rds 에서 볼 수 있습니다.

시작과 중지의 대상이 되는 DB 클러스터의 ID를 파라미터로 전달받아서 동작합니다.

RDS 시작, 중지 함수

하나의 Go 프로그램 내에서 시작과 중지를 모두 다뤄야 하기 때문에 아래와 같이 Cloudwatch Event 내용을 파싱 해서 지금 발생한 이벤트가 중지시키기 위한 이벤트 인지 아니면 시작시키기 위한 이벤트인지를 확인하는 과정이 필요합니다. 

동작 확인 로직

확인 과정은 event.Resources 의 내용을 파싱 해서 구분합니다. 그리고 여러 대의 DB 클러스터에 대한 작업을 염두에 두기 위해서 DB 클러스터 이름은 환경 변수로 받게 하고, 환경 변수를 콤마로 나누어서 다수의 클러스터에 대한 작업도 가능하게 합니다.


serverless.yml 파일 구성


Go 프로그램이 완성되면 이를 Lambda로 배포하기 위한 serverless.yml 파일도 만들어 줍니다. 앞에서도 이야기했던 것처럼 하나의 Go 프로그램에서 시작과 중지를 모두 다루기 때문에 이벤트를 구분할 수 있는 구분자가 필요하며 이 구분자는 이벤트 정의 시 Name 이라는 파라미터를 이용해 정의해 줍니다.

이벤트 정의하기

그리고 이때 정의된 Name은 Go 프로그램 내에서 event.Resources 를 통해서 참조됩니다.

한 가지 주의해야 할 것은 Lambda 의 스케쥴링은 UTC 기준이라는 것입니다. KST가 아니기 때문에 UTC 기준으로 시간을 변경해서 스케쥴링을 걸어 줘야 합니다.

그리고 Lambda 함수를 실행할 역할에 필요한 권한이 설정되어 있어야 합니다. Go 프로그램이 RDS를 시작, 중지하기 때문에 아래와 같은 권한이 설정되어야 합니다.

Lambda 함수를 위한 IAM 권한 설정

그리고 배포한 후 설정한 시간이 되면 아래와 같이 대상 DB 클러스터가 중지되거나 시작되는 것을 볼 수 있습니다.

stopDBClusterEvent에 의해 DB 클러스터가 중지되는 모습

마치며


오늘은 간단한 Lambda 함수를 RDS를 스케줄화 해서 시작하고 중지하도록 구성해 보았습니다. 불필요한 시간대에는 중지시켜서 비용을 최소하 하는 것이 클라우드를 사용하면서 얻을 수 있는 이점이 아닐까 생각합니다. 이와 마찬가지로 인스턴스들 역시 ASG 내에 있는 Scheduled actions를 통해서 시간에 따라 유동적으로 대수를 조절할 수 있습니다. 

ASG의 Scheduled actions 항목

RDS와 인스턴스 만이라도 불필요한 시간대에 중지시켜 놓는다면 비용 최적화에 한 걸음 더 다가갈 수 있지 않을까 생각해 봅니다. 감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari