ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 스터디에서 공부한 내용을 바탕으로 작성하였습니다. 

    반응형

    댓글

Designed by Tistory.