자동으로 EC2 인스턴스를 생성하여 서비스를 확장하는 Auto Scaling

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

EC2 생성 옵션 설정과 Auto Scaling 그룹 생성하기

EC2 인스턴스 생성 옵션(Launch Configuration)을 설정하고, Auto Scaling 그룹을 생성해보겠습니다. Auto Scaling 그룹 목록(AUTO SCALING → Auto Scaling Groups)을 클릭합니다. 생성한 EC2 인스턴스 생성 옵션과 Auto Scaling 그룹이 하나도 없을 때 그림 19-9와 같은 페이지가 표시됩니다. Create Auto Scaling group 버튼을 클릭합니다.


그림 19-9 Auto Scaling 그룹 목록

EC2 인스턴스 생성 옵션과 Auto Scaling 그룹을 연달아 생성합니다(나중에 개별적으로 생성할 수 있습니다). 이제 Create launch configuration 버튼을 클릭합니다.


그림 19-10 Auto Scaling 그룹 생성

EC2 인스턴스를 생성할 때 사용할 AMI를 선택합니다. 왼쪽 My AMIs를 클릭하고, 방금 Auto Scaling용으로 생성한 AMI(AutoScalingAMI)의 Select 버튼을 클릭합니다.


그림 19-11 EC2 인스턴스 생성 옵션 설정

기본값 그대로 마이크로 인스턴스(t1.micro)를 사용합니다. Next: Configure details 버튼을 클릭합니다.


그림 19-12 EC2 인스턴스 생성 옵션 설정

EC2 인스턴스 생성 옵션을 설정합니다(그림 19-3).

  • Name: EC2 인스턴스 생성 옵션의 이름입니다. ExampleAutoScalingConfig를 입력합니다.
  • Purchasing option: 스팟 인스턴스를 사용 옵션입니다. 기본값 그대로 사용합니다.
  • IAM role: EC2 인스턴스에서 사용할 IAM 역할입니다. IAM 역할을 사용하면 액세스 키와 시크릿 키 없이 AWS API를 사용할 수 있습니다. IAM 역할을 생성하는 방법은 ‘16.4.1 IAM 역할 생성하기’를 참조하기 바랍니다.
  • Monitoring: Cloud Watch 세부 모니터링을 사용하는 옵션입니다. 1분 단위로 모니터링 할 수 있도록 이 부분에 체크합니다.
  • Advanced Details 탭을 클릭합니다.
  • Kernel ID: EC2 인스턴스를 생성할 때 사용할 Kernel ID입니다. 앞에서 AMI에 Kernel ID를 설정했으므로 기본값 그대로 사용합니다.
  • RAM Disk ID: EC2 인스턴스를 생성할 때 사용할 RAM Disk ID입니다. 기본값 그대로 사용합니다.
  • User data: root 권한으로 실행할 스크립트입니다. 이 부분이 가장 중요합니다. EC2 인스턴스가 생성되었을 때 여기에 설정한 스크립트가 실행됩니다. As Text를 선택하고 다음 User data 코드를 입력합니다. 이제 EC2 인스턴스가 생성되면 Node.js 서버를 실행하게 됩니다.
    • As text: 텍스트 상태 스크립트를 입력합니다.
    • As file: 미리 작성한 스크립트 파일을 업로드합니다.
    • Input is already base64 encoded: 스크립트 파일이 BASE64로 인코딩되었을 때 체크합니다.
  • IP Address Type: IP 주소 형태입니다. 기본값 그대로 사용합니다.
    • Only assign a public IP address to instance launched in the default VPC and subnet. (default): 기본 VPC와 서브넷에 생성된 EC2 인스턴스에만 공인 IP를 부여합니다.
    • Assign a public IP address to every instance: 모든 EC2 인스턴스에 공인 IP를 부여합니다.
    • Do not assign a public IP address to any instance: EC2 인스턴스에 공인 IP를 부여하지 않습니다.

User data

#!/bin/bash
node /home/ec2-user/ExampleServer/app.js &

설정이 완료되었으면 Next: Add Storage 버튼을 클릭합니다.


