3 분 소요

AWS에서 인스턴스의 로드밸런서 실습과 오토스케일링 실습을 해보았다.
# 톰캣 설치

wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.90/bin/apache-tomcat-8.5.90.zip
apt update && apt-get -y install openjdk-8-jdk unzip
unzip apache-tomcat-8.5.90.zip
rm -rf apache-tomcat-8.5.90.zip
mv apache-tomcat-8.5.90/ tomcat
chmod -R 777 tomcat/
./tomcat/bin/startup.sh
curl localhost:8080 // verify

image

image

인스턴스 재부팅시 톰캣 실행이 안되고 있는걸 확인하였다.
<재부팅시 톰캣 동작을 위한 스크립트>

vim /etc/init.d/tomcat.sh
!
#!/bin/bash
export CATALINA_BASE=/root/tomcat
# See how we were called.
case "$1" in
  start)
  echo -n "Starting tomcat: "
  $CATALINA_BASE/bin/startup.sh
  echo
  ;;
  stop)
  echo -n "Shutting down tomcat: "
  $CATALINA_BASE/bin/shutdown.sh
  echo
  ;;
  restart)
  $0 stop
  sleep 5
  $0 start
  ;;
  *)
  echo "Usage: $0 {start|stop|restart}"
  exit 1
esac
exit 0
!
update-rc.d tomcat.sh defaults
chmod 755 /etc/init.d/tomcat.sh
ln -s /etc/init.d/tomcat.sh /etc/rc3.d/S81tomcat.sh
ln -s /etc/init.d/tomcat.sh /etc/rc2.d/S81tomcat.sh
ln -s /etc/init.d/tomcat.sh /etc/rc5.d/S81tomcat.sh
ln -s /etc/init.d/tomcat.sh /etc/rc0.d/K26tomcat.sh
ln -s /etc/init.d/tomcat.sh /etc/rc6.d/K26tomcat.sh

image

image

이제는 인스턴스가 재부팅 후에도 자동으로 톰캣이 실행되는 것을 확인할 수 있다.
서버 식별을 위해 호스트의 IP를 보여주는 코드를 넣어준다.
vim ./tomcat/webapps/ROOT/test.jsp
!
<%@ page contentType="text/html; charset=UTF-8"%>
<html>
    	<head><title>hello world</title></head>
    	<body>
    	<h2>
            	TOMCAT TEST<br><br>
            	time : <%= new java.util.Date()%>
            	<%@ page import="java.net.InetAddress" %><br>
            	<%InetAddress inet= InetAddress.getLocalHost();%>
            	WAS ip : <%=inet.getHostAddress()%>
    	</h2>
 
 
    	</body>
</html>
!
./tomcat/bin/shutdown.sh
./tomcat/bin/startup.sh

image

잘 동작하는지 확인.

image

image로 만들기 위해 인스턴스를 중지하였다.

image

image

인스턴스를 이미지로 생성하고 그 이미지로 인스턴스를 생성하였다.

image

image

ALB를 선택하여 로드밸런서를 생성한다.
Listener port는 최종 서비스하는 포트가 80이라면 80으로 받아서 8080으로 포워딩도 가능하다.

image

image

타켓그룹을 8080포트로 생성한다.
정상적으로 생성됨을 확인.

image

image

해당 페이지를 새고고침 했을 때 번갈아가며 접속됨 을 확인할 수 있다.

image

Auto Scaling에 사용하기 위해 IMG를 베이스로 해서 템플릿을 생성한다. 

image

IMG를 인스턴스로 생성했다.
오토 스케일링 실습을 위해 CPU 부하가 걸렸을때 서버가 자동 증가할 수 있도록 가정한다.
 apt -y install stress
vim /etc/init.d/stress.sh
!
#! /bin/bash
sudo stress --cpu 1 --timeout 1200
!
chmod 755 /etc/init.d/stress.sh
update-rc.d stress.sh defaults
ln -s /etc/init.d/stress.sh /etc/rc3.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc2.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc5.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc0.d/K26stress.sh
ln -s /etc/init.d/stress.sh /etc/rc6.d/K26stress.sh

image

image

인스턴스 재부팅 후에 `top` 명령어로 cpu 부하가 100으로 올라가는지 확인하였다.

image

인스턴스 중지 후 `tomcat-stress` 이름으로 이미지를 생성하였다.

image

image

Auto Scaling에 사용될 시작 템플릿을 생성한다.
* Auto-scaling group 생성 순서 *
1. 로드밸런서 생성
2. 빈 타겟그룹 생성
3. auto-scaling group을 생성 후 해당 타겟그룹에 넣어준다. 

image

image

로드밸런서를 생성한다.

image

image

