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
인스턴스 재부팅시 톰캣 실행이 안되고 있는걸 확인하였다.
<재부팅시 톰캣 동작을 위한 스크립트>
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
이제는 인스턴스가 재부팅 후에도 자동으로 톰캣이 실행되는 것을 확인할 수 있다.
서버 식별을 위해 호스트의 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로 만들기 위해 인스턴스를 중지하였다.
인스턴스를 이미지로 생성하고 그 이미지로 인스턴스를 생성하였다.
ALB를 선택하여 로드밸런서를 생성한다.
Listener port는 최종 서비스하는 포트가 80이라면 80으로 받아서 8080으로 포워딩도 가능하다.
타켓그룹을 8080포트로 생성한다.
정상적으로 생성됨을 확인.
해당 페이지를 새고고침 했을 때 번갈아가며 접속됨 을 확인할 수 있다.
Auto Scaling에 사용하기 위해 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
인스턴스 재부팅 후에 `top` 명령어로 cpu 부하가 100으로 올라가는지 확인하였다.
인스턴스 중지 후 `tomcat-stress` 이름으로 이미지를 생성하였다.
Auto Scaling에 사용될 시작 템플릿을 생성한다.
* Auto-scaling group 생성 순서 *
1. 로드밸런서 생성
2. 빈 타겟그룹 생성
3. auto-scaling group을 생성 후 해당 타겟그룹에 넣어준다.
`tomcat-as-tg` 라는 이름의 타겟 그룹을 생성한다.
새로운 서버가 생성되면 똑같이 헬스체크를 하고 트래픽을 보내기때문에 빠른 서버 생성 후 가동을 위해 interval 10초로 생성한다.
빈 타겟그룹이 설정된 로드밸런서를 생성한다.
이제 오토스케일링 그룹을 생성하여 지정한다.
오토 스케일링 그룹 이름과 아까 생성한 `tomcat-tem` 템플릿으로 설정한다.
아까 템플릿을 생성할때 지정하지 않았던 vpc, subnet을 설정한다.
부팅되는 시간동안 헬스체크가 되면 안되므로 상태 확인 유예 기간을 가진다. 30초로 설정
`Cloudwatch는 log 등을 기록하는 지표 수집 모니터링 도구이다.
최소 용량과 최대용량은 고정값이고. 원하는 용량은 desirable한, 트래픽과 상황에 맞춰 유동적으로 변화하는 값이다.
인스턴스의 평균 CPU 사용률이 70%(임계값)를 넘으면 인스턴스를 하나 생성도록 설정한다.
생성된 오토 스케일링 그룹을 확인하면 인스턴스가 확인된다.
상태 창에 'healthy' 인지 확인하는 것이 중요하다.
auto scaling 설정에 따라서 자동으로 인스턴스가 4개까지 늘어남을 확인할 수 있다.
이제 늘어난 인스턴스를 다시 축소하는 설정위해 다음과 같이 설정한다.
생성된 인스턴스 4개에 접근.
top // PID 확인
kill -9 [PID] // 생성된 4개 인스턴스 모두 0으로 만든다.
정책의이름과 축소 정책을 설정 하므로 `작업수행` 제거를 선택.
`그런 다음 대기` 한대를 삭제 후 30초를 기다린다는 뜻이다.
CloudWatch 경보 생성을 눌러 참조할 지표를 선택한다.
CPU 50% (임계값) 이하로 떨어지면 인스턴스를 삭제하겠다.
경보를 생성 후 생성한 경보를 선택하여 축소 정책을 생성한다.
인스턴스들의 CPU 사용량이 0% 이므로 경보 상태임을 확인할 수 있다.
축소 설정에 따라 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개를 제외한 나머지는 삭제되는 것을 확인할 수 있다.
댓글남기기