EC2 프리 티어를 사용하는 사람이라면, 월 750시간의 t2.micro가 제공되는데 한 달 내내 쉬지 않고 돌려도 750시간을 다 못 쓴다. 그래서 그냥 켜놓고 방치하는 사람이 많고, 나 역시 그런 사람들 중 한명이다. 하지만, 프리 티어를 벗어나게 되면, EC2 인스턴스를 켜 놓은 시간에 비례하여 과금이 되기 때문에 최대한 안 쓸때는 꺼 놓는 게 현명하다. 특히 회사에서 운용하는 개발 서버 같은 경우, 주말에도 짬을 내서 개발을 하거나 야근을 하는 게 아니라면 출근 시간에 맞춰서 켜지고, 퇴근 시간에 맞춰서 끄는 게 현명하다.

 

 

 하지만, EC2 인스턴스가 그냥 크롬 탭 끄고 켜듯이 바로바로 껐다 켜지지도 않고, 무엇보다 이걸 매일 하려면 당연히 귀찮다. 그래서, 아마존에서 Instance Scheduler라는 솔루션을 내놓았다. 이 기능을 활용하여 정해진 시간, 정해진 요일에 인스턴스를 껐다 켰다 하는 작업을 자동화할 수 있다.

https://aws.amazon.com/ko/about-aws/whats-new/2018/02/introducing-the-aws-instance-scheduler/

 

AWS Instance Scheduler 소개

AWS Instance Scheduler는 고객이 Amazon EC2 및 Amazon RDS 인스턴스의 맞춤형 시작 및 중지 스케줄을 손쉽게 구성할 수 있는 솔루션입니다. 이 솔루션은 간편하게 배포할 수 있고 개발 환경과 운영 환경의 운영 비용을 절감하는 데 유용합니다. 정규 업무 시간에 이 솔루션을 사용하여 인스턴스를 실행하는 고객은 해당 인스턴스를 하루 24시간 실행하는 고객과 비교해 비용을 최대 70% 절감할 수 있습니다.

aws.amazon.com

AWS Instance Scheduler 의 구성도

 

 요금은 일단 프리 티어의 이용자라면 무료라고 봐도 좋다. AWS의 CloudFormation과, 위 사진처럼 AWS의 lambda, CloudWatch, DynamoDB 등을 활용하는 서비스인데, 이 서비스들 모두 프리 티어에서 일정량의 처리량을 무료로 제공하기 때문이다. 물론, 학생 수준에서 공부용으로 이용하는 정도로는 차고 넘치는 정도로 용량을 제공한다. 자세한 요금은 위의 각 제품의 요금을 확인하자. 전부 친절하게 계산기까지 구비되어 있다. 

 

 

 크게 3단계로 나뉘어져 있는데, 차례차례 내가 했던 방법대로 설명하겠다.

 

참고 자료 : https://www.contentbloom.com/using-aws-instance-scheduler-to-manage-ec2/

https://medium.com/@ahmeeddhon/using-aws-instance-scheduler-to-reduce-amazon-ec2-or-rds-cost-56c9eb374344

 

 이 글은 위의 두 링크에 나온 방법과 시행착오를 통해 이뤄낸 방법을 기록해 뒀으며, 혹시 이 글대로 했을때 문제가 생기면 위의 링크들을 참고하자. 

 

1. CloudFormation에서 Stack 생성

 

 AWS CloudFormation은 클라우드 환경에서 AWS나 타사의 애플리케이션을 조작하고 제어...한다는데 솔직히 어떻게 쓰는 지는 잘 감이 안 잡힌다. 내가 이해한 바로는, 쉽게 말해 여러 개의 애플리케이션을 조작해야 하는 업무를 한꺼번에 스크립트를 통해 할 수 있도록 만들어주는 솔루션 같다. 

 

https://aws.amazon.com/ko/premiumsupport/knowledge-center/stop-start-instance-scheduler/

 

AWS 인스턴스 스케줄러 및 AWS CloudFormation을 사용하여 인스턴스 중지 및 시작

참고: DynamoDB 콘솔 또는 AWS CloudFormation 사용자 지정 리소스를 사용하여 기간을 생성할 수도 있습니다. us-west-2는 해당하는 AWS 리전으로 바꿉니다. 기간에 대한 자세한 내용은 시작 및 중지 시간을 참조하십시오. 2.    DynamoDB 콘솔을 엽니다. 3.    [테이블]을 선택한 후 구성 테이블을 선택합니다. 참고: AWS Instance Scheduler 템플릿은 상태 테이블과 구성 테이블이라는 2개의 Dynamo

aws.amazon.com

 

 일단 AWS에서 공식적으로 제공하는 설치 방법이다. 그런데, 이 방법대로 하면 나중에 CLI를 조작해야 해서 어려우면서도 귀찮고 중요한 걸 안 알려줘서 처음에 이대로 하다가 좀 애먹었다. 그래서 위의 참고 자료에 나온 영문 링크를 참고해서 작업했다.

 

 일단 지역을 확인한다. EC2의 리전이 서울이었으면 당연히 서울로 하는 게 좋을 것이다. 지역 세팅을 확인했으면 이제 CloudFormation 에 가서 스택 생성을 누른다. 

 

 

 

 

 

 

