아마존 웹서비스

Auto Scaling의 사용

기본 흐름

Amazon Web Services Auto Scaling의 기본 흐름은 아래와 같다. 이번 시간에는 아래의 절차를 수행하면서 Auto Scaling이 무엇이고 어떻게 사용하는 것인지에 대한 기본적인 개념을 알아본다. 아마존 공식 문서를 함께 참조하자. 이 수업은 상당히 많은 내용을 포함하고 있기 때문에 충분히 시간을 확보하고 실습에 임하는 것이 좋다. 

  1. 회원가입
  2. CLI 설치 & 설정
  3. EC2 인스턴스 생성 & 이미지 생성
  4. launch configuration(실행설정) 생성
  5. Auto Scaling Group 생성
  6. Auto Scaling Group 삭제

1. 회원가입

아마존 웹서비스의 오토스케일링을 사용하기 위해서는 회원가입이 되어 있어야 한다. 회원가입 수업을 참고한다. 

2. CLI 설치 & 설정

현재 Auto Scaling은 CLI(Command Line Interface)를 통해서만 제어 할 수 있기 때문에 AWS Auto Scaling Command Line Tools를 설치해야 한다. 설치 방법은 Auto Scaling 설치 수업을 참고한다. 

3. EC2 인스턴스 생성과 이미지 생성

 

Auto Scaling은 EC2 인스턴스를 자동으로 생성하고 삭제해주는 서비스다. 따라서 Auto Scaling을 하기 위해서는 EC2 인스턴스를 준비해야 한다. 여기서 이야기하는 준비란 자동으로 생성할 인스턴스를 만들어줘야 한다는 뜻인데, 인스턴스를 생성한 후에 필요한 소프트웨어를 설치하고 이것을 이미지(AMI)로 만들어두면 Auto Scaling이 동작할 때 이 이미지를 인스턴스로 생성하게 된다. 따라서 본 수업을 위해서는 EC2 인스턴스를 생성하는 방법에 대한 수업을 듣고, 이것을 이미지로 만드는 수업을 들어야 한다. 아래의 순서로 수업을 들으면 된다. 

  1. EC2란?
  2. 인스턴스의 생성
  3. EC2와 웹서버
  4. AMIs

아래는 실습에서 사용하는 Apache, Mysql Client 설치 명령이다. 

sudo apt-get update;
sudo apt-get install apache2;
sudo apt-get install mysql-client-core-5.5

아래는 데이터베이스에서 사용하는 SQL이다.

CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `topic` (`id`, `title`) VALUES ('1', 'Amazon Web Services');
INSERT INTO `topic` (`id`, `title`) VALUES ('2', 'nginx');
INSERT INTO `topic` (`id`, `title`) VALUES ('3', 'Linux');

아래는 실습에서 사용하는 PHP를 설치하는 명령이다.

sudo apt-get install libapache2-mod-auth-mysql;
sudo apt-get install mysql-client;
sudo apt-get install php5-common php5 libapache2-mod-php5;
sudo apt-get install php5-mysql;
sudo /etc/init.d/apache2 restart;

아래는 실습에서 사용하는 topic.php의 소스다.

<?php
mysql_connect("autoscalingrds.cfiilfqyvjx1r.ap-northeast-1.rds.amazonaws.com", "egoing", "11111111") or
    die("Could not connect: " . mysql_error());
mysql_select_db("AutoScaling");

$result = mysql_query("SELECT id, title FROM topic");

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    echo "{$row[1]},";                                                                                                                                                        
}
mysql_free_result($result);
?>

4. launch configuration 생성

어떤 인스턴스의 이미지를 자동으로 생성할 것인지, 또 그 인스턴스를 어떤 성능의 시스템에 탑재할 것인지를 지정하는 것이 launch configuration이다. 아래와 같은 조건을 생각해보자. 

  • AMI ID : ami-2272864b
  • Instance type : t1.micro
  • Security Group : MySecurityGroup
  • key : MyKey

