Infra/cloud

[AFOS] 8주차 EC2 Auto Scailing - 실습

미니문92 2021. 8. 1. 19:09

2. EC2 Auto Scailing 구성 실습

Auto Scailing 구성 Process

  1. ec2 instance 생성
  2. ami 생성
  3. ec2 launch template 생성 : auto scailing 을 위한
  4. target group 생성 : load balancer에 연결시킬 인스턴스 지정
  5. load balancer 생성 : auto scailing 만들 준비 완료
  6. auto scailing group 생성 : 3에서 생성한 launch template 이용
  7. 조정 정책에 따라 auto scailing 작동

 

실습 구성도

 

CloudFormation 스택 생성 - 링크 클릭 후 템플릿 파일로 기본 환경 자동 배포

  • 파라미터(KeyName - 자신의 SSH 키 선택) 다음 클릭 → 다음 클릭 → 스택 생성 클릭
  • 맨 하단에 아래 IAM 리소스 생성 승인 체크 후 스택 생성 클릭

 

배포 후 기본 환경 도식화

기본 환경 검증 : MyEC2 SSH 접속

# AWS CLI 확인
[ec2-user@MyEC2 ~]$ aws --version
aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

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

[ec2-user@MyEC2 ~]$aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text
i-02432b13a86f9a580     running 10.0.0.16

[ec2-user@MyEC2 ~]$ while true; do aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name, PrivateIpAddress]' --output text; date; sleep 1; done
i-02432b13a86f9a580     running 10.0.0.16
Tue Aug  3 01:37:29 KST 2021


# 아래는 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

 

EC2 → 시작 템플릿 생성 → 아래내용 입력 후 시작 템플릿 생성 클릭

시작 템플릿 이름 : EC2LaunchTemplate
설명 : EC2 Auto Scaling v1.0
Auto Scaling 지침 : 체크
AMI : Amazon Linux 2 AMI(HVM), SSD Volume Type - 아키텍처 : 64비트(x86)
인스턴스 유형 : t2.micro
키 페어 : (각자 자신의 SSH 키페어 선택)
네트워킹 플랫폼 : VPC
보안 그룹 : ###-VPC1SG-### 포함된것 선택
리소스 태그 : 키(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

생성된 시작 템플릿 → Auto Scailing 그룹 생성 클릭

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단계] → [6단계] 태그 : 키(Name) , 값(WebServers) → [7단계] ⇒ Auto Scaling 그룹 생성 클릭

생성된 Auto Scaling 그룹 클릭 → 세부 정보 → 하단 고급 구성 편집 클릭 → 업데이트

종료 정책 : Newest Instance → 기본 Default 는 제거
기본 휴지 기간 : 180초

생성된 Scale Out Policy

 

축소 조정 정책 추가 : 생성된 Auto Scaling 그룹 클릭 → 자동 조정 → 정책 추가 클릭

  • 정책 유형(단순 조정) 선택 후 CloudWatch 경보 생성 클릭 → 다음 클릭
    • 단계1 지표 선택 → EC2 → Auto Scaling 그룹별 → ' ' 의 CPUUtilization 선택 후 지표 선택 클릭 ⇒ 기간(1분)
      조건 정적 → 보다 작음 → ...보다(10) → 추가 구성 → 경보를 알릴 데이터 포인트( 2 / 2 )
    • 단계2 경보 상태 트리거 (제거) → 하단 다음 클릭
    • 단계3 경보 이름(ASG-CpuLow) → 하단 다음 클릭
    • 단계4 → 하단 경보 생성 클릭

  • 정책 유형(단순 조정) 선택 상태
    • 조정 정책 이름 : Scale In Policy
    • CloudWatch 경보 : (위 생성된 경보 선택)
    • 작업 수행 : 제거 , 1(용량단위)
    • 그런 다음 대기 : 60초 ⇒ 하단 생성 클릭

Auto Scailing 정책 

 

CloudWatch 경보 2개를 대시보드에 추가 할것

  • 대시보드 - 위젯(Metric) 추가

  •  행 - 지표 - GroupInServiceInstances 검색 후 선택 - 그래프 옵션 -  , 평균 1분, 왼쪽 Y축 최소(0) ~ 최대(4) )

Dashboard 생성 완료

 

