진짜 개발자
본문 바로가기

AWS/Elasticity & Management

AWS - AutoScaling 서비스 및 테스팅(부하발생기)

728x90

AutoScaling 서비스

- Cloud Watch서비스와 혼용하여 부하 또는 특정 상황에따라 인스턴스의 수를 증감할 수 있는 서비스


고려사항

1. 급격한 부하증가

CloudWatch를 통해 부하를 감지하여 AutoScaling하여 부하를 처리하는데 까지 5분정도의 시간이 걸린다

일시적으로 부하가 급격히 증가하는 서비스에서는 미리 예측하여 스케일업 또는 아웃을 해주어야한다

하지만 보통의 경우 이를 예측하기 어렵다 따라서 이를 미리 예측하고 대비하는 것이 중요하다. 


2. Session유지

로드밸런서와도 관련이 있는 내용이다 Instance A에서 웹서비스를 받는 도중 새로고침 또는 다른 메뉴로 이동하기 위한

행동을 취했을 때 Instance B로 로드밸런싱이 되었다면 사용자는 이전 상태를 계속해서 잃어버릴 것이다

이때 "ElastiCache"를 이용한다면 여러 Instance들이 세션정보를 공유할 수 있다


3. Log 저장

AutoScaling을 통해 스케일 아웃된 인스턴스들의 로그정보들은 스케일 인시 인스턴스와 같이 사라진다

이때 S3와 연동하여 지속적으로 로그정보들을 백업하는 방법을 고려할 수 있다.


4. EC2 초기화

- AutoScling을 통해 추가된 EC2 Instance에 초기화 처리를 하기 위해서 "User Data"를 이용할 수 있다

  (AutoScling Create Launch Configuration 3단계에서 작성한다)

- UserData는 root 계정 권한으로 실행되기 때문에 폴더나 파일을 이용할 때에 권한설정도 UserData에 포함되어야 한다.


*User Data

- AutoScling에 의해 자동으로 추가된 Instance에서 진행할 초기화 작업

종류

1) 셸 스크립트

2) cloud-init


User Data 작성방법

https://cloudinit.readthedocs.io/en/latest/



구성

1. Launch Configuration

- AutoScaling에서 Instance가 새로 시작할때의 설정들을 지정한다


2. AutoScaling Group

- AutoScaling이 어떻게 동작하는지를 지정한다



시나리오

1. 목표

로드밸런서를 통해 부하분산이 이루어지고 있는 인프라에 Cloud Watch와 AutoScaling Group을 추가하여

부하에 따른 AutoScling을 구현한다.


2. 목표인프라



실습

1. VPC

1. VPC

- VPC : 1.0.0.0/16


2. Subnet

- Public Subnet 2개와 Private Subnet 2개를 생성


3. Route Table

1. Public RouteTable

- 인터넷 게이트웨이와 연결하여 인터넷으로 접근 및 사용이 가능하게 했다.


2. Private RouteTable

- NAT Gateway와 연결하여 내부에서 인터넷사용이 가능하도록 했다.


4. SecurityGroup



5. ACL



2. AMI 생성

- AutoScaling에 사용할 AMI를 생성한다


1. AMI에 사용될 간단한 웹서버 Instance 생성

- Private Subnet에 Instance를 생성하고 웹서버를 구축한다


2. AMI 생성

1) EC2 서비스로 들어가 좌측의 Instances탭을 클릭한뒤 AutoScling에 사용될 Instance를 우클릭한다

2) Image -> Create Image를 클릭하여 Instance를 이미지화 한다.


3) 이름을 설정

4) EBS를 추가하고 싶다면 추가 설정을 한다


3. LoadBalancer 구축

http://galid1.tistory.com/368


- 아직 TargetGroup에 속할 Instance들이 생성되지 않은 상태이므로
   TargetGroup설정에서 Instance들을 등록하는 과정에서 그냥 Next를 눌러 진행하여 생성한다



4. AutoScaling 생성 및 설정

1. Create or Select Launch Configuration

- AutoScaling에 의해 생성되는 Instance의 설정들을 지정한다


1) EC2서비스의 좌측 AUTO SCALING 메뉴의 Launch Configurations를 클릭한뒤 

    Create launch Configuration 을 클릭한다



2) 좌측의 My AMIs 탭을 클릭한 뒤 이전에 생성한 AMI를 Select한다


3) UserData 추가(Instance 초기화)

AutoScaling으로 생겨나는 인스턴스의 초기화 작업을 지정하기 위해 

하단의 Advanced Details를 클릭하여 확장한다


1. User data : 간단히 도커를 설치하기 위한 셸 스크립트를 작성한다