위의 조건에 해당하는 launch configuration을 생성하려면 아래와 같이 한다. 

as-create-launch-config MyLC --image-id ami-2272864b --instance-type t1.micro --group MySecurityGroup --key MyKey

생성에 성공했다면 아래와 같은 메시지가 출력될 것이다. 

OK-Created launch config

5. Auto Scaling Group 생성

Auto Scaling Group은 인스턴스들의 그룹을 의미한다. 인스턴스를 그룹핑 하는 이유는 그룹내에서 필요에 따라서 인스턴스를 생성하고, 필요가 없어진 인스턴스를 제거하기 위한 대상을 특정하기 위해서다. 그룹을 통해서 설정하는 값은 대략 아래와 같다. 

  • 그룹의 이름
  • 인스턴스들이 생성될 가용성 존
  • 생성할 인스턴스의 최대량과 제거 할 인스턴스들의 최소량
  • 생성할 인스턴스의 이미지와 타입이 정의 되어 있는 launch configuration

아래는 Auto Scaling Group을 생성하는 방법에 대한 예제다. 이 예제는 MyGroup라는 이름의 그룹을 생성하고, 인스턴스를 생성할 때 MyLC launch configuration을 사용하도록 한다. 가용성 존 ap-northeast-1a 에 인스턴스를 생성하고, 인스턴스는 최소 1개 최대 3개까지 생성한다. 그리고 만들어진 EC2 인스턴스를 Load Balancer 에 등록 할 것이다. Load Balancer의 이름은 MyLoadBalancer 이다. Load Balancer의 사용법은 ELB 수업을 참조 한다. 

as-create-auto-scaling-group MyGroup --launch-configuration MyLC --availability-zones ap-northeast-1a --min-size 1 --max-size 3 --load-balancers MyLoadBalancer

그룹의 생성에 성공했다면 아래와 같은 메시지가 출력되고 min-size를 1로 설정했기 때문에 즉시 인스턴스 하나를 생성할 것이다.  

OK-Created AutoScalingGroup

그룹이 잘 생성 되었는지 확인하기 위해서 아래와 같이 명령어를 입력해보자.

as-describe-auto-scaling-groups --headers

위의 명령은 아래와 유사한 결과를 출력할 것이다. 

6. Policy의 생성

policy란 Auto Scaling을 통해서 EC 인스턴스를 생성하고 삭제하는 정책을 의미한다. 이 정책에는 아래와 같은 사항이 포함되어 있다. 

  • adjustment : 몇개의 인스턴스를 추가하고 제거 할 것인가? 
  • type : 인스턴스를 추가하고 제거하는 방법, 
    • ChangeInCapacity : 몇개의 인스턴스를 더하고 뺄 것인가에 대한 사항으로 기존의 인스턴스 수가 3개이고 adjustment의 값이 5라면 Auto Scaling이 동작한 후에는 8개가 된다.
    • ExactCapacity : 몇개의 인스턴스가 되어야 하는가에 대한 사항으로 기존의 인스턴스가 3이고 adjustment의 값이 5라면 Auto Scaling이 동작한 후에는 5개가 된다. 
    • PercentChangeInCapacity : 인스턴스의 증가와 감소를 Percentage로 적용한다. 예를들어 기존의 인스턴스가 2개이고 adjustment의 값이 100이라면 Auto Scaling 동작 후에는 4가 된다. 
  • cooldown : 인스턴수의 수를 변경 한 후, 다음번 변경 조정 작업이 시작될 때까지의 시간

아래와 같은 조건을 생각해보자. 

오토스케일링을 통해서 생성된 EC2 인스턴스들의 CPU 점유율이 평균 80%가 5분동안 넘을 때 EC2 인스턴스를 현재의 2배씩 증가 시킨다. 이 조건이 실행된 후에 1분간은 Auto Scaling 작업을 하지 않는다. 

위의 조건은 아래와 같은 명령을 변경 할 수 있다. 