복붙할 URL은 아래에 준비되어 있다.

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

 

다음을 누른다. 스택 이름을 입력하라는 데 이 값이 나중에 EC2 설정에 쓰이니, 잘 알아볼 수 있는 이름으로 짓자.

 

 

 

 

EC2를 쓴다면 당연히 서비스할 대상으로 EC2를 지정한다.

 

 나는 Schedule이라는 이름으로 지었다. 

이외에도 아래에 이것저것 엄청 많은데 다 건드리지 않아도 되고, 중요한 건 몇 군데 정도다.

 

 

 

 

 

 

영어로 각 항목에 대한 설명이 있으니 딱히 부연 설명은 하지 않아도 될 것이다.

 

 

 

 

 

 

 이 값은 우리의 스케쥴러가 몇 분마다 돌아갈지를 결정한다. 나는 하루에 한 번만 정해진 시간에 인스턴스를 끄도록 만들었기 때문에 30분으로 정했다. 사실 하루에 언제 끄고 언제 켜는지만 정해두는 정도면 10분 이하의 Frequency는 필요하지 않을 것이다. 오히려 너무 간격이 짧으면 그 만큼 lambda 등의 서비스에 트래픽이 많이 생길 것이다.

 

 

 

 

 

맨 아래에 있는 항목들은 다음과 같이 입력해 두자.

 

이제 다음 다음 하다보면 마지막 페이지에 다음과 같은 문구가 보일 것이다.

 

 

 

 

 여기는 체크를 하자. 쉽게 말해, 클라우드를 통한 접근 권한을 주는 것이라고 보면 된다. 

여기까지 하고 스택을 생성하자. 이 스택 생성도 시간이 걸리기 때문에 좀 기다려야 한다.

대시 보드에서 CREATE_COMPLETE라고 뜨면 생성이 완료된 것이다.

 

 

 

 

2. AWS DynamoDB 에서 설정 생성

 

 이제 기본적인 준비는 마쳤고, 원하는 대로 세팅을 할 차례다. 이미 템플릿을 통해 lambda에도 못 보던 애플리케이션이 생겼을 것이고, DynamoDB도 마찬가지다. DynamoDB는 아마존에서 서비스하는 NoSQL DB인데, 여기에 설정값들이 저장되고 이 값을 fetch해서 스케쥴러로 이용하는 구조다. DynamoDB로 들어가 보자.

 

 

 

 

 다음과 같이 테이블 탭을 눌러보면 처음 보는 테이블들이 만들어져 있다. Ec2instanceScheduler는 내가 스택 이름으로 지은 거고, 아마 사람마다 다른 이름이 있을 것이다. 중요한 건 뒤의 ConfigTable과 StateTable이다. StateTable은 함부로 바꾸면 안 되고, 우리는 ConfigTable만 건드리면 된다.

 

ConfigTable을 열어보면 이미 여러 개의 항목들이 예시로 만들어져 있을 것이다. 각 항목들은 json의 구조와 거의 동일하다. type에 config/schedule/period가 각각 있는데, 나중에 열어보면 알겠지만 간단히 설명하자면, schedule 항목에서 기본적인 스케쥴 설정(각종 설정들)을 하고, 시간을 지정하는 항목을  따로 항목으로 분리하여 둔 것이다. 즉, schedule 타입의 항목에서 period 행을 이름을 통해 참조하는 형식이 된다.

 

 config 행은 건들 필요 없고, 나머지 schedule/period type의 행들은 삭제하자. 다 삭제하면 config 타입의 행 하나만 남을 것이다. 이제 우리가 원하는 대로 설정을 할 차례다. '항목 만들기'를 누르자.

 

 

 

 

처음 창을 열면 이 형태로 나와있진 않을 것이다. Tree->Text로 바꿔주고 DynamoDB JSON에도 체크해주자.

 

period 항목을 생성한다. 이제 원하는 대로 설정을 할 차롄데, 각 파라미터는 다음과 같다.

나는 내가 필요한 항목만 적었으니, https://docs.aws.amazon.com/solutions/latest/instance-scheduler/components.html 여기 공식 문서의 Period Definitions를 참고하자. 나보다 훨씬 자세하게 잘 써놓았다.

 

- description : 항목에 대한 설명. 필수는 아니지만 써 놓아서 나쁠건 없다.

- type : 말 그대로 아까 말한 period,config,schedule 등을 지정하는 건데 우리는 period 항목을 만드는 거니 이대로 한다.

- name : 항목의 이름이다. 임의로 하면 되지만, 이걸 Schedule 항목에서 다시 불러와야 한다는 걸 생각하면서 만들자.

나는 office-hours로 이름지었다.

- weekdays : 어떤 요일에 적용할지 지정할 수 있다. mon#1 과 같이 지정할 수도 있는데, 이 경우엔 그 달의 첫 번째 월요일이라는 의미다. 자세한 내용은 위의 문서를 참조하자.

