[Hands On] EC2 Auto Scaling

00. Intro

00-01. Auto Scaling이란?

클라우드 컴퓨팅의 대표적인 장점으로, Flexible하게 컴퓨팅 자원을 효율적으로 사용할 수 있게 하는 기술입니다.

‘Flexible’의 단어의 핵심은 빠르고 쉽게 서비스를 확장(Out)하거나 축소(In)하는 것을 말합니다.

Auto Sscaling의 동작은 CPU, Disk, Network 등의 시스템 Metric값과 Application을 모니터링하여 size를 자동으로 조절하도록 이루어집니다.

  • Auto Scaling을 통해 얻을 수 있는 이득 2가지
  1. 예상치 못한 서비스 부하에 효과적으로 대응할 수 있습니다.
  2. 적은 비용으로 안정적이고 예측 가능한 성능을 유지할 수 있습니다.

Auto Scaling은 EC2에서만 사용할 수 있는 것이 아니라 여러 서비스들에서 사용되어지고 있습니다.

00-02. EC2 Auto Scaling 부하 테스트 구성 준비

  1. 서비스 할 Application 준비
  2. 서비스 실행
  3. AMI 이미지 생성
  4. EC2 시작 템플릿 생성
  5. Auto Scaling Group 그룹 생성
  6. 결과
2 Tier Architecture


01. Application 준비

  • 부하 테스트를 하기 위해서 실행 할 Application을 준비합니다.
  • 이번 실습에서는 이미 만들어진 Application을 사용해보겠습니다.
  • 테스트를 위해 node.js 기반 web application을 사용하시려면 도커 이미지 ‘kicoskillup/node-app:v0.3’을 pull 받아서 사용하시면 됩니다.


02. 서비스 실행

02-01. EC2 생성

아래와 같은 조건으로 EC2를 생성합니다.

  • AMI: Amazon Linux 2 AMI (HVM), SSD Volume Type
  • Instance Type : t2.large (2vCPU, 8GiB)
  • Network : 기본 VPC default
  • Subnet : 기본 서브넷

02-02. 서비스 실행

  • 실행 순서
    EC2 실행 -> Docker 설치 -> Docker Images 생성 -> Docker 실행
[aws epel 패키지 설치]
amazon-linux-extras install epel –y  

[도커 데몬 설치]
yum install docker –y


[도커 데몬 시작]
service docker start

[도커 허브 id/password 입력]
docker login


[도커 Application 다운로드]
docker pull kicoskillup/node-app:v0.3

[도커 서비스 실행]
docker run -d -p 3000:3000 --name nodeapp01 -it kicoskillup/node-app:v0.3

docker exec -it nodeapp01 service mysql start

docker exec -it nodeapp01 npm start &
  • 생성된 EC2의 퍼블릭IP로 브라우저 접속을 하면 Web Application이 제대로 실행 되는 것을 확인 할 수 있습니다.


03. 이미지 생성

  1. 이미지로 만들고 싶은 인스턴스에서 우클릭해줍니다.
  2. 이미지 및 탬플릿을 클릭합니다.
  3. 이미지 생성을 클릭합니다.


04. EC2 시작 템플릿 생성

  • EC2 Auto Scaling 생성하는 방법에는 여러가지가 있지만 이번에는 시작 템플릿을 이용하는 방법으로 진행해보겠습니다.
  • EC2 > 시작 템플릿 > 시작 템플릿 생성에 들어갑니다.

04-01. 시작 템플릿 이름 및 설명

  • EC2 시작 템플릿 이름을 입력해줍니다. (필수)
  • 템플릿 버전 설명을 입력해줍니다.

04-02. 애플리케이션 및 OS 이미지

  • AMI를 [03.이미지 생성]에서 만든 이미지를 선택해줍니다.

04-03. 네트워크 설정

  • 보안 그룹에 인바운드 포트 3000을 허용해줍니다.
  • 테스트를 위해 퍼블릭 IP 자동할당을 활성화 해줍니다.

04-04. 고급 세부 설정

  • 필요한 설정이 있을 경우 설정해줍니다.
  • docker가 바로 실행되도록 User Data를 기재합니다.
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
service  docker start
docker start nodeapp01
  • 모든 과정이 끝나면 ‘시작 템플릿 생성’을 클릭합니다.