`tomcat-as-tg` 라는 이름의 타겟 그룹을 생성한다.
새로운 서버가 생성되면 똑같이 헬스체크를 하고 트래픽을 보내기때문에 빠른 서버 생성 후 가동을 위해 interval 10초로 생성한다.

image

빈 타겟그룹이 설정된 로드밸런서를 생성한다.
이제 오토스케일링 그룹을 생성하여 지정한다.

image

image

오토 스케일링 그룹 이름과 아까 생성한 `tomcat-tem` 템플릿으로 설정한다.
아까 템플릿을 생성할때 지정하지 않았던 vpc, subnet을 설정한다.

image

생성했던 로드 밸런서에 연결한다.

image

부팅되는 시간동안 헬스체크가 되면 안되므로 상태 확인 유예 기간을 가진다. 30초로 설정

image

`Cloudwatch는 log 등을 기록하는 지표 수집 모니터링 도구이다.

image

최소 용량과 최대용량은 고정값이고. 원하는 용량은 desirable한, 트래픽과 상황에 맞춰 유동적으로 변화하는 값이다.

image

인스턴스의 평균 CPU 사용률이 70%(임계값)를 넘으면 인스턴스를 하나 생성도록 설정한다.

image

생성된 오토 스케일링 그룹을 확인하면 인스턴스가 확인된다.
상태 창에 'healthy' 인지 확인하는 것이 중요하다.

image

auto scaling 설정에 따라서 자동으로 인스턴스가 4개까지 늘어남을 확인할 수 있다.
이제 늘어난 인스턴스를 다시 축소하는 설정위해 다음과 같이 설정한다.
생성된 인스턴스 4개에 접근.
top // PID 확인
kill -9 [PID] // 생성된 4개 인스턴스 모두 0으로 만든다.

image

정책의이름과 축소 정책을 설정 하므로 `작업수행` 제거를 선택.
`그런 다음 대기` 한대를 삭제 후 30초를 기다린다는 뜻이다.
CloudWatch 경보 생성을 눌러 참조할 지표를 선택한다.

image

해당 지표로 축소 정책을 생성한다.

image

image

CPU 50% (임계값) 이하로 떨어지면 인스턴스를 삭제하겠다.

image

image

image

image

경보를 생성 후 생성한 경보를 선택하여 축소 정책을 생성한다.

image

인스턴스들의 CPU 사용량이 0% 이므로 경보 상태임을 확인할 수 있다.

image

축소 설정에 따라 1개를 제외한 3개의 인스턴스가 삭제됨을 확인할 수 있다.

[실습과제] 

EC2 인스턴스에 웹서버를 설치하고 이미지를 통해 시작 템플릿을 만들어서 최소 1개 , 최대 3개의 규모를 갖는 오토스케일링을 해보세요! 

인덱스파일의 내용은
auto scaling test 

CPU 부하 80% 이상에서 인스턴스가 증가하고,
CPU 부하 30% 이하에서 인스턴스가 감소하도록 정책을 구성하세요.

로드밸런서는 외부에서 접속 가능해야 합니다.

해당 정책을 통해 구성된 오토스케일링 그룹이 적절히 동작하는지도 확인해보세요.
EC2 인스턴스 생성 후 접근
sudo -i
apt update && apt -y install nginx
systemctl enable --now nginx
cd /var/www/html
echo auto scaling test > index.html
systemctl restart nginx
curl [퍼블릭IP]:80 // verify
apt -y install stress
vim /etc/init.d/stress.sh
!
#! /bin/bash
sudo stress --cpu 1 --timeout 1200
!
chmod 755 /etc/init.d/stress.sh
ln -s /etc/init.d/stress.sh /etc/rc3.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc2.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc5.d/S81stress.sh
ln -s /etc/init.d/stress.sh /etc/rc0.d/K26stress.sh
ln -s /etc/init.d/stress.sh /etc/rc6.d/K26stress.sh
인스턴스 재부팅 후에도 cpu 부하가 100으로 올라가는지 확인
인스턴스 중지 후 이미지 생성
시작템플릿 생성
로드밸런서 생성 시  빈 타겟그룹을 정의하여 생성한다.
오토스케일링그룹을 생성 한다. ( 원하는 용량 1, 최소 용량 1, 최대 용량 3 으로 설정)
`크기 조정 정책` 대상의 임계값을 80으로 설정한다.
인스턴스가 1개에서 설정한 시간에 따라 3개까지 확장됨을 확인할 수 있다.
이제 `nginx-cpu-low` 라는 이름의 삭제 정책을 생성한다.
Cloudwatch 경보의 지표 설정에서 임계값 30으로 설정한다.
경보 생성 후 삭제 정책에 추가하여 생성하면 설정한 시간에 따라 인스턴스가 최소 1개를 제외한 나머지는 삭제되는 것을 확인할 수 있다.

댓글남기기