AWS

[AWS] EC2 인스턴스 스케줄러 적용, 서버 재시작 자동화

Codest 2022. 9. 5. 18:06

안녕하세요! 이번 포스팅에서는 EC2 인스턴스를 원하는 시간대에 중지하고 시작할 수 있게 해주는 스케줄러 기능을 적용하여 인스턴스 비용을 줄일 수 있는 방법에 대해 알아보겠습니다.

 

목차

 

1. Instance Scheduler Architecture

2. CloudFormation - 스택 생성

3. DynamoDB - 테이블 수정

4. 인스턴스에 스케줄러 적용

5. 웹 서버, WSGI restart 자동화

 


1. Instance Scheduler Architecture

 

 

AWS 공식 홈페이지 설명  

 

1. AWS CloudFormation 템플릿은 고객이 정의한 간격으로 Amazon CloudWatch 이벤트를 설정합니다. 이 이벤트는 Instance Scheduler AWS Lambda 함수를 호출합니다. 구성 중에 AWS 리전 및 계정을 정의하고 Instance Scheduler on AWS가 일정을 해당 Amazon EC2 및 Amazon RDS 인스턴스와 연결하는 데 사용할 사용자 지정 태그를 정의하면 됩니다.

 

2. 이러한 값은 Amazon DynamoDB에 저장되며 Lambda 함수는 실행될 때마다 해당 값을 검색합니다. 그런 다음 해당하는 인스턴스에 사용자 지정 태그를 적용할 수 있습니다.

 

3. Instance Scheduler의 초기 구성 중에 해당하는 Amazon EC2 및 Amazon RDS 인스턴스를 식별할 태그 키를 정의합니다. 지정한 이름은 일정 생성 시 태그 지정된 리소스에 적용할 일정을 식별하는 태그 값으로 사용됩니다.

 


2. CloudFormation - 스택 생성

 

 

CloudFormation 서비스 - 스택 - 스택 생성 - 새 리소스 사용(표준)

 

  • 스택 생성 - 템플릿 지정

 

준비된 템플릿을 선택하고 템플릿 URL을 입력합니다.

템플릿 안에 스케줄러에 관련된 모든 설정들이 포함되어있습니다.

AWS에서 제공하는 기본 템플릿 링크입니다. 이를 입력해줍니다.  

 

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

 

 

  • 스택 세부 정보 지정 - 스택 이름

 

스택 이름을 지정해줍니다.

 

  • 스택 세부 정보 지정 - 파라미터

 

Default time zone - Asia / Seoul로 설정해줍니다.

 

Frequency는 스케줄러가 동작하는 주기를 설정하는 것입니다. 30으로 설정하면 30분마다 인스턴스가 켜졌다 꺼졌다 하는데 실제로 우리는 원하는 시간대를 설정하여 스케줄러를 적용할 것이기 때문에 신경 쓰지 않아도 됩니다.

Started tags와 Stopped tags를 사진과 같이 설정해줍니다. 스케줄러를 적용한 후 인스턴스의 동작 상태를 태그로 확인할 수 있습니다.

 

  • 스택 옵션 구성

 

스택 옵션은 따로 건드리지 않고 다음으로 넘어갑니다.

 

  • 검토 -  기능

 

마지막으로 검토 페이지 맨 밑에 기능 부분을 보시면 승인 버튼이 있습니다.

CloudFormation에서 리소스를 생성할 수 있는 권한을 부여하는 것입니다.

체크하고 스택 생성을 누르면 완료입니다.

 

스택을 생성하게 되면 DynamoDB에 스케줄러 세부 설정을 할 수 있는 테이블이 자동으로 생성됩니다.

 


3. DynamoDB - 테이블 수정

 

  • DynamoDB - 테이블 - 항목 탐색 - ConfigTable
 

 

오전 10시 ~ 오후 10시 사이에만 인스턴스가 동작하는 스케줄러를 만들어 보겠습니다.

config, schedule, period 세 가지 type의 항목이 있습니다.

우선 config는 그대로 두고 period와 schedule부터 생성합니다.

저는 config만 남기고 기본적으로 생성되어 있는 schedule과 period는 모두 삭제하고 새로 만들었습니다.

 

  • 항목 생성 - JSON 뷰 (type : period) 

 

type은 period로 적고 name을 지정해줍니다. name인 tenToten은 schedule 항목과 연결할 때 사용되니 기억해야 합니다.

begintime, endtime, weekdays을 설정해줍니다. 차례대로 인스턴스 시작시간, 종료시간, 요일입니다.

 

DynamoDB 데이터 형식에 따르면 S는 String, SS는 String Set 자료형을 의미합니다. 

 

  • 항목 생성 - JSON 뷰 (type : schedule)

 

type은 schedule로 적고 name을 지정해줍니다.

name인 tetnToten-schedule은 인스턴스 태그 설정에서 사용되니 기억해야 합니다.

periods에는 period name인 tenToten을 적어줍니다.

 

  • 항목 편집 - JSON 뷰 (type : config)
 

tagname인 Schedule은 인스턴스 태그 설정에서 사용되니 기억해둡니다.

이미 Schedule로 설정되어 있다면 따로 수정하지 않고 넘어갑니다.

이제 설정은 모두 끝이 났으니 인스턴스에 스케줄러를 적용해야 합니다.

 


4. 인스턴스에 스케줄러 적용

 

EC2 탭에서 적용하고 싶은 인스턴스를 선택한 후 태그 - 태그 관리를 클릭합니다.

state 태그는 무시하셔도 됩니다. 저는 이미 스케줄러를 적용해 놓았기 때문에 인스턴스 상태를 나타내는 state 태그가 자동으로 추가되어있습니다.

인스턴스 태그에 키에는 config 항목에서 봤던 tagname인 Schedule을 적어주고 값에는 schedule 항목의 name인

tenToten-schedule 입력하면 스케줄러가 적용됩니다.

 

 

이제 스케줄러 설정 시간인 오전 10시부터 오후 10시 사이에만 인스턴스가 동작합니다.

이상으로 스케줄러 적용은 끝이 났습니다. 하지만 인스턴스가 중지되었다가 재시작될 때 웹 서버와 WSGI Service를 재시작해줘야 하는 번거로움이 있습니다. 이를 자동화하는 방법을 알아보겠습니다.

 


5. 웹 서버, WSGI restart 자동화

 

저의 배포 환경은 다음과 같습니다.

웹서버 : Nginx

WSGI : Gunicorn

 

sudo systemctl enable [service name]을 입력하면 인스턴스가 재부팅될 때마다 자동으로 service가 재시작됩니다.

[service name]은 개인 설정에 따라 다를 수 있습니다.

 

  • nginx enable

 

nginx 명령어

sudo systemctl enable nginx.service

 

nginx enabled 설정 확인

 

 

  • Gunicorn enable

 

Gunicorn 명령어

sudo systemctl enable seasonality.service

 

Gunicorn enabled 설정 확인

 

 

service name 왼쪽에 초록색으로 enabled라고 되어있으면 재시작 설정이 완료된 것입니다.

마지막으로 인스턴스 중지 후 재부팅했을 때 웹 서버와 WSGI가 제대로 동작하는지 테스트해봅니다. 이상으로 인스턴스 스케줄러 연동에 대한 포스팅을 마치겠습니다.

감사합니다.

반응형