#! /bin/bash

sudo yum-config-manager --enable rhui-REGION-rhel-server-extras

sudo yum install -y docker


2. IP Address Type : Private Subnet에서 동작하는 웹서버를 구축할 것이므로 

Public IP를 부여하지 않는다


4) 템플릿으로 인해 생겨나는 Instance의 SecurityGroup 설정


2. Create AutoScaling Group

- AutoScaling이 어떻게 행동하는지를 정의한다

1) EC2서비스의 좌측 AUTO SCALING 메뉴의 Auto Scaling Groups를 클릭한뒤 

   Create Auto Scaling Group을 클릭한다.


2) Launch Configuration을 선택한뒤 Use an existing launch Configuration을 클릭하여

   앞서 만든 Launch Configuration을 선택한다


3) AutoScaling Group 초기 설정

    Group size : AutoScaling Group의 시작 Instance 수 이다

    Network : AutoScaling Group이 포함할 Private Subnet을 선택해준다


    Advanced Details를 확장한다

Load Balancing : Auto Scaling Group이 Load Balancer로 부터 트래픽을 받음을 지정한다 

Target Groups : 앞서 만든 Target Group을 지정한다


4) AutoScaling Group 세부 정책설정을 위해 하단의 글을 클릭한다


5) Increase Group 설정

Add new alarm을 클릭하여 Increase 정책이 실행될 시점을 알리는 Alarm을 생성한다


Increase Alaram 

=> 웹서버를 간단하게 구축하여 부하발생이 적으므로 CPU이용률을 낮게 잡는다

Whenever : Cpu 최소 사용량

IS : 2% 이상인 경우

For at least : 적어도 1분간 지속된다면 

Create a simple scaling policy 를 클릭한다


 Action 설정

Excute policy When : 방금 생성한 increase Alarm

Take the action : 위의 알람이 울릴시 1개의 Instance를 추가한다

And then wait : instance가 생성된 후 warm up time이다


6) Decrease Group 설정

 Add new Alarm을 눌러 Decrease 정책이 실행될 시점을 알리는 알람을 생성한다


Decrease Alarm 설정

Whenever : 최대 CPU이용률이

Is : 0.5% 이하

For at least : 적어도 1분간 지속되는 경우


Create a simple scaling policy 를 클릭한다


Action 설정

Excute policy when : 위에서 설정한 알람이 울릴때

Take the action : 1개의 인스턴스를 제거한다

And the wait : 30초 동안의 warm up 시간을 가진다



5. AutoScaling 초기설정 확인

1. 시작 Instance 확인

Auto Scaling Group 생성이 완료되면 자동으로 시작값으로 지정했던 수의 인스턴스가 생성된다

- 해당 인스턴스들은 AutoScaling Group이 제거될때 자동으로 제거된다


2. UserData 확인

- Userdata에 Docker를 설치하라는 셸스크립트가 정상적으로 작동했는지 확인한다


AutoScaling Group이 Private Subnet에 위치하도록 설치했으므로 확인을 위해 BastionHost를 생성하여 접근한다


Userdata가 정상적으로 실행되었다



6. LoadBalancer의 Target Group에 AutoScaling 시작 인스턴스 등록

앞선 3번 LoadBalancer구축 부분에서 아직 인스턴스가 없어서 스킵했던 TargetGroup에

AutoScalingGroup을 생성한 후 자동으로 생성된 시작 인스턴스들을 등록한다



7. AutoScaling 테스트

1. 부하발생기(Jmeter) 설치

JMeter(부하발생기) 설치 - http://galid1.tistory.com/373

JMeter(부하발생기) 사용법 - http://galid1.tistory.com/374


2. 부하발생 설정

1) Thread Group 설정

- 충분한 부하를 지속하기 위해 100의 요청을 10000 반복한다


2) Http Request의 주소를 Load Balancer로 지정한다


3. 부하발생 시작



8. Instance Monitoring

1. 부하 발생 직전

1) Instance

- 부하발생 직전 Init1 Instance의 Cpu이용률은 0.1~0.2% 사이를 웃돈다


2) LoadBalancer

- 로드밸런서의 요청 수신 수도 0이다.

2. 부하 발생 후

1) Instance

- AutoScaling-EC2-Init1의 CPU이용률이 6%까지 상승했다.


2) LoadBalancer

- 로드밸런서의 요청 수신 수가 급격히 증가했다



9. AutoScaling 확인

부하발생 결과로 자동으로 인스턴스 2개가 생겨났다 클릭하여 AMI를 확인하면 앞서 만든 

AutoScaling-AMI인 것을 확인할 수 있다.