그림 19-13 EC2 인스턴스 생성 옵션 설정

User data와 최신 애플리케이션 소스 업데이트
이번 실습에서는 User data에서 Node.js로 웹 서버만 실행합니다. 실무에서 사용할 때는 최신 버전의 애플리케이션 소스를 S3 버킷이나 Git에서 받아온 뒤 웹 서버를 실행하면 됩니다.

S3 버킷에서 소스를 받을 때

  • S3에 접근할 수 있는 IAM 역할을 생성한다.
  • Auto Scaling으로 EC2 인스턴스를 생성할 때 IAM 역할을 사용하도록 설정한다.

User data

#!/bin/bash
cd /home/ec2-user
mkdir ExampleServer
chown -R ec2-user.ec2-user ExampleServer
aws s3 sync s3://examples3origin/ExampleServer ExampleServer
node /home/www/ExampleServer/app.js &

Git에서 소스를 받을 때는 다음처럼 합니다.

User data

#!/bin/bash
cd /home/ec2-user
git clone https://id:password@github.com/mycompany/ExampleServer.git ExampleServer
chown -R ec2-user.ec2-user ExampleServer
node /home/www/ExampleServer/app.js &

스토리지는 기본값 그대로 사용합니다. Next: Configure Security Group 버튼을 클릭합니다.


그림 19-14 EC2 인스턴스 생성 옵션 설정

Auto Scaling용 Security Group입니다. Add Rule 버튼을 클릭하고, HTTP를 선택합니다. 설정이 완료되었으면 Review 버튼을 클릭합니다.


그림 19-15 EC2 인스턴스 생성 옵션 설정

지금까지 설정한 내용에 이상이 없는지 확인합니다. 이상이 없으면 Create launch configuration 버튼을 클릭합니다.


그림 19-16 EC2 인스턴스 생성 옵션 확인

EC2 인스턴스에 사용할 키를 설정합니다. 최초에 EC2 인스턴스를 생성할 때 함께 생성한 키(awskeypair)를 선택하고, 아래 부분에 체크합니다. 그리고 Create launch configuration 버튼을 클릭합니다.


그림 19-17 EC2 인스턴스에 사용할 키 설정

Auto Scaling 그룹을 생성합니다(그림 19-18).

  • Launch Configuration: 앞에서 생성했거나 목록에서 선택한 EC2 인스턴스 생성 옵션의 이름이 표시됩니다.
  • Group name: Auto Scaling 그룹의 이름입니다. ExampleAutoScalingGroup을 입력합니다.
  • Group size: 최초에 EC2 인스턴스를 생성할 개수입니다. 기본값 그대로 사용합니다.
  • Network: Auto Scaling 그룹이 생성될 VPC입니다. 기본값 그대로 사용합니다.
  • Subnet: EC2 인스턴스가 생성될 서브넷입니다. 빈 칸을 클릭하면 서브넷의 목록이 표시됩니다. Default in ap-northeast-1a, Default in ap-northeast-1c를 선택합니다.
  • Advanced Details 탭을 클릭합니다.
  • Load Balancing: ELB 로드 밸런서를 사용하는 옵션입니다. 이 부분을 체크하고 빈 칸을 클릭하면 현재 생성된 ELB 로드 밸런서의 목록이 표시됩니다. 앞에서 생성한 ELB 로드 밸런서(exampleelb)를 선택합니다.
  • Health Check Type: Auto Scaling 그룹도 EC2 인스턴스의 헬스 체크를 합니다. 기본값 그대로 사용합니다.
    • ELB: ELB 로드 밸런서에서 확인한 헬스 체크 값을 사용합니다.
    • EC2: Auto Scaling 그룹이 개별적으로 EC2 인스턴스의 헬스 체크를 합니다.
  • Health Check Grace Period: EC2 인스턴스가 부팅 되었을 때(InService) 설정한 시간만큼 헬스 체크를 미룹니다. 기본값 그대로 사용합니다.
  • Monitoring: CloudWatch 세부 모니터링을 사용하는 옵션입니다. 이 부분에 체크합니다.

