2023년 7월 30일 작성
AWS EC2 AutoScaling - 부하에 따라 Instance 갯수를 자동으로 조정하기
AWS의 AutoScaling service는 수평적 확장과 축소를 통해 application의 부하(load)를 처리할 수 있는 정확한 수의 instance를 보유하도록 보장합니다.
EC2 AutoScaling
- AutoScaling은 application의 부하에 따라 Instance의 갯수를 자동으로 조정하는 서비스입니다.
- application의 부하가 증가하면 Instance를 늘리고, 부하가 감소하면 Instance를 줄입니다.
- 이를 통해 application의 부하를 처리할 수 있는 최적의 Instance 갯수를 유지합니다.
- AutoScaling은 EC2 Instance를 기반으로 동작합니다.
- 따라서 AutoScaling Group을 생성할 때는 EC2 Instance를 먼저 생성해야 합니다.
- AWS에서는 CloudWatch가 현재 상황을 지표와 비교하여, Instance의 갯수를 자동으로 조정합니다.
Scaling의 종류 : Scale Out/In vs Scale Up/Down
Scale Out/In | Scale Up/Down |
---|---|
수평적인 확장과 축소 | 수직적인 확장과 축소 |
server의 수를 늘리거나 줄임 | server의 성능을 늘리거나 줄임 |
- Scale Out/In은 AutoScaling에서 사용하는 용어입니다.
- application의 부하에 따라 server의 수를 늘리거나 줄입니다.
- Scale Up/Down은 server의 성능을 늘리거나 줄이는 것을 의미합니다.
- server의 성능을 늘리기 위해, server의 CPU, Memory, Disk 등을 늘립니다.
AutoScaling 설정하는 방법
- AWS의 AutoScaling 기능은 EC2 Instance와 CloudWatch를 기반으로 동작합니다.
1. EC2 Instance의 Image 만들기
- application을 담고 있는 EC2 Instance의 Image를 만듭니다.
- 수평적 확장(scale out)은 기준이 되는 Instance를 복제하고, 복제 Instance를 만들어 기동하는 방식으로 이루어집니다.
- 따라서 기준 Instance의 Image는 기동될 때 application이 즉시 실행될 수 있는 상태여야 합니다.
- Instanece의 Image를 만들면, AMI와 snapshot이 나옵니다.
- application은 snapshot에 들어있으며, AMI는 이 snapshot을 활용하기 위한 도구입니다.
2. Launch Template(시작 Template) 만들기
- Launch Template은 EC2 Instance를 쉽게 만들 수 있도록 미리 환경을 설정해두는 것입니다.
- 그래서 Template을 만드는 과정은 EC2 Instance를 만드는 과정과 유사함
- Auto Scaling guidance(지침)을 사용하도록 설정합니다.
- 생성해 둔 AMI를 선택합니다.
- Instance 유형을 설정합니다.
- Key pair를 설정합니다.
- Network 설정은 그냥 넘어갑니다.
- 이후에 Auto Scaling Group을 생성하면서 설정할 것이기 때문입니다.
3. Auto Scaling Group 만들기
- Auto Scaling Group을 만들면 EC2 Instance가 Desired capacity 설정만큼 만들어집니다.
- 이름을 입력합니다.
- Launch Template 선택합니다.
- VPC와 Subnet을 선택합니다.
- 후에 scale out할 때 가용 영역을 번걸아가며 골고루 만듭니다.
- scale in할 때는 Instance가 무작위로 지워지지만, 가용 영역을 번갈아가며 지웁니다.
- Load Balancer 사용 여부를 선택합니다.
- Auto Scaling과 ELB를 함께 사용하는 것이 훨씬 더 안정적이기 때문에 Load balancer의 사용을 권장합니다.
- 아래는 새로운 Load balancer 생성할 때의 설정 예시입니다.
- Load balancer type : ALB
- Load balancer scheme : Internet-facing
- Availability Zones and subnets : 모두 선택
- Listeners and routing
- Protocol : HTTP
- Port : 80
- Target group : 새로 생성
- Health check grace period (상태 확인 유예 기간) 설정합니다.
- 상태가 정상이어야 새로운 Instance에 요청을 전달합니다.
- 생성하고 기동될 때까지 시간이 걸리기 때문에, 기동이 완료될 때까지는 상태 검사를 하지 않습니다.
- 유예 기간이 너무 짧으면 기동하기 전에 상태 검사를 하여 오류로 판단할 가능성이 있습니다.
- 유예 기간이 너무 길면 Instance가 확장될 때까지의 시간이 필요 이상으로 오래 걸릴 수 있습니다.
- Desired capacity(원하는 용량), Minimum capacity(최소 용량), Maximum capacity(최대 용량)을 설정합니다.
- 운영 상황에 적합하게 설정합니다.
- Scaling 정책(policy)을 선택합니다.
- 정책은 나중에 CloudWatch에서 설정하기 때문에 일반적으로 Auto Scaling Group을 생성할 때는 ‘없음’으로 선택합니다.
- Target tracking scaling policy (대상 추적 크기 조정 정책)을 선택하면 하나의 지표만을 가지고 확장과 축소를 합니다.
- 예를 들어, CPU 사용량이 50% 이상이면 확장, 50% 이하면 축소.
- Instance scale-in protection(축소 보호) 여부를 선택합니다.
- 확장(scale out)하면 다시 축소(scale in)하지 않도록 하는 설정입니다.
- (Optional) 알림을 추가합니다.
- 확장과 축소의 trigger event에 대한 알림을 설정할 수 있습니다.
4. Load balancer 접속 주소 설정하기
- (Optional) Load balancer의 Listener 규칙에서 HTTPS를 추가하고, 인증서를 선택합니다.
- Route 53에서 domain 주소를 Load balancer를 연결합니다.
5. Auto Scaling Group의 동적 크기 조정 정책(Dynamic scaling policy) 만들기
- 일반적으로 확장과 축소에 대한 두가지 정책을 설정합니다.
- 정책 유형을 Simple scaling(단순 크기 조정)으로 설정합니다.
- 정책 이름을 설정합니다.
- CloudWatch 경보(alarm)를 생성합니다.
- 지표(metric)를 선택합니다.
- 예를 들어, EC2 > By Auto Scaling Group > CPUUtilization.
- 측정 대상 값(CPU 사용량)의 평균을 계산하는 주기(period)를 설정합니다.
- 주기가 짧을수록 더 정확하지만 더 비쌉니다.
- 조건을 선택합니다.
- 예를 들어, CPU 사용량이 70% 이상.
- email notification을 설정합니다.
- 지표를 넘었을 때 email로 알려줍니다.
- 경보의 이름을 입력합니다.
- 지표(metric)를 선택합니다.
- 조정 정책에 생성한 CloudWatch 경보를 지정합니다.
- 경보 발생에 대한 작업(action)을 지정합니다.
- Auto Scaling이 연속으로 되지 않도록 대기 시간을 함께 지정합니다.
- 기본 값이 300초인데, 운영 환경에서는 일반적으로 더 짧게 설정합니다.
- Auto Scaling이 연속으로 되지 않도록 대기 시간을 함께 지정합니다.
6. (Optional) 부하를 주어 Auto Scaling이 잘 작동하는지 확인하기
- 어떤 지표를 주었는지에 따라 test 방법이 다릅니다.
CPU 사용률이 지표인 경우
- Auto Scaling Group이 생성한 Instance에 접속합니다.
top
명령어로 CPU 사용량을 확인합니다.top
는q
로 종료할 수 있습니다.
yes > /dev/null &
명령어로 scale out test를 진행합니다.- 불필요한 작업을 반복적으로 수행하여 CPU 사용률을 올립니다.
pkill -9 yes
명령어를 수행하고 Enter key를 입력하여 scale in test를 진행합니다.- 불필요한 작업을 종료하여 CPU 사용률을 줄입니다.
- 확장/축소 시에 notification mail이 잘 오는지 확인합니다.
- CloudWatch Dashboard에서 경보를 확인합니다.
Reference
- AWS Cloud 핵심 Service 활용 및 ECS EKS 개발 환경 구축 (강의) - 이한기