이번 중간 프로젝트때 하게 될 3-Tier를 미리 구축해보았다.
엄청나게 어려울줄 알았는데, 생각보다 그렇게 어렵지는 않았다.
구축하는 방법은 다음과 같다.
1. VPC 생성하기
- IPv4 CIDR : 10.0.0.0/16
2. Internet Gateway 생성하기
3. Subnet 생성하기
- Public1 : 10.0.0.0/24
- Public2 : 10.0.1.0/24
- Private1 : 10.0.2.0/24
- Private2 : 10.0.3.0/24
- Private3 : 10.0.4.0/24
- Private4 : 10.0.5.0/24
- Private5 : 10.0.6.0/24
- Private6 : 10.0.7.0/24
4. Security Group 생성하기
- Bastion SG : 22, 80 포트 열어주기
- RDB SG : 3306 포트 열어주기
- ABL SG : 80 포트 열어주기
- NLB SG : 8080 포트 열어주기
5. Public Instance 생성하기
6. NAT Gateway 생성하기
7. Route Table 생성하기
- Public Route Table : Internet Gateway와 연결
- Private Route Table : 각 Private Subnet마다 하나씩 만들어서 NAT Gateway와 연결
8. ALB 생성하기
- Application Load Balancer 선택
- Scheme : Internet-facing
- Load balancer IP address type : IPv4
- Network mapping
- VPC 선택
- Availability Zones : 각 가용영역의 Public 서브넷 선택
- Security Groups : ABL SG
- Listeners and Routing :
- TargetGroup :
- Registered Targets :
- Instances : Private1, Private2
- Port : 80
- Registered Targets :
- TargetGroup :
9. NLB 생성하기
- Network Load Balancer 선택
- Scheme : Internet-facing
- Load balancer IP address type : IPv4
- Network mapping
- VPC 선택
- Availability Zones : Private1, Private2 서브넷 선택
- Security Groups : NLB SG
- Listeners and Routing :
- TargetGroup :
- Registered Targets :
- Instances : Private3, Private4
- Port : 8080
- Registered Targets :
- TargetGroup :
10. AMI 만들기
- Public Instance 이미지 생성하기
11. Launch Template 만들기
- Auto Scaling Group을
Private1과 Private2 / Private3과 Private4로 각각 만들어야 하므로,
Launch Template 또한 각각 만들어준다. - Application and OS Images
- MyAMIs
- Owned by me : 방금 만든 AMI 선택
- MyAMIs
- Instance Type : t3.micro
- Key pair : labkey.pem
- Network Settings :
- Subnet : Don't include in launch template
- Firewall(security groups) : Select existing security group
- Security Groups : Bastion SG
- Advanced details :
- IAM instance profile : EC2-Role
- Hostname type : Don't include in launch template
- DNS Hostname : 둘 다 체크 해제
- Detailed CloudWatch monitoring : Enable
- Create launch template
12. Auto Scaling Group 만들기 -> 여기서 문제가 발생했음..ㅠㅠ (제발.. 헷갈리지 말아라..ㅠㅠ)
- Auto Scaling Group은 Private 1, Private2 Subnet과 Private3, Private4 Subnet에 각각 따로 만들어준다.
- Launch template : 방금 생성한 런치템플릿을 선택
- Network :
- VPC : 맨 처음에 생성한 VPC를 선택
- Availability Zones and subnets : Auto Scaling Group으로 인스턴스를 생성할 가용영역을 선택한다. (각각 Private1, Private2와 Private3, Private4를 선택)
- Load balancing :
- Attach to an existing load balancer 선택
- Attach to an existing load balancer :
- 각 Private(LB - ALB 혹은 NLB)에 맞는 Target Group 선택
- VPC Lattice integration options :
- No VPC Lattice service 선택
- Health Checks :
- 아무것도 선택 안함. (중요)
- Health check grace period : 20초
- Additional Settings :
- 아무것도 선택 안함.
- Capacity :
- Desired capacity : 2
- Minimum capacity : 2
- Maximum capacity : 4
13. WAS Server 브라우저에 띄워서 확인하기
- Public Instance
- Public Instance를 update, upgrade, autoremove 한다.
- sudo apt update
- sudo apt upgrade -y
- sudo apt autoremove
- Public Instance에 apache2와 tomcat, openjdk와 mysql-client-core, mariadb-client-core 를 설치한다.
- sudo apt install apache2 -y
- sudo systemctl status apache2
- sudo apt install -y openjdk-11-jdk
- sudo vi ~/.bashrc
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- export PATH=$JAVA_HOME/bin:$PATH
- sudo apt-cache search tomcat -> tomcat 이 몇 버전부터 설치 가능한지 파악
- sudo apt-get install tomcat10 tomcat10-admin
- ss -ltn : 8080 포트가 정상 작동하는지 확인
- sudo systemctl enable tomcat10.service
- sudo ufw allow 8080
- sudo apt install mysql-client-core-8.0
- sudo apt install mariadb-client-core
- Public Instance에서 mysql 접속이 잘 되는지 확인.
- mysql -u [유저명] -p[비밀번호] -h [엔드포인트주소]
- sudo vi labkey.pem -> labkey.pem의 내용 복붙
- ssh -i labkey.pem ubuntu@[private1 or private2 IP]
- Public Instance를 update, upgrade, autoremove 한다.
- Private1, Private2 Instances
- Private Instance를 update, upgrade, autoremove 한다.
- sudo apt update
- sudo apt upgrade -y
- sudo apt autoremove
- Private Instance에 apache2와 mysql-client-core, mariadb-client-core 를 설치한다.
- sudo apt install apache2 -y
- sudo systemctl status apache2
- sudo apt install mysql-client-core-8.0
- sudo apt install mariadb-client-core
- Public Instance에서 mysql 접속이 잘 되는지 확인.
- mysql -u [유저명] -p[비밀번호] -h [엔드포인트주소]
- sudo a2enmod proxy
- sudo a2enmod proxy_http
- Private1, Private2 Instance의 Apache 설정 파일을 수정한다.
- cd /etc/apache2/sites-available
- vi 000-default.conf
- <VirtualHost *:80>
ServerAdmin webmaster@localhost
...
ProxyPass / http://[Private3 또는 Private4 IP]:8080/
ProxyPassReverse / http://[Private3 또는 Private4 IP]:8080/
Redirect / http://[Private3 또는 Private4 IP]:8080/
...
</VirtualHost> - sudo systemctl restart apache2
- sudo vi labkey.pem -> labkey.pem의 내용 복붙
- ssh -i labkey.pem ubuntu@[private3 or private4 IP]
- Private Instance를 update, upgrade, autoremove 한다.
- Private3, Private4 Instances
- Private Instance를 update, upgrade, autoremove 한다.
- sudo apt update
- sudo apt upgrade -y
- sudo apt autoremove
- Private Instance에 tomcat10와 mysql-client-core, mariadb-client-core 를 설치한다.
- sudo apt install -y openjdk-11-jdk
- sudo vi ~/.bashrc
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- export PATH=$JAVA_HOME/bin:$PATH
- sudo apt-cache search tomcat -> tomcat 이 몇 버전부터 설치 가능한지 파악
- sudo apt-cache search tomcat -> tomcat 이 몇 버전부터 설치 가능한지 파악
- sudo apt-get install tomcat10 tomcat10-admin
- ss -ltn : 8080 포트가 정상 작동하는지 확인
- sudo systemctl enable tomcat10.service
- sudo ufw allow 8080
- sudo apt install mysql-client-core-8.0
- sudo apt install mariadb-client-core
- Public Instance에서 mysql 접속이 잘 되는지 확인.
- mysql -u [유저명] -p[비밀번호] -h [엔드포인트주소]
- cd /var/lib/tomcat10/webapps/ROOT 접속
- rm -rf index.html
- sudo vi index.jsp
- Private Instance를 update, upgrade, autoremove 한다.
<%@ page import = "java.net.InetAddress" %>
<%@ page import = "java.sql.*" %>
<html>
<head>
<title>Hello from JSP</title>
<%!
String message = "Hello World. From JSP test page Tomcat is running.";
%>
<%
InetAddress inet= InetAddress.getLocalHost();
%>
</head>
<body>
<hr color="#000000" />
<center>
<h2><font color="#3366cc"><%= message%></font></h2>
<h3><font color="#0000ff"><%= new java.util.Date()%></font></h3>
<hr color="#000000" />
<h3><%=application.getServerInfo()%></h3>
<h3>Host Name : <%=inet.getHostName() %></h3>
<h3>Host Address : <%=inet.getHostAddress() %></h3>
<h3>Client IP : <%=request.getRemoteAddr()%></h3>
<h3>Client IP(X-FORWARDED-FOR) : <%=request.getHeader("x-forwarded-for")%></h3>
<hr color="#000000" />
<h3>ALL HTTP HEADERS</h3>
<font><% java.util.Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();
out.println(name + ":<BR>" + request.getHeader(name) + "<BR><BR>");
}%>
</font>
<hr color="#000000" />
<h3>MYSQL CONNECTION TEST</h3>
<font>
<%
Connection conn = null;
try{
String url = "jdbc:mariadb://[엔드포인트]:3306/[DB이름]";
String id = "[유저ID]"; // 사용자계정
String pw = "[유저PW]"; // 사용자계정 패스워드
Class.forName("org.mariadb.jdbc.Driver");
conn=DriverManager.getConnection(url,id,pw);
out.println("DB Connected");
} catch(Exception e) {
out.println(e.toString());
}
%>
</font>
</body>
</html>
- wget https://dlm.mariadb.com/3934032/Connectors/java/connector-java-3.5.0/mariadb-java-client-3.5.0.jar
- sudo mv mariadb-java-client-3.5.0.jar /usr/share/tomcat10/lib
- sudo systemctl tomcat10
- sudo systemctl restart tomcat10
- ALB DNS 주소로 접속, 새로고침 시 Host Name, Host Address, Client IP 등이 잘 변경되는지, 그리고 맨 하단에 DB Connected가 뜨는지 확인.
14. PetClinic Build하기
PetClinic Github : https://github.com/SteveKimbespin/petclinic_btc
GitHub - SteveKimbespin/petclinic_btc
Contribute to SteveKimbespin/petclinic_btc development by creating an account on GitHub.
github.com
우선, PetClinic이 Tomcat9 환경에서 구성되었고, jdbc도 mysql과 연동작업이 이뤄지기 때문에,
기존에 설치한 Tomcat10을 삭제 후, Tomcat9를 새롭게 설치해주었다.
또한, RDS도 MySQL로 새롭게 생성하였다.
- 우선, Tomcat10을 정지시킨다.
- sudo systemctl stop tomcat10
- Tomcat10 패키지를 제거한다.
- sudo apt remove tomcat10 -y
sudo apt purge tomcat10 -y
- sudo apt remove tomcat10 -y
- 남아있는 Tomcat10 폴더와 설정 파일을 삭제한다.
- sudo rm -rf /etc/tomcat10
sudo rm -rf /var/lib/tomcat10
- sudo rm -rf /etc/tomcat10
그 다음, Tomcat9를 설치해줘야 하는데, sudo apt install 에서는 9버전 설치가 불가능해서, 따로 Tomcat9 압축파일을 다운받아주었다.
이 부분은 팀장 상준님의 코드를 참고하였다.
- Tomcat9 압축폴더를 다운받는다.
- opt 폴더로 이동 후, tomcat 폴더를 만들어주고, 거기에 압축폴더를 풀어준다.
- cd /opt
- sudo mkdir tomcat
- sudo tar xzvf apache-tomcat-9*tar.gz -C /opt/tomcat --strip-components=1 로 압축풀기
- 폴더의 권한을 변경하고, startup.sh과 shutdown.sh를 실행한다.
- sudo chown -RH tomcat: /opt/tomcat
- sudo chmod +x /opt/tomcat/bin/startup.sh
- sudo chmod +x /opt/tomcat/bin/shutdown.sh
- /etc/systemd/system/ 로 이동 후, 기존의 tomcat.service를 삭제 후, 새로 작성한다.
- cd /etc/systemd/system/
- sudo vi tomcat.service
- [Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
/usr/lib/jvm/java-1.21.0-openjdk-amd64
- sudo systemctl daemon-reload 으로 저장된 내용을 reload 한다.
- sudo ufw allow 8080으로 8080 포트의 방화벽을 열어준다.
그 다음으로, git을 설치 후, git clone을 받는다.
- sudo apt update && sudo apt install git -y
- git clone https://github.com/SteveKimbespin/petclinic_btc.git
GitHub - SteveKimbespin/petclinic_btc
Contribute to SteveKimbespin/petclinic_btc development by creating an account on GitHub.
github.com
이렇게 하면 petclinic_btc 폴더에 프로젝트가 다운로드 된다.
그 다음으로, Maven을 설치한다.
- sudo apt update && sudo apt install maven -y
pom.xml에서 WAR 파일로 패키징 되는지 확인하고, 새로 생성한 MySQL RDS 정보를 넣어 수정해준다.
- <packaging>war</packaging> -> 이 코드가 있는지 확인한다.
<properties>
<jpa.database>MYSQL</jpa.database>
<jdbc.driverClassName>com.mysql.cj.jdbc.Driver</jdbc.driverClassName>
<jdbc.url>jdbc:mysql://[RDS 엔드포인트]:3306/petclinic?useUnicode=true</jdbc.url>
<jdbc.username>[MySQL Username]</jdbc.username>
<jdbc.password>[MySQL User Password]</jdbc.password>
</properties>
- [] 부분을 수정해주면 된다. 참고로, 나는 initial db를 petclinic으로 만들어주었다. 다른 db로 만든 분들은 :3306/ 뒤에 있는 petclinic을 다른 db 이름으로 수정해주면 된다.
- cd /opt/tomcat/conf 로 이동한다.
- sudo vi tomcat-users.xml 로 파일을 연다.
- <tomcat-users> </tomcat-users> 태그 사이에 다음과 같은 role을 추가한다
- <role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/> - 저장하고 나온다.
- sudo systemctl restart tomcat으로 톰캣서버를 다시 실행한다.
프로젝트 폴더로 이동하여 빌드한다.
- cd petclinic_btc
./mvnw tomcat7:deploy -P MySQL
빌드가 완료되면 target 폴더에 *.war 파일이 생성된다.
WAR파일을 Tomcat에 배포한다.
생성된 WAR파일을 Tomcat의 webapps 폴더로 복사한다.
- sudo cp target/*.war /opt/tomcat/webapps/
Tomcat을 재시작하여 새로 배포된 WAR 파일을 반영한다.
- sudo systemctl restart tomcat
http://<Public_IP>:8080/petclinic/ 으로 접속해 애플리케이션이 정상적으로 동작하는지 확인한다.
이렇게 잘 뜨면 성공..!