설정이 완료되었으면 Next: Configure scaling policies 버튼을 클릭합니다.


그림 19-18 Auto Scaling Group 생성

EC2 인스턴스를 추가하거나 삭제하는 기준을 설정합니다(그림 19-19).

  • Keep this group at its initial size: 앞에서 설정한 EC2 인스턴스 개수를 유지합니다.
  • Use scaling policies to adjust the capacity of this group: 설정한 정책에 따라서 EC2 인스턴스를 조절합니다. 이 부분을 선택합니다.
  • Scale between N and N instances: EC2 인스턴스를 최대 몇 개까지 추가하고, 삭제하더라도 최소 몇 개까지 남겨둘지 설정합니다. 최소 1개에서 최대 3개까지 늘려보겠습니다. 1과 3을 입력합니다.


그림 19-19 Auto Scaling 정책 설정

EC2 인스턴스를 추가하는 설정입니다(그림 19-20).

  • Name: EC2 인스턴스 추가 설정의 이름입니다. 기본값 그대로 사용합니다.
  • Execute policy when: EC2 인스턴스를 추가할 조건입니다. CloudWatch 알람을 선택하거나 새로 생성할 수 있습니다.
  • Take the action: 추가 설정이므로 Add입니다. EC2 인스턴스 1개를 추가할 것이므로 1을 입력하고, instances를 선택합니다.
    • instances: EC2 인스턴스 단위로 추가합니다.
    • percent of group: 현재 Auto Scaling 그룹 안에 생성된 EC2 인스턴스 개수를 기준으로 추가합니다.
  • And then wait: EC2 인스턴스를 추가한 뒤 설정한 시간 동안 기다립니다. 짧은 시간 안에 연속으로 EC2 인스턴스가 추가되는 것을 방지합니다. 기본값 그대로 사용합니다.

Add new alarm 링크를 클릭합니다.


그림 19-20 EC2 인스턴스 추가 설정

EC2 인스턴스를 추가하기 위한 CloudWatch 알람을 생성합니다(그림 19-21).

  • Send a notification to: 측정치에 도달했을 때 알림을 받습니다. 여기서는 사용하지 않을 것이므로 체크를 해제합니다.
  • Whenever: CloudWatch 측정치 종류와 측정 기준입니다. 기본값 그대로 Average와 CPU Utilization을 사용합니다.
  • Is: 측정치입니다. CPU 사용률 80% 이상으로 설정할 것이므로 >=에 80을 입력합니다.
  • For at least: 특정 시간 동안 설정한 값만큼 연속으로 측정치에 도달했을 때 알람을 발생시킵니다. 1분 동안 1번 도달했을 때 알람을 발생시킬 것이므로 1을 입력하고, 1 Minute를 선택합니다.
  • Name of alarm: CloudWatch 알람의 이름입니다. AutoScaling-Add-Alarm을 입력합니다.

설정이 완료되었으면 Create Alarm 버튼을 클릭합니다.


그림 19-21 Auto Scaling용 CloudWatch 알람 생성

EC2 인스턴스를 삭제하는 설정입니다(그림 19-22).

  • Name: EC2 인스턴스 삭제 설정의 이름입니다. 기본값 그대로 사용합니다.
  • Execute policy when: EC2 인스턴스를 삭제할 조건입니다. CloudWatch 알람을 선택하거나 새로 생성할 수 있습니다.
  • Take the action: 삭제 설정이므로 Remove입니다. EC2 인스턴스 1개를 삭제할 것이므로 1을 입력하고, instances를 선택합니다.
    • instances: EC2 인스턴스 단위로 삭제합니다.
    • percent of group: 현재 Auto Scaling 그룹 안에 생성된 EC2 인스턴스 개수를 기준으로 삭제합니다.
  • And then wait: EC2 인스턴스를 삭제한 뒤 설정한 시간 동안 기다립니다. 짧은 시간 안에 연속으로 EC2 인스턴스가 삭제되는 것을 방지합니다. 기본값 그대로 사용합니다.

Add new alarm 링크를 클릭합니다.


그림 19-22 EC2 인스턴스 삭제 설정

