-
AWS Auto Scaling 실습AWS 2021. 8. 2. 13:50
이번 포스팅은 Auto Scaling이란 무엇인지 살펴보고
인스턴스에 걸리는 부하에 따라 Scale out, Scale in을 실습해본다.
Auto Scaling이란 말그대로 scale을 자동적으로 관리해주는 관리방식이다.
AWS에서는 EC2 Auto Scaling을 이용하여 애플리케이션의 로드를 처리하고 부하를 분산시킬 수 있다.
각 Auto scaling 그룹의 최소, 최대, 원하는 인스턴스 수를 지정할 수 있다.
실습은 다음 순서로 진행된다.
1. 실습 구성 확인
2. MyEC2에 접속하기
3. EC2 시작 템플릿 생성하기
4. AutoScaling 그룹 생성
5. 축소 정책 추가하기
6. Cloud Watch 대시보드 추가하기
7. 부하를 발생시켜 AutoScaling 확인하기
실습 전, Auto Scaling에 대해 알아야 할 개념 먼저 확인하자.
< 구성 요소 >
- Groups
- EC2 인스턴스는 조정 및 관리 목적의 논리 단위로 취급될 수 있도록 그룹으로 구성
- 그룹을 생성할 때 EC2 인스턴스의 최소 및 최대 인스턴스 수와 원하는 인스턴스 수를 지정
- 구성 템플릿
- 그룹은 EC2 인스턴스에 대한 구성 템플릿으로 시작 템플릿(모든 기능 제공)을 제공
- 인스턴스의 AMI ID, 인스턴스 유형, 키 페어, 보안 그룹, 블록 디바이스 매핑 등의 정보를 지정할 수 있음
- 조정 옵션
- Auto Scaling 그룹을 조정하는 다양한 방법을 제공
- 지정한 조건의 발생(동적 확장) 또는 일정에 따라 조정하도록 그룹을 구성할 수 있음.
< 장점 >
- 가변 수요 허용
- ex) 서비스 이용이 많은 시간대에 auto scaling을 통해 그룹의 용량을 늘려 수요를 허용할 수 있다.
- 가용성과 내결함성 향상
<조정 정책 >
- 대상 추적 조정 : 특정 지표의 목표 값을 기준으로 그룹의 용량을 늘리거나 줄임.
- 단계 조정 : 그룹의 용량을 일련의 조정 조절에 따라 늘리거나 줄이며 경보 위반에 따라 달라짐.
- 단순 조정 : 그룹의 용량을 단일 조정 조절에 따라 늘리거나 줄임.
※ 참고
Auto Scaling 그룹의 인스턴스 수에 비례하여 증가하거나 감소하는 사용률 수치를
기준으로 조정하는 경우 대상 추적 조정 정책을 사용하는 것이 좋으며
그렇지 않은 경우 단계 조정 정책을 사용하는 것이 좋다.
< 실습 >
1. 실습 구성 확인
실습할 내용의 구성은 다음과 같다.
실습을 시작전 다음 구성을 미리 만들어 놓은 후에 시작.
2. MyEC2에 접속하기
MyEC2에 접속해서 확인해보자.
aws --version aws ec2 describe-instances aws ec2 describe-instances --no-cli-pager aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --output text aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name]' --output text aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text while true; do aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text; date; sleep 1; done # (아래는 Auto Scaling 배포 후) aws ec2 describe-instances --filter "Name=tag:Name,Values=MyEC2" aws ec2 describe-instances --filter "Name=tag:Lab,Values=ASLab" while true; do aws ec2 describe-instances --filter "Name=tag:Lab,Values=ASLab" --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text; date; sleep 1; done # ApachBench 확인(웹서버 성능 측정 도구) ab -V # ALB DNS 이름 변수 지정 ALB=ALB-TEST-1714841830.ap-northeast-2.elb.amazonaws.com dig +short $ALB while true; do curl $ALB --silent --connect-timeout 1; date; echo "---[AutoScaling]---"; sleep 1; done
3. EC2 시작 템플릿 생성하기
시작 템플릿 이름 : EC2LaunchTemplate
설명 : EC2 Auto Scaling v1.0
Auto Scaling 지침 : 체크
AMI : Amazon Linux 2 AMI(HVM), SSD Volume Type - 아키텍처 : 64비트(x86)
인스턴스 유형 : t2.micro
키 페어 : (각자 자신의 SSH 키페어 선택)
네트워킹 플랫폼 : VPC 보안 그룹
리소스 태그 : 키(Lab) , 값(ASLab)
고급 세부 정보
- 세부 CloudWatch 모니터링 : 활성화
- 사용자 데이터 : 아래 내용을 복붙하자.
#!/bin/bash RZAZ=`curl http://169.254.169.254/latest/meta-data/placement/availability-zone-id` IID=`curl 169.254.169.254/latest/meta-data/instance-id` LIP=`curl 169.254.169.254/latest/meta-data/local-ipv4` amazon-linux-extras install -y php7.2 yum install httpd htop tmux -y systemctl start httpd && systemctl enable httpd echo "<h1>RegionAz($RZAZ) : Instance ID($IID) : Private IP($LIP) : Web Server</h1>" > /var/www/html/index.html echo "1" > /var/www/html/HealthCheck.txt curl -o /var/www/html/load.php https://cloudneta-book.s3.ap-northeast-2.amazonaws.com/chapter5/load.php --silent curl -o /var/www/html/cpuload.php https://cloudneta-book.s3.ap-northeast-2.amazonaws.com/chapter5/cpuload-aws.php --silent
CPU 부하를 위해 각 인스턴스에 load.php라는 파일을 생성해준다.
< load.php >
<?php header('Content-Type: text/plain'); $time = microtime(true); $pass = password_hash('Hello',CRYPT_BLOWFISH,array("cost"=>14)); echo "Server Hostname : ".gethostname(); echo "\nHash Calculation Time : ".(microtime(true) - $time)." Second"; echo "\nPassword Hash Result : ".$pass; ?>
load.php는 VM의 CPU를 사용하여 암호 해싱 작업을 실행하고, 이는 CPU 부하를 발생시킴.
생성된 템플릿 확인
4. AutoScaling 그룹 생성
시작 템플릿을 이용하여 Auto scaling 그룹 생성.
시작 템플릿 → Auto Scaling 그룹 생성 클릭
1)
Auto Scaling 그룹 이름 : FirstEC2AutoScalingGroup
시작 템플릿 : EC2LaunchTemplate
2)
인스턴스 구매 옵션 : 시작 템플릿 준수
네트워크 - VPC : VPC1
네트워크 - 서브넷 : VPC1-Public-SN-1 , VPC1-Public-SN-2
3)
로드 밸런싱 : 기존 로드 밸런서에 연결
로그 밸런서 대상 그룹에서 선택 : 선택
기존 로드 밸런서 대상 그룹 : ALB-TG
상태 확인 유형 : ELB (Check)
상태 확인 유예 기간 : 60초
모니터링 - CloudWatch 내에서 그룹 지표 수집 활성화 : 체크
4)
원하는 용량 : 1
최소 용량 : 1
최대 용량 : 4
조정 정책 : 대상 추척 조정 정책
조정 정책 이름 : Scale Out Policy
대상 값 : 80 → 3분 동안 3번 연속 CPU 80% 경우(1분 마다 기록)
인스턴스 요구 사항 : 60초 → 지표에 포함하기 전 워밍업 시간(초)
확대 정책만 생성하려면 축소 비활성화 :Check (축소는 직접 추가 예정 )
인스턴스 축소 보호 활성화 : UnCheck
5) 태그
- 키: Name
- 값: WebServers
생성된 Auto Scaling 그룹 클릭 → 세부 정보 → 고급 구성 편집 → 업데이트
종료 정책 : Newest Instance (기본 Default 는 제거한다)
기본 휴지 기간 : 180초
생성된 Auto Scaling 그룹
5. 축소 정책 추가하기
이제 축소 조정 정책을 추가하자.
생성된 Auto Scaling 그룹 클릭 → 자동 조정 → create dynamic scaling policy 클릭
⇒ 정책 유형(단순 조정) 선택 후 CloudWatch 경보 생성 클릭 → 다음 클릭
1) 지표 선택 → EC2 → Auto Scaling 그룹별 →지표 이름이 CPUUtilization인 지표 선택 ⇒ 기간(1분)
조건 정적 → 보다 작음 → ...보다(10) → 추가 → 경보를 알릴 데이터 포인트( 2 / 2 )
2) 경보 상태 트리거 (제거) → 하단 다음 클릭
3) 경보 이름(ASG-CpuLow) → 하단 다음 클릭
4) → 하단 경보 생성 클릭
다음은 생성된 경보
⇒ 정책 유형(단순 조정) 선택 상태
조정 정책 이름 : Scale In Policy
CloudWatch 경보 : (위 생성된 경보 선택)
작업 수행 : 제거 , 1(용량단위)
그런 다음 대기 : 60초 ⇒ 하단 생성 클릭
6. Cloud Watch 대시보드 추가하기
Cloud watch 경보를 대시보드에 추가후, 인스턴스 용량도 추가하자.
별도 위젯(Metric) 추가(GroupInServiceInstances, 평균 1분, 왼쪽 Y축 최소(0)~최대(4))
7. 부하를 발생시켜 AutoScaling 확인하기
MyEC2에서 ALB로 부하를 발생시켜 Web-EC2에서 CPU 부하를 확인과 함께 Auto Scaling을 확인한다.
부하확인을 위한 Web-EC2 세팅
# 터미널1 htop # 터미널2 tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"
위 터미널이 htop를 이용한 CPU 확인, 아래 터미널은 httpd log
My-EC2에 접속해서 ALB로 부하 발생시키자.
# 웹 접속 테스트 (리전, 인스턴스ID, Private IP) ALB=ALB-TEST-1714841830.ap-northeast-2.elb.amazonaws.com curl $ALB # 접속 시 마다 CPU 부하 발생 curl $ALB/load.php;echo # 접속 시 마다 현재 CPU 부하 출력 curl $ALB/cpuload.php;echo # 1개 요청(풀)에 1번 요청 진행 ab -n 1 -c 1 http://$ALB/load.php # 2개 동시 요청(풀)로 총합 4번 요청 진행 ab -n 4 -c 2 http://$ALB/load.php # 1개 요청(풀)로 총합 500번 요청 진행 ab -n 500 -c 1 http://$ALB/load.php # 현재 인스턴스 정보 확인 while true; do aws ec2 describe-instances --filter "Name=tag:Lab,Values=ASLab" --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text; date; sleep 1; done # ALB 부하분산 접속 확인 while true; do curl $ALB --silent --connect-timeout 1; date; echo "---[AutoScaling]---"; sleep 1; done # 접속 되는 EC2 마다 현재 CPU 부하 출력 while true; do curl $ALB/cpuload.php --silent --connect-timeout 1; date; echo "---[AutoScaling]---"; sleep 1; done # EC2 증가 이후 증감 확인 for i in {1..100}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
MyEC2에서 ALB를 통해 WebServer의 php를 호출하면서 다음과 같이 CPU 부하가 증가한다.
curl $ALB/load.php;echo
이제 본격적으로 부하를 발생시켜 본다.
MyEC2 터미널에서 다음 커맨드 입력
ab -n 500 -c 1 http://$ALB/load.php
WebServer의 CPU 부하가 100%를 찍는다.
Cloud Watch 대시보드에서 인스턴스가 Scale out했다가 scale in하는 모습을 확인
※ AFOS 스터디에서 공부한 내용을 바탕으로 작성하였습니다.
반응형'AWS' 카테고리의 다른 글
ECS Fargate 환경에서 JMX Exporter 이용한 prometheus metric 수집 (0) 2023.06.25 ALB에 ACM으로 생성한 공인 인증서 적용 절차(feat.terraform) (0) 2023.03.21 NAT Instance port-forwarding (0) 2021.08.01 AWS ELB(ALB, NLB) 실습 (0) 2021.07.30 AWS RDS Multi-AZ, Read Replica 실습 (0) 2021.07.18 - Groups