EC2 인스턴스에 CPU 부하 발생 및 Auto Scailing 확인

  • MyEC2 상태 확인
# ApachBench 확인
[ec2-user@MyEC2 ~]$ ab -V
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/


# ALB DNS 이름 변수 지정
[ec2-user@MyEC2 ~]$ ALB=ALB-TEST-780896423.ap-northeast-2.elb.amazonaws.com
[ec2-user@MyEC2 ~]$ dig +short $ALB
13.124.169.87
15.165.13.138


# 인스턴스 1개
[ec2-user@MyEC2 ~]$ while true; do curl $ALB --silent --connect-timeout 1; date; echo "---[AutoScaling]---"; sleep 1; done
<h1>RegionAz(apne2-az1) : Instance ID(i-044fb5512af847501) : Private IP(10.1.1.64) : Web Server</h1>
Tue Aug  3 02:41:16 KST 2021
---[AutoScaling]---
<h1>RegionAz(apne2-az1) : Instance ID(i-044fb5512af847501) : Private IP(10.1.1.64) : Web Server</h1>
Tue Aug  3 02:41:17 KST 2021
---[AutoScaling]---
<h1>RegionAz(apne2-az1) : Instance ID(i-044fb5512af847501) : Private IP(10.1.1.64) : Web Server</h1>
Tue Aug  3 02:41:18 KST 2021


[root@MyEC2 ~]# 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
i-044fb5512af847501     running 10.1.1.64
Tue Aug  3 02:50:14 KST 2021

 

  • 배포된 WebServer 1대 확인

 

  • 배포된 WebServer 접속
    # 터미널1
    [ec2-user@ip-10-1-1-64 ~]$ sudo su -
    [root@ip-10-1-1-64 ~]#htop
    
    # 터미널 2
    [root@ip-10-1-1-64 ~]# tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"
    10.1.2.202 - - [02/Aug/2021:17:50:49 +0000] "GET / HTTP/1.1" 200 101 "-" "curl/7.61.1"
    10.1.1.133 - - [02/Aug/2021:17:50:50 +0000] "GET / HTTP/1.1" 200 101 "-" "curl/7.61.1"
    
    ## (심화 옵션) Client IP 확인
    [root@ip-10-1-1-64 ~]# vim /etc/httpd/conf/httpd.conf
    196 shift+G
    %{X-Forwarded-For}i 
    
    [root@ip-10-1-1-64 ~]# systemctl reload httpd
    [root@ip-10-1-1-64 ~]# tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"
    3.35.170.208 h - - [02/Aug/2021:17:54:32 +0000] "GET / HTTP/1.1" 200 101 "-" "curl/7.61.1"
  • load.php
    • VM의 CPU를 사용하여 암호 해싱 작업 실행 -> CPU 부하
    • 해싱 후 결과 출력되는 시간을 출력(단위, 초)
<?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;
?>
  • cpuload.php
<?php
$IID = exec('curl 169.254.169.254/latest/meta-data/instance-id');
echo "(Instancd ID : ";
echo $IID;
echo ") - (";
$idleCpu = exec('vmstat 1 2 | awk \'{ for (i=1; i<=NF; i++) if ($i=="id") { getline; getline; print $i }}\'');
echo "Current CPU Load : ";
echo 100-$idleCpu;
echo "%)";
?>

 

  • MyEC2 SSH 접속 ⇒ ab 부하발생 → 4분(1대 증가) → ab off(ctrl+c) → for 접속으로 부하분산 확인
# 웹 접속 테스트 (리전, 인스턴스ID, Private IP)
ALB=ALB=ALB-TEST-780896423.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
(Instancd ID : i-044fb5512af847501) - (Current CPU Load : 100%)Tue Aug  3 03:18:55 KST 2021
---[AutoScaling]---
(Instancd ID : i-044fb5512af847501) - (Current CPU Load : 99%)Tue Aug  3 03:18:57 KST 2021
---[AutoScaling]---
(Instancd ID : i-044fb5512af847501) - (Current CPU Load : 100%)Tue Aug  3 03:18:59 KST 2021
---[AutoScaling]---


# EC2 증가 이후 증감 확인
for i in {1..100}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr

cpu 부하 확인
Auto Scailing 로그 확인
Cloudwatch Dashboard 확인