EC2 인스턴스를 삭제하기 위한 CloudWatch 알람을 생성합니다(그림 19-23).

  • Send a notification to: 측정치에 도달했을 때 알림을 받습니다. 여기서는 사용하지 않을 것이므로 체크를 해제합니다.
  • Whenever: CloudWatch 측정치 종류와 측정 기준입니다. 기본값 그대로 Average와 CPU Utilization을 사용합니다.
  • Is: 측정치입니다. CPU 사용률 5% 이하로 설정할 것이므로 <=에 5을 입력합니다.
  • For at least: 특정 시간 동안 설정한 값만큼 연속으로 측정치에 도달했을 때 알람을 발생시킵니다. 1분 동안 1번 도달했을 때 알람을 발생시킬 것이므로 1을 입력하고, 1 Minute를 선택합니다.
  • Name of alarm: CloudWatch 알람의 이름입니다. AutoScaling-Remove-Alarm을 입력합니다.

설정이 완료되었으면 Create Alarm 버튼을 클릭합니다.


그림 19-23 Auto Scaling용 CloudWatch 알람 생성

Auto Scaling 정책 설정이 완료되었으면 Next: Configure Notifications 버튼을 클릭합니다.


그림 19-24 Auto Scaling 정책 설정

Auto Scaling이 동작할 때 알림을 받도록 설정합니다. Add notification 버튼을 클릭하고, create topic을 클릭합니다(그림 19-25).

  • Send a notification to: 알림 이름입니다. AutoScalingTopic을 입력합니다.
  • With these recipients: 알림을 받을 이메일 주소입니다. SNS 토픽으로 처음 사용하는 이메일 주소라면 인증 메일이 전송될 것입니다. 이 부분은 ‘26.1 SNS 토픽과 이메일 구독 생성하기’를 참조하기 바랍니다.
  • Whenever instances: 알림을 보내는 조건입니다. 기본값 그대로 사용합니다.
  • launch: EC2 인스턴스가 추가되었을 때 알림을 보냅니다.
  • terminate: EC2 인스턴스가 삭제되었을 때 알림을 보냅니다.
  • fail to launch: EC2 인스턴스 추가에 실패했을 때 알림을 보냅니다.
  • fail to terminate: EC2 인스턴스 삭제에 실패했을 때 알림을 보냅니다.

설정이 완료되었으면 Review 버튼을 클릭합니다(태그 설정은 생략하겠습니다).


그림 19-25 Auto Scaling 알림 설정

지금까지 설정한 내용에 이상이 없는지 확인합니다. 이상이 없으면 Create Auto Scaling group 버튼을 클릭합니다.


그림 19-26 Auto Scaling 그룹 설정 확인

Auto Scaling 그룹 생성이 완료되었습니다. View your Auto Scaling groups 링크를 클릭합니다.


그림 19-27 Auto Scaling 그룹 생성 완료

Auto Scaling 그룹 목록(AUTO SCALING → Auto Scaling Groups)으로 돌아왔습니다. 방금 생성한 Auto Scaling 그룹(ExampleAutoScalingGroup)을 선택하고, 아래 세부 내용에서 Instances 탭을 클릭하면 현재 생성된 EC2 인스턴스 목록을 볼 수 있습니다.


그림 19-28 Auto Scaling 그룹 목록

EC2 인스턴스 목록(INSTANCES → Instances)으로 이동합니다. EC2 인스턴스 목록을 보면 ELB 로드 밸런서를 생성할 때 함께 생성했던 EC2 인스턴스 2개와 Auto Scaling이 생성한 EC2 인스턴스 1개가 있습니다(EC2 인스턴스의 세부 내용에서 AMI ID 부분을 보면 Auto Scaling이 생성한 EC2 인지, 아닌지 알 수 있습니다).

ELB 로드 밸런서를 생성할 때 함께 생성했던 EC2 인스턴스 2개는 이제 삭제하거나 정지해도 됩니다. 저는 이 EC2 인스턴스 2개를 정지시켰습니다.


그림 19-29 EC2 인스턴스 목록