04-05. 시작 템플릿 생성 확인


05. Auto Scaling Group 생성

  • EC2 시작 템플릿을 이용했기 때문에 Auto Scaling 시작 구성을 별도로 하지 않아도 됩니다.
  • 시작 구성 아래에 있는 Auto Scaling 그룹으로 들어가 바로 Auto Scaling 그룹을 생성해줍니다.

05-01. 시작 템플릿 또는 구성 선택

  • Auto Scaling 그룹 이름 입력
  • [04. 시작 템플릿 생성]에서 만들어준 시작 템플릿을 선택합니다.
  • 시작 템플릿과 동일한 VPC를 선택합니다.
  • 시작 템플릿과 동일한 서브넷을 선택합니다.

05-02. 고급 옵션 구성

  • 단순 부하 테스트이기 때문에 로드밸런서 없이 진행합니다.
  • 상태 확인 유예 기간은 기본인 300초로 설정합니다.

05-03. 그룹 크기 및 조정 정책 구성

  • 원하는 용량: 오토스케일링 시 원하는 서버 수를 지정합니다.
  • 최소 용량: 오토스케일링 그룹의 최소 유지 서버 수를 지정합니다. ( Desired > = MinSize)
  • 최대 용량 : 오토스케일링 그룹의 최대 보유 서버 수를 지정합니다. (Desired < = MaxSize)
  • ‘CPU의 평균 부하 50’을 기준으로 Auto Scaling이 동작하도록 설정합니다.
  • 지표 유형: 평균 CPU 사용률
  • 대상 값: 50

05-04. 태그 추가 및 생성

05-05. Auto Scaling 그룹 생성 확인

  • Auto Scaling 그룹이 생성 된 것을 확인할 수 있습니다.
  • 인스턴스 관리 항목으로 들어가면 원하는 용량으로 잡아둔 값만큼 인스턴스가 실행 되는 것을 확인 할 수 있습니다.
  • 인스턴스의 퍼블릭 IP로 브라우저 접속해 서비스가 실행 되는지 확인합니다.


06. CPU 부하 테스트

06-01. 부하 테스트 데몬 설치

  • 부하 테스트를 실행할 인스턴스에 SSH 접속합니다.
  • Epel 패키지 및 부하 테스트용 데몬을 설치합니다.
$ sudo su -

[EPEL 릴리스 패키지 설치]
# amazon-linux-extras install epel -y

[CPU 테스트용 데몬 설치]
# yum install stress –y 
  • top 명령으로 CPU 사용률를 확인해보면 아직 0인 것을 확인 할 수 있습니다.

06-02. CPU 부하 주기

  • 새로운 ssh 터미널에서 t2.large의 CPU의 개수 2만큼 부하를 줍니다.
# stress -c 2
  • top 명령으로 CPU를 확인하면 사용률이 100으로 증가한 것을 확인할 수 있습니다.
  • 인스턴스를 확인해보면 기존에 있던 인스턴스의 CPU 사용률이 50%가 넘어 새로운 인스턴스가 생성 된 것을 확인할 수 있습니다.
  • stress 명령을 중단하여 CPU 사용률을 떨어뜨리면 일정 시간이 지나고 다시 Scaling in 되는 것을 확인 할 수 있습니다.


07. Network 부하 테스트

  • 위에서는 scale in/out의 지표 유형이 CPU였다면 이번에는 네트워크 출력으로 테스트 해보겠습니다.
  • EC2 > Auto Scaling 그룹 > 생성한 Auto Scaling 그룹 선택 > 자동 조정으로 들어가 동적 크기 조정 정책을 편집합니다.
  • 네트워크 부하를 주기 위해 자기 자신에게 ping을 보내는 명령을 입력합니다.
# ping -s 1500 <Private IP> -f -l 30000
  • 일정 시간이 지나면 Scale out이 이루어지는 것을 확인할 수 있습니다.
  • ping 명령을 중단하고 일정 시간이 지나면 scale in이 이루어지는 것을 확인할 수 있습니다.