잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

AWS EC2 Auto Scaling 본문

Study/AWS

AWS EC2 Auto Scaling

현록 2023. 2. 8. 18:23

[구성]

[준비]

[설정]

[확인]

 

 


 

[구성]

 

인터넷 ━ (AWS) Application Load Balancer ━ (AWS) [ EC2 Auto Scaling ]

 

로 간단하게 구성해볼 것이다.

 

 


[준비]

 

로드 밸런서의 대상 그룹을 준비

로드 밸런서 준비


로드 밸런서의 대상 그룹을 준비


더보기

대상인 Auto Scaling 그룹을 나중에 만드니 비워두고 생성한다.

Auto Scaling 그룹을 생성할 때 연결지어주면 된다.



 

 

로드 밸런서 준비



 

 


[설정]

 

EC2 인스턴스의 자동 생성을 위한 시작 템플릿 생성

Auto Scaling 그룹 생성


EC2 인스턴스의 자동 생성을 위한 시작 템플릿 생성

EC2 인스턴스를 만들 때처럼 원하는 대로 설정해준다.

이 예제에서는 Auto Scaling 그룹에 Code Deploy까지 연계할 예정이라 해당 정책이 포함된 Role을 부여했고,

사용자 데이터에는 CodeDeploy Agent도 설치하도록 되어있다.

또한 jdk 설치와 S3 버킷으로부터 애플리케이션을 내려받아 서비스로 등록 및 실행까지 하도록 했다.

증설이 이루어졌을 때 자동으로 제 역할을 수행할 수 있도록 설정해준다.

예시에 적은 스크립트는 아래와 같다.

#!/bin/bash

yum update -y

yum install -y ruby

yum install -y wget

yum install -y java-17-amazon-corretto.x86_64

  

# /opt/codedeploy-agent/bin/codedeploy-agent stop

# yum erase codedeploy-agent -y

  

cd /home/ec2-user

wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

chmod +x ./install

sudo ./install auto

rm ./install

  

aws s3 cp --region ap-northeast-2 s3://s3-blackdeer/codedeploy/github/simple-http-rest/build.zip /home/ec2-user/spring-simple-http-rest/build.zip

unzip -o /home/ec2-user/spring-simple-http-rest/build.zip -d /home/ec2-user/spring-simple-http-rest

rm /home/ec2-user/spring-simple-http-rest/build.zip

chown -R ec2-user:ec2-user /home/ec2-user/spring-simple-http-rest

  

aws s3 cp --region ap-northeast-2 s3://s3-blackdeer/codedeploy/github/simple-http-rest/spring-simple-http-rest.service /lib/systemd/system/spring-simple-http-rest.service

chmod 644 /lib/systemd/system/spring-simple-http-rest.service

systemctl daemon-reload

systemctl enable spring-simple-http-rest

service spring-simple-http-rest start

아래는 서비스 등록에 사용한 spring-simple-http-rest.service

[Unit]

Description=Spring Boot Application for Simple Http REST

ConditionFileNotEmpty=/home/ec2-user/spring-simple-http-rest/build/libs/simple-http-rest-1.0.0.war

  

[Service]

ExecStart=/bin/java -jar /home/ec2-user/spring-simple-http-rest/build/libs/simple-http-rest-1.0.0.war

Restart=on-failure

RestartPreventExitStatus=9

User=ec2-user

Group=ec2-user

  

[Install]

WantedBy=multi-user.target


Auto Scaling 그룹 생성

위에서 생성한 시작 템플릿을 선택한다.

ㆍ준비해둔 로드 밸런서의 대상 그룹을 선택해준다.

ㆍAuto Scaling에서는 EC2 인스턴스 자체의 CPU나 네트워크 등 머신에 대한 상태 확인을 기본으로 하고,

 로드 밸런서 사용시에는 대상 그룹의 상태 확인도 Auto Scaling의 상태 확인에 포함할지 설정할 수 있다.

 (준비 과정에서 로드 밸런서 대상 그룹에서는 애플리케이션의 API 응답여부를 척도로 설정했었다.)

