AWS 환경에서는 AutoScalingGroup은 통해서 간편하게 서버의 대수를 유지할 수 있습니다. 트래픽이 늘어나거나 줄어듦에 따라 EC2 인스턴스를 직접 늘리거나 줄이지 않아도 desired, min, max의 수를 변경하는 것만으로도 EC2 인스턴스의 대수를 조절할 수 있기 때문입니다. 만약 AutoScalingGroup이 없었다면, EC2 인스턴스를 하나하나 런칭 시키고 터미네이트 시켜야 했겠죠. 게다가 AutoScalingGroup에는 다양한 조건을 바탕으로 대수를 컨트롤할 수도 있습니다. CPU 사용량이 어느 정도 이상이 되거나, 네트워크 트래픽이 특정 수준 이상이 되면 서버를 늘리거나 줄이도록 설정해서 트래픽에 대한 대응을 자동으로 할 수 있게 도와줍니다. 그중에서도 오늘 살펴볼 Scheduled action은 시간을 기준으로 AutoScalingGroup의 대수를 조절할 수 있게 해 줍니다. 이번 글에서는 Scheduled action을 Terraform을 통해 설정하는 방법에 대해서 살펴보겠습니다.
Scheduled action
그럼 Scheduled action은 언제 활용할 수 있을까요? 여러 가지 경우가 있겠지만 가장 활용하기 좋은 곳은 바로 개발 환경에 대한 대수 조절일 겁니다. 예를 들어 0시부터 오전 9시까지는 개발 환경의 서버 대수를 0으로 만들고 오전 9시에 다시 개발 환경의 서버 대수를 원복 해서 개발 업무를 할 수 있도록 하는 겁니다. 이와 같은 작업을 람다를 이용해서 AutoScalingGroup의 capacity를 수정하는 형태로도 구현할 수 있지만 AutoScalingGroup에 있는 Scheduled action을 활용하면 더 손쉽게 할 수 있습니다.
그럼 본격적으로 Scheduled action을 Terraform을 이용해서 구현해 보겠습니다.
Scheduled action with Terraform
코드 구현은 Terraform의 aws_autoscaling_schedule 리소스를 사용해서 구현합니다. (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_schedule)
resource "aws_autoscaling_schedule" "shutdown" {
autoscaling_group_name = aws_autoscaling_group.this.name
scheduled_action_name = "${var.vpc_name}-shutdown-during-night"
min_size = 0
desired_capacity = 0
max_size = 0
recurrence = "0 15 * * *"
}
resource "aws_autoscaling_schedule" "startup" {
autoscaling_group_name = aws_autoscaling_group.this.name
scheduled_action_name = "${var.vpc_name}-startup-from-morning"
min_size = 2
desired_capacity = 2
max_size = 2
recurrence = "0 0 * * *"
}
보시면 아시겠지만 코드는 매우 단순합니다. Scheduled action을 어떤 AutoScalingGroup에 연결할 것인지를 설정하고, Scheduled action의 이름, 그리고 변경할 capacity를 설정해 줍니다. start_time과 end_time은 특별히 시작 시간과 종료 시간이 필요하지 않다면 설정하지 않아도 됩니다. 그리고 제일 마지막 recurrence가 가장 중요합니다.
바로 반복 설정입니다. 코드에 보이는 것처럼 cron 표현식으로 작성하게 됩니다.
[Minute] [Hour] [Day_of_Month] [Month_of_Year] [Day_of_Week]
주의할 것은 Minute와 Hour는 UTC 기준이라는 겁니다. 물론 다른 시간대를 설정할 수 있으나 UTC로 설정해서 사용하는 것이 정신건강에 좋습니다. ^^
https://docs.aws.amazon.com/autoscaling/ec2/userguide/schedule_time.html
몇 가지 예를 들어 보겠습니다. 아래의 cron 표현식은 어떤 의미일까요?
30 6 * * 2
Day_of_Week가 2 이고 Day_of_Month, Month_of_Year는 아무 때나, Hour는 6, Minute는 30 입니다. 즉 UTC 기준으로 매주 화요일 6시 30분에 실행되도록 설정한 cron 표현식입니다.
Day_of_Week는 일요일부터가 0 입니다.
동작 확인
실제로 잘 동작하는지 확인해 볼까요? 저는 아래와 같이 설정했습니다.
UTC 기준으로 15시 0분에, 즉 KST 기준으로 0시 0분에 desired capacity를 0으로 만들어서 서버들을 회수합니다. 그리고 KST 기준으로 9시 0분에 desired capacity를 2로 만들어서 서버들을 다시 생성합니다.
그리고 Activity history를 보면 우리가 설정했던 딱 그 시간과 초단위로 벌어지긴 했지만 잘 실행되어서 0시에는 인스턴스들이 터미 네이팅 되고 9시에 다시 런칭 되는 것을 볼 수 있습니다.
마치며
Autoscaling Group의 Scheduled action은 구현도 쉬우면서도 서버의 대수를 시간의 흐름에 맞게 조절할 수 있다는 장점이 있습니다. 수작업으로 하거나 람다를 이용해서 복잡하게 하지 않아도 편한 방법으로 진행할 수 있습니다. Scheduled action의 활용 범위에 대해서는 이 글의 예제처럼 개발 환경을 조절하는 것 외에도 트래픽이 적은 새벽 시간대에는 서버 대수를 적게 유지하고 트래픽이 늘어나는 오전 시간에는 서버 대수를 다시 늘리는 형태로도 운영이 가능합니다. Scheduled action을 이용해 조금 더 비용 효율적인 클라우드를 운영하시기 바랍니다. 감사합니다.
'IT > DevOps' 카테고리의 다른 글
jib와 Github Actions를 이용한 빌드 자동화 (0) | 2021.08.25 |
---|---|
패킷 덤프를 통해 확인하는 ALB와 NLB의 차이점 (2) - NLB 동작 원리 (8) | 2021.08.08 |
패킷 덤프를 통해 확인하는 ALB와 NLB의 차이점 (1) - ALB 동작 원리 (4) | 2021.08.05 |
jib 이용 시 자바 에이전트 추가하기 (0) | 2021.07.31 |
mockit 으로 구축하는 목업 API 서버 (0) | 2021.07.24 |