as-put-scaling-policy double-group-size --type PercentChangeInCapacity --auto-scaling-group MyGroup --adjustment 100  --cooldown 60

위의 명령을 성공적으로 수행했다면 아래와 비슷한 결과가 출력될 것이다. 

그런데 위의 내용에서 CPU 점유율에 대한 부분은 포함되어 있지 않은 것 같다. 이것은 Cloud Watch에 대한 설명 절에서 알아본다. Policy란 EC2 인스턴스가 증감하는 규모와 타이밍에 대한 것을 정의 할 뿐 언제 Auto scaling활동을 할 것인지를 정의하지 않는다. 

위에서 스케일을 늘리는 Policy를 등록했으니 이번에는 스케일을 줄이는 작업에 대한 Policy를 등록해보자. 

as-put-scaling-policy reduce-group-size --type ChangeInCapacity --auto-scaling-group MyGroup --adjustment=-1  --cooldown 60

--adjustment의 값으로 음수를 사용하는 경우 윈도우에서는 옵션을 따옴표로 묶어야 합니다.

"--adjustment=-1" 

생성한 정책을 즉시 실행하기 위해서는 as-excute-policy 명령을 사용한다. 위의 명령을 기준으로 인스턴스를 증가시키려면 아래와 같이 한다. 

as-execute-policy double-group-size -g MyGroup

7. Trigger의 동작

트리거란 방아쇠라는 뜻이다. 프로그래밍에서는 어떤 사건이 발생하는 순간을 의미한다. Auto Scaling에서 트리거란 Auto Scaling이 실행되는 순간을 의미하고 Policy 절에서 살펴본 '5분동안 CPU의 점유율이 80% 이상'이라는 조건에 도달하면 방아쇠가 당겨지는 것이다. 다시 말해서 Auto Scaling이 실행되는 것이다. 이 상태에 도달했는지를 감시하는 역할을 하는 것이 Cloud Watch다. 클라우드 와치는 AWS의 다양한 서비스들에 대한 통계를 내주는 서비스로 Cloud Watch 수업을 통해서 자세한 내용을 알 수 있다. 

아래와 같은 조건을 생각해보자. 

Auto Scaling Group에 속해 있는 모든 EC 인스턴스의 CPU의 평균값이 5분동안 80%에 도달하면 Policy 절에서 생성한 policy 를 실행해서 Auto Scaling의 관리를 받고 있는 인스턴스 전체의 2배만큼 인스턴스를 증가 시킨다. 

이 명령은 CLI를 통해서도 실행할 수 있지만, 필자는 Management Console를 사용하겠다. 

1. 클라우드 와치의 Magement Console을 실행한다. 

https://console.aws.amazon.com/cloudwatch/home

2. 지역(Region)를 지정한다. 

3. 왼쪽 사이드 바에서 ALARM을 선택한다. 

4. Create Alarm을 누른다. 

5. viewing 에서 'Aggregated by Auto Scaling Group'를 선택하고 MyGroup의 MetricName으로 CPUUtilization을 선택한다. 

6. Identify Your Alarm 에 Name으로 MyGroup_CPU_High라고 입력한다. 

7. Define Alarm Threshold 에 '>=' 80, 5 minutes라고 입력한다. 

8. 그래프의 붉은색 선이 Alarm이 동작하기 위한 임계점이고 검은색선은 현재 Auto Scaling 인스턴스들의 CPU 점유율 평균값이다.

9. Define Your Action 에서 Alarm이 작동했을 때 어떤 일이 일어나야 하는가를 정의한다. 아래와 같이 설정한 후에 Add Action 버튼을 누른다. 

  • When Alarm state is : ALARM
  • Take Action : Auto Scaling Policy 
  • Action Details : MyGroup
  • Policy : double-group-size

10. as-describe-policies --auto-scaling-group MyGroup를 실행했을 때 아래와 같이 출력된다면 Trigger가 잘 등록된 것이다. 

8. Auto Scaling 동작 확인

