본문으로 바로가기

[AWS] Instance scheduler 적용하기 (자동 stop/start)

category IT/AWS 2023. 12. 22. 15:13
반응형

Intro

AWS는 몇몇 기능들을 AWS웹콘솔상에 직접 리소스나 기능으로 구현해주는 형태가 아닌 cloudformation 템플릿을 제공해서 기능을 제공해주는 사례가 몇몇 있습니다. 그 예가 AHA(AWS Health Aware) 나 AWS DLT(Distributed Load Testing) 같은 것들이 있는데요. 오늘 소개해드릴 Instance scheduler 도 aws에서 제공해주는 cloudformation 템플릿으로 아키텍처를 배포하여 instance scheduler 기능을 사용할 수 있습니다.

Instance scheduler란?

Instance scheduler는 AWS의 대표적인 인스턴스인 ec2와 rds를 원하는 시간대에 stop/start를 자동화 하여 스케줄링을 할 수 있도록 해주는 아키텍처 구성을 말합니다. AWS에서 제공해주는 cloudformation으로 쉽게 구현이 가능한데요. 인스턴스 스케줄러를 사용하면 EC2 및 RDS를 특정 시간대에만 사용하여 비용을 절감 할 수 있겠죠.

아키텍처

Instance scheduler 템플릿을 배포하고 나면 instance schdule 라는 기능이 AWS웹콘솔상에 생기는건 아니고 아래와 같은 구성으로 aws리소스들이 배포가 됩니다. 그리고 나서 ec2와 rds에 스케줄링을 할 수 있도록 리소스에 태그를 넣어주기만 하면 됩니다.

구현 가이드

과거에는 이를 구현하기위해 직접 Lambda로 python의 boto3로 직접 코딩하고, 직접 event bridge를 구성해야 했는데요. AWS의 멋쟁이 형님들이 이 것들을 하나의 cloudformation template으로 배포할 수 있도록 제공해주기 때문에 간단히 구현할 수 있게 되었습니다. 제 경험을 말씀드리면 과거에 하나의 lambda 함수로 구현하려다보니 원하는 여러 시간대를 컨트롤 하기가 어려웠는데요, 이 구성에서는 dynamodb의 테이블을 사용해서 원하는 다양한 스케줄을 db형태로 저장해둘 수 있게 해주었습니다. (넘나 좋은 것..) 자 그럼 한번 따라해보도록 하죠

  • AWS에서 제공해주는 구현 가이드와 템플릿은 아래 URL에서 확인할 수 있습니다. 우선 아래 URL에서 템플릿을 다운로드 받습니다.
  • 다운 받은 파일로 cloudformation 스택을 생성합니다.
  •  
  • 해당 cloudformation의 파라미터들을 아래와 같은 정보로 cloudformation을 생성합니다.
  • Scheduler (version v1.5.3)
    • Instance Scheduler tag name : Schedule
    • Service(s) to schedule : EC2
    • Schedule Aurora Clusters : No
    • Create RDS instance snapshot : No
    • Scheduling enabled : Yes
    • Default time zone : Asia/Seoul
    • This account : Yes
    • Frequency : 5 (람다 함수를 트리거 해주는 주기)
    • Memory size : 128M
    • Namespace : (자유롭게 입력)
    • Use AWS Organizations : No
    • Organization Id/Remote Account Ids : (생략)
    • Region(s) : (생략)
    • Enable CloudWatch Metrics : No
    • Enable CloudWatch Debug Logs : Yes (해당 로그로 람다 함수가 잘 돌아갔는지 확인가능)
    • Enable SSM Maintenance windows : No
    • Log retention days : 30
    • Started tags : InstanceScheduler-LastAction=Started By {scheduler} {year}/{month}/{day} {hour}:{minute}{timezone} (람다 함수가 잘 돌아 갔다면 해당 형태로 태그가 생성되어 최근 동작한 상태를 확인할 수 있음)
    • Stopped tags : InstanceScheduler-LastAction=Stopped By {scheduler} {year}/{month}/{day} {hour}:{minute}{timezone} (람다 함수가 잘 돌아 갔다면 해당 형태로 태그가 생성되어 최근 동작한 상태를 확인할 수 있음) 
  • 아래와 같이 생성된 dynamodb table 에 item을 복사하여 추가 합니다.
    • [xxx-instance-scheduler-ConfigTable-xxx]- [uk-office-hours] - [Duplicate item]
    • 이렇게 item을 추가하는 이유는 schedule이라는 타입에 uk와 seattle의 office-hours만 생성되어 있기 때문에 원하는 office-hours의 item을 생성해주는 작업입니다.
      • name : seoul-office-hours (이름은 자유롭게 변경해도 상관없음. ec2 tag에 사용 됨)
      • description : Office hours in Seoul
      • timezone : Asia/Seoul
    • 위에서 복사하여 만든  seoul-office-hours item속성에서 periods 타입을 보셨나요? office-hours라고 설정이 되어있는데요. 아래와 같이 해당 ddb테이블에서 period 타입의 office-hours 에서 실제 start/stop할 시간을 가져오게 되어있습니다.
    • 그래서 해당 item을 선택하고 실제 반영할 시작/종료 시간을 입력 해주면 됩니다.
  • 자 그럼 이제 스케줄링을 걸고 싶은 EC2의 태그를 다음과 같이 설정하기만 하면 끝 입니다. 
    • Key : Scheduler (대소문자 반드시 구분 필요)
    • Value : seoul-office-hours

마무리

어떤가요? 참 쉽죠? 마무리 하면 AWS에서 제공해주는 Instance scheduler의 cloudformation 템플릿으로 아키텍처를 배포하고, ddb(dynamodb)에 원하는 scheduler item을 추가하고, period 속성으로 설정되어있는 offie-hours에 원하는 시간을 입력하고 마지막으로 EC2의 태그에 Scheduler와 생성한 scheduler item 명을 값으로 입력하면 되는 겁니다. 근데, 그냥 웹콘솔상에서 기능으로 구현해주면 좋지 않았을까 하는 생각을 해보게 되는데요. 아무래도 웹콘솔 개발자분들이 너무 바빠서? 또는 비싸서? AWS solutions architecture 들이 AWS 리소스를 조합하여 cloudformation 형태로 제공해주는건 아닐까 싶네요. AWS 웹콘솔이 계속 바뀌고 있고, 좋아지긴(?)하지만 (너무 자주 바뀌어서 헷갈림) 이런 작고 소중한 기능들도 추가되었으면 좋겠습니다.

끝 :)

 

반응형