※ 예시에서는 선택 사항은 많이 넘겼다. 필요하면 사용하도록 한다.

ㆍ예시에서는 로드 밸런서가 EC2 인스턴스로 요청을 분배할 때,

 하나의 인스턴스가 처리하게 되는 분당 요청 수로 설정했다.

 예시에서는 자동 증감을 보기 위해 낮게 설정했다.

ㆍ축소 비활성화를 하거나, 축소 보호를 인스턴스에 주게되면

 조정 정책보다 여유로워진 상황에서도 인스턴스를 줄이지 않고 유지하게 된다.

필요하면 사용한다. 예시에서는 모두 넘겼다.

 

 


[확인]

 

생성한 Auto Scaling 그룹에서 작동하고 있는 인스턴스들의 상태를 확인할 수 있다.

최소 1대를 설정했기에 Auto Scaling 그룹이 생성되자마자 EC2 인스턴스 1대를 생성한 것을 볼 수 있다.

연결한 로드 밸런서의 대상 그룹에서도 해당 EC2 인스턴스가 연결되어 애플리케이션을 제대로 실행하고 있는 것을 볼 수 있다.

(준비 과정에서 로드 밸런서 대상 그룹에서는 애플리케이션의 API 응답여부를 척도로 설정했었다.)

로드 밸런서로 애플리케이션의 API를 사용했을 때 응답을 받을 수 있었다.

 

 


이제 로드 밸런서에 많은 API Call을 줘서 기대한대로 EC2 인스턴스가 늘어나는지 볼 것이다.

blackdeer@Mac ~ % ab -n 20000 -c 20 -m POST http://elb-spring-simple-http-rest-??????????.ap-northeast-2.elb.amazonaws.com:80/simple/info

This is ApacheBench, Version 2.3 <$Revision: 1901567 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking elb-spring-simple-http-rest-??????????.ap-northeast-2.elb.amazonaws.com (be patient)

Completed 2000 requests

Completed 4000 requests

Completed 6000 requests

Completed 8000 requests

Completed 10000 requests

Completed 12000 requests

Completed 14000 requests

Completed 16000 requests

Completed 18000 requests

Completed 20000 requests

Finished 20000 requests

Server Software:

Server Hostname:        elb-spring-simple-http-rest-??????????.ap-northeast-2.elb.amazonaws.com

Server Port:            80

Document Path:          /simple/info

Document Length:        742 bytes

Concurrency Level:      20

Time taken for tests:   197.915 seconds

Complete requests:      20000

Failed requests:        0

Total transferred:      17520000 bytes

HTML transferred:       14840000 bytes

Requests per second:    101.05 [#/sec] (mean)

Time per request:       197.915 [ms] (mean)

Time per request:       9.896 [ms] (mean, across all concurrent requests)

Transfer rate:          86.45 [Kbytes/sec] received

Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:       85   99   6.0    100     201

Processing:    85   99  10.9    100     403

Waiting:       85   98   6.1    100     250

Total:        170  198  13.7    200     503

Percentage of the requests served within a certain time (ms)

  50%    200

  66%    200

  75%    201

  80%    201

  90%    202

  95%    203

  98%    209

  99%    246

 100%    503 (longest request)

동시에 20개의 클라이언트로 총 20000회의 요청을 주었다.

우리가 설정한 값은 분당 60회이니 아주 낮은 값이었지만... 확실한 결과를 위해 과하게 주었다.

 

 


그랬더니 최대 수까지 늘어났다.

인스턴스 수명 주기를 보면 Pending으로 생성하고 InService로 구동되는 것을 볼 수 있다.

대상 그룹에서도 InService된 EC2 인스턴스는 이제 ELB의 상태 확인을 받게 된다.

로드 밸런서로 요청을 보내서 다른 EC2 인스턴스로 요청들을 넘겨주는 것을 확인했다.

 

 


그리고 요청을 보내지 않고 기다려본다.

정책에 따라 인스턴스당 요청 수가 줄어들면서 이제 EC2 인스턴스들을 줄이는 것을 볼 수 있다.

Terminating되면서 EC2 인스턴스들을 제거한다.

 

 

Comments

잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→