이제 결실을 볼 때가 됐다. Auto Scaling의 목적은 시스템에 부하가 가해졌을 때 자동으로 머신을 공급해서 부하를 견뎌내는 것이다. 그리고 부하 상황이 끝났을 때 더 이상 필요없는 머신을 자동으로 제거해서 비용의 발생을 최소화한다. 하지만 부하 상황을 마냥 기다릴 수는 없기 때문에 부하 테스트 도구를 이용해보자. 다양한 부하테스트 도구가 있지만 필자는 ngrinder를 이용할 것이다. ngrinder는 NHN에서 만든 부하테스터로 생활코딩에 수업이 있다. nGrinder 수업 바로가기 

우선 ELB로 접속 할 수 있는 URL을 알아야 한다. 이번 실습에서 필자가 생성한 ELB의 이름은 MyLoadBalancer 이고, URL은 opentutorials-501978453.ap-northeast-1.elb.amazonaws.com 이다. 이 주소로 트래픽을 발생시켰을 때 EC2 인스턴스가 자동으로 늘어나고 줄어든다면 성공적으로 Auto Scaling 체계를 구축한 것이다. 

9. Auto Scaling Group 삭제

그룹을 삭제하려면 그룹에 소속된 인스턴스가 없어야 한다. 아래의 명령을 입력하면 MyGroup에 속해 있는 인스턴스들이 삭제된다. 주의하자. 

as-update-auto-scaling-group MyGroup --min-size 0 --max-size 0

위의 명령을 통해서 EC2 인스턴스가 삭제 됐는지 확인해야 한다. 아래와 같이 오토 스케일링 그룹의 현황을 파악하는 명령을 입력해보자. 

as-describe-auto-scaling-groups

아래와 같은 결과가 나온다면 아직 그룹에 소속된 인스턴스가 존재하는 것이다. 인스턴스가 사라질 때 까지 기다린다. 

아래와 같이 상태가 변경 되었다면 그룹에 소속된 인스턴스가 없다는 의미다. 이제 오토 스케일링 그룹을 삭제 할 차례다.

as-delete-auto-scaling-group MyGroup

이제 launch config를 삭제한다. 

 as-delete-launch-config MyLC

참고 

댓글

댓글 본문
  1. yoojat
    지금은 CLI말고 아마존 웹상에서 바로 Launch Configuration 만들수 있는 것 같은데;; CLI로 하다 이미지 파일 못찾는다고 계속 떠서 아마존 메뉴얼 뒤져보니까 일단 설명서가 있네요; 영문이지만;

    http://docs.aws.amazon.com......tml
  2. 워킹
    topic.php 입력해서 안뜨시는분

    경로가
    ~/var/www/html/topic.php 입니다.

    www까지만 하고 넣으면 로딩안되네요.. html 폴더에 들어가야하는듯

    맥입니다.
  3. 지니
    오토스케일링 디크리스 정책에 대한 설명도 부탁드립니다.
  4. Launch Configuraion 설정 추가에서 계속 이미지를 찾을 수 없다고 나옵니다. 이거 어찌 해야 하죠?
  5. Neocovh
    최고에요~ 감사합니다
  6. kkuppoom
    egoing님 수업 감사합니다:)
  7. kota
    policy와 cloud alarm 은 auto scaling group을 삭제할때 같이 삭제가 되는건가요 ?
    9번 삭제 항목에서 따로 삭제를 안하길래 궁금해서 여쭈어 봅니다 ㅎㅎ
  8. 안녕하세요. 질문 하나만 드릴께요. --min size 를 1로 잡으면 원본서버 외 1개의 서버 (총 2대)를 기본으로 해야만 auto scaling 사용이 가능한건가요? 알람 설정 후에 --min size 1에서 생성된 서버를 삭제하면 데이터를 불러올 서버가 없어지는 듯 하네요. 2대를 기본으로 가야 사용이 가능한 것인지 궁금합니다.ㅠ
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기