Auto Scaling이 생성한 EC2 인스턴스에 SSH로 접속합니다.

서비스에 사용자가 늘어나서 트래픽이 증가했다고 가정하고, CPU 사용률을 강제로 올려보겠습니다. 터미널에서 yes > /dev/null 명령을 입력합니다.

[ec2-user@ip-172-31-21-171 ~]$ yes > /dev/null

이 명령을 입력한 뒤 가만히 두고 잠시 기다립니다. 약 1분 정도 지나면 Auto Scaling 그룹에 새로운 EC2 인스턴스가 추가됩니다.

Auto Scaling 그룹 목록(AUTO SCALING → Auto Scaling Groups)으로 이동합니다. Auto Scaling 그룹(ExampleAutoScalingGroup)의 인스턴스 목록(Instances 탭)에 새로운 EC2 인스턴스가 추가되었습니다.


그림 19-30 Auto Scaling 그룹의 EC2 인스턴스 목록

이제 서비스에 사용자가 줄어서 트래픽이 감소했다고 가정하고, CPU 사용률을 내려보겠습니다. yes > /dev/null 명령을 실행한 터미널에서 Ctrl+C를 입력하여 명령을 중지시킵니다. 1~2분 정도 지나면 Auto Scaling 그룹에서 EC2 인스턴스가 삭제됩니다(기본적으로 가장 먼저 추가된 EC2 인스턴스부터 삭제됩니다).

Auto Scaling 그룹(ExampleAutoScalingGroup)의 인스턴스 목록(Instances 탭)에서 EC2 인스턴스가 삭제되고 있습니다. 잠시 기다리면 완전히 삭제되고, 목록에서 사라집니다.


그림 19-31 Auto Scaling 그룹의 EC2 인스턴스 목록

Scaling Policies 탭을 클릭하면 Auto Scaling 정책이 표시됩니다. 여기서 각 정책의 Actions 버튼을 클릭하면 팝업 메뉴가 나옵니다. Execute를 클릭하면 CPU 사용률을 강제로 변경하지 않아도 EC2 인스턴스를 즉시 추가하거나 삭제할 수 있습니다. 그리고 Edit를 클릭하면 정책을 변경할 수 있고, Delete를 클릭하면 정책을 삭제할 수 있습니다.


그림 19-32 Auto Scaling 그룹의 EC2 인스턴스 추가/삭제 명령

Scaling History 탭을 클릭하면 Auto Scaling 그룹(ExampleAutoScalingGroup)에서 추가/삭제 내역이 표시됩니다.


그림 19-33 Auto Scaling 그룹의 EC2 인스턴스 추가/삭제 내역

웹 브라우저를 실행하고 ELB 로드 밸런서의 URL에 접속합니다(ELB 로드 밸런서의 URL을 확인하는 방법은 ‘18.2 EC2 인스턴스에 웹 서버 실행하기’를 참조하기 바랍니다).

ELB 로드 밸런서를 통하여 Auto Scaling이 생성한 EC2 인스턴스에 접속하였습니다.


그림 19-34 웹 브라우저에서 ELB 로드 밸런서의 URL에 접속

이처럼 Auto Scaling 그룹을 생성하여 EC2 인스턴스를 자동으로 추가하고 삭제할 수 있습니다.

User data 스크립트를 수정하려면?
EC2 인스턴스 생성 옵션(Launch Configuration)은 한번 생성되면 수정할 수 없습니다. 따라서 User data 스크립트를 수정하려면 EC2 인스턴스 생성 옵션을 새로 생성해야 합니다.

  1. 수정된 User data 스크립트를 사용한 EC2 인스턴스 생성 옵션을 새로 생성합니다.
  2. Auto Scaling 그룹을 선택하고 Details 탭에서 Edit 버튼을 클릭합니다.
  3. Launch Configuration에서 방금 생성한 EC2 인스턴스 생성 옵션을 선택합니다.
  4. Save 버튼을 클릭합니다.
  5. 이후 Auto Scaling 그룹에서 생성되는 EC2 인스턴스는 수정된 User data 스크립트가 적용됩니다.

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.