- monthdays : 나는 지정하지 않았는데, 한 달중 특정한 날짜를 지정할 수 있따. 1-3 이면 매달 1일,2일,3일을 의미하는 식이다. 역시 조금 복잡하니 문서를 참조하자.

- begintime, endtime : 인스턴스를 시작할 시간, 종료할 시간을 hh:mm 의 형식으로 지정한다. 나는 begintime을 지정하지 않았는데, 사용하고 싶다면 endtime 항목을 그대로 복사해서 이름만 바꿔서 쓰면 된다.

 

- 참고로, "S" 나 "SS" 등은 자료형을 나타낸다. DynamoDB JSON만의 형식인 것 같다.

 

나는 인스턴스를 켜는 시간은 딱히 지정하지 않고 끄는 시간만 사진과 같이 19:30분으로 지정했다.

https://docs.aws.amazon.com/solutions/latest/instance-scheduler/appendix-e.html 에 다양한 예시가 있으니, 내가 언급한 이외의 스케쥴을 사용할 사람들이라면 참고해 보자.

 

 귀찮은 사람은 아래 코드를 복붙해서 원하는 대로 변형해서 사용하면 될 것이다. 아래의 경우엔 시작 시간으로 8:30분, 종료 시간으로 19:30을 지정한 것이다.

{
  "description": {
    "S": "Shut-down period. Daily (end of the day)."
  },
  "endtime": {
    "S": "19:30"
  },

  "begintime": {
    "S": "08:30"
  },
  "name": {
    "S": "office-hours"
  },
  "type": {
    "S": "period"
  },
  "weekdays": {
    "SS": [
      "mon-sun"
    ]
  }
}

 

이대로 저장하고, 이제 다시 새로운 항목을 만들자.

 

이번엔 아래와 같다.

 

{
  "description": {
    "S": "worktime"
  },
  "enforced": {
    "S": "false"
  },
  "name": {
    "S": "autostop"
  },
  "periods": {
    "SS": [
      "office-hours"
    ]
  },
  "retain_running": {
    "S": "false"
  },
  "stop_new_instances": {
    "S": "true"
  },
  "timezone": {
    "S": "Asia/Seoul"
  },
  "type": {
    "S": "schedule"
  }
}

 

 여기는 주로 설정값이 모여있다. type이나 description은 위에서 언급했고, timezone 역시 서울 리전이라면 다음과 같이 설정한다. retain_running이나 stop_new_instances 등등은 특수한 설정이다. 예를 들어, retain_running은 인스턴스가 예정된 종료 시간 이후로 사용자가 임의로 다시 시작했을 떄, 이 실행을 막을지를 설정하는 여부이다. 이 각각의 설정값에 대한 설명은 역시 아까 언급한 https://docs.aws.amazon.com/solutions/latest/instance-scheduler/components.html

-> Schedule Definitions에 자세하게 설명되어 있으니 참고하자.

 

 중요한 곳은 periods랑 name이다. periods에 office-hours라고 되어 있는데, 이건 아까 내가 정의했던 period 항목의 이름이다. 혹시 다른 이름을 썼다면 이 부분은 그걸로 바꿔주자. name은 인스턴스에서 스케쥴을 설정할 때 이 이름을 쓰게 되니까 잘 지어주자. 나는 autostop이라고 지었다. 자동으로 인스턴스를 중지해 주니까!

 

 역시 위 코드를 본인 필요한 대로 잘 지지고 볶아서 저장한다.

 

 

 

 

3. 인스턴스에 설정한 스케쥴 적용하기

 

 이제 거의 끝났다. EC2 -> 인스턴스 로 들어간다. 대시보드에 들어가자.

 

 

 

 

 결론적으로 만들어지는 결과값은 다음과 같다. 태그는 키:값으로 이루어져 있는데, 키에는 위에서 입력했던 CloudFormation의 스택 이름, 값에는 아까 dynamoDB에서 만들었던 schedule 항목의 이름으로 해 주자! 헷갈릴거 같아서 내가 지었던 이름엔 위에서 모두 밑줄을 쳐 놨으니 참고하자. 태그를 추가하는 방법은 일단 만들어진 인스턴스를 아무거나 눌러보자.

 

 

 

 

태그 창에 가서 태그 추가/편집을 누르면 UI가 직관적이라 금방 수정이 가능할 것이다.

 

 

 

 사실 다 하고 보면 별 게 아닌데, 나 같은 학생이나 AWS에 갓 입문한 사람이라면 난생 처음 들어보는 서비스 여러 개를 서로 상호작용 하도록 만드는 거라 좀 복잡해 보인다. 그래도, 막상 해보니까 그냥 생소한 게 많아서 그렇지 복잡한 로직이 아니고, 진짜 귀찮은 건 이미 AWS에서 만들어준 스크립트들이 알아서 해 주고 있기 때문에 비교적 편하게 할 수 있었던 것 같다. 

 

- 틀린 점이나 수정할 점은 언제든 댓글로 남겨 주시면 감사하겠습니다.

+ Recent posts