- 보안그룹은 일단 Bastion에서 SSH 접속이 가능하게만 해두자. 추가 인바운드와 아웃바운드는 밑에서 한 번에 설정할 것이다
- PuttyGen을 이용해 ppk 파일을 pem 파일로 변환하자
vi sshkey.pem
chmod 400 sshkey.pem
ssh -i sshkey.pem ec2-user@'접속할 주소'
- Bastion Host에 pem Key를 옮기고, 권한 설정을 해준 뒤, ssh 접속을 하면 된다
- 잘 접속 된다!!!
- 외부에서 ALB의 EIP 주소를 향해 트래픽을 보낸다. 해당 트래픽은 인터넷 게이트웨이를 통해 ALB로 들어온다
- 해당 트래픽을 ALB의 AWS Internal Routing Node에게 보낸다. ELB 생성 시 지정한 서브넷에 ALB의 Internal Rounting Node가 생긴다
- Internal Routing node에서 ALB의 Routing Table을 통해 트래픽에 대한 적절한 라우팅 규칙을 찾는다. 라우팅 규칙을 통해 트래픽을 보낼 대상 그룹 및 인스턴스를 찾는다
- ALB에서 트래픽을 동일한 가용영역에 있는 인스턴스에게 보낸다
- LB를 생성하자
- ALB를 선택하자
- Scheme는 외부에서 트래픽을 받아야하므로 Internet-facing으로 설정하자
- vpc를 지정하고, 연결할 서브넷을 지정하자
- 서브넷을 지정하면, 해당 서브넷에 로드 밸런서 노드가 생긴다. 즉, 해당 노드를 통해 트래픽이 들어오는데, 외부 ALB의 경우 인터넷에서 트래픽을 받아야 하므로, 인터넷 게이트웨이로 라우팅이 설정된 퍼블릭 서브넷을 선택해야 한다!!!
- 2개의 WEB 서브넷을 지정하자
- 보안그룹은 위와 같이 80번 포트를 설정하자
- 외부에서 사용자들이 접속하므로, 모든 IP에 대해 HTTP 접속을 허용하고, 아웃바운드는 WEB 노드로 트래픽을 전달하기 위해, WEB 보안그룹을 지정해주자
- WEB 보안 그룹에 들어가서 ALB가 80번 포트에 접속할 수 있게 인바운드 규칙을 추가하자. 대상을 ALB 보안그룹을 지정하면 된다
- 보안 그룹을 지정하자
- 타켓 그룹을 생성하자
- 위와 같이 포트와 프로토콜을 설정하자
- 그룹에 포함할 인스턴스를 추가하자
- 상태 검사 설정에서 경로를 /index.html로 설정해야 한다
- 헬스 체크 프로토콜을 HTTP 프로토콜, 상태 검사 경로를 /index.html로 설정하는 것은 WEB 서버에 HTTP 프로토콜로 지정한 경로에 접근했을 때, 페이지 코드가 잘 출력되는지와 상태 코드가 200번대인지로 상태 검사를 하는 것이다
- HTTP 프로토콜로 헬스체크를 하려면 지정한 경로에 접속했을 때, 페이지 파일을 이용해 페이지 코드가 출력되고, 상태 코드가 200번대가 나와야 한다
- index.html 없이 확인하려면, TCP 프로토콜을 이용해서 헬스 체크를 해줘야 한다. 프로젝트 전체 구축이 끝나면, WEB에서 PROXY를 통해 요청을 WAS로 전달하므로, WEB의 /index.html은 확인할 수 없다. 따라서 추후에 WEB-WAS 연동이 끝나면, 위의 헬스 체크 설정을 바꿔줘야 한다
- 생성한 타켓 그룹을 지정하고, ALB를 생성하자!
- 이제 ALB가 생성됬으며, DNS NAME을 통해 접속할 수 있다!
- 먼저, 소스 파일로 설치하면 경로를 지정하기 편리하다. 설치 시, 경로를 지정할 수 있기에 경로 잡기에 좋다. 바이너리 설치는 경로를 따로 지정하기 어렵다. 소스 파일 설치는 바이너리 설치보다 세밀한 설정이 가능하다
- 두번째로, log4j 취약점 문제와 같은 보안 문제로 특정 버전을 사용하지 말라는 공고가 올라왔을 때, 해당 버전 외의 다른 버전을 설치할 수 있다 ( 바이너리 설치는 최신 버전을 설치해주지만, 소스 파일 설치는 원하는 버전을 설치할 수 있다 )
- 참고 : https://anggeum.tistory.com/entry/%EC%86%8C%EC%8A%A4-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%E2%86%94-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-Source-Compile-vs-Binary-Package
sudo yum update -y
sudo yum install -y gcc gcc-c++ expat-devel.x86_64 pcre-devel
- gcc와 관련 패키지를 설치하자
- gcc란 gnu 컴파일러 모음이다
- root 권한으로 실행해야 하므로, sudo로 명령 내려야 한다
cd /usr/local/src/
sudo wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
sudo tar zxvf pcre-8.44.tar.gz
cd pcre-8.44
sudo ./configure --prefix=/usr/local/pcre
sudo make install
- pcre 소스파일을 다운 받고, 압축을 해제한 다음, 컴파일 파일을 만들어 컴파일 해주자
- pcre란 Perl 호환 정규 표현식이다
cd /usr/local/src
# apr-util & apr & httpd 소스 파일 다운로드. 소스 파일은 아래 주소에서 링크 복사하자!
# https://httpd.apache.org/download.cgi
# https://apr.apache.org/download.cgi
sudo wget https://dlcdn.apache.org/httpd/httpd-2.4.56.tar.gz
sudo wget https://dlcdn.apache.org//apr/apr-1.7.2.tar.gz
sudo wget https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz
# 압축 해제
sudo tar zxvf httpd-2.4.56.tar.gz
sudo tar zxvf apr-1.7.2.tar.gz
sudo tar zxvf apr-util-1.6.3.tar.gz
# apr & apr-util 파일을 httpd 파일 안으로 이동
sudo mv apr-1.7.2 ./httpd-2.4.56/srclib/apr
sudo mv apr-util-1.6.3 ./httpd-2.4.56/srclib/apr-util
# httpd 폴더로 이동
cd httpd-2.4.56/
# 컴파일 파일 생성
sudo ./configure \
--prefix=/usr/local/apache \
--with-included-apr \
--with-pcre=/usr/local/pcre
# 컴파일
sudo make install
- apr-util, apr, httpd 소스 파일을 다운 받고, 설치해주자
- apr : apache가 os 상관없이 동작하기 위한 라이브러리
sudo vi /usr/local/apache/conf/httpd.conf
ServerName localhost:80
- httpd.conf 파일에 들어가서 서버 이름을 localhost로 지정하자
sudo vi /usr/lib/systemd/system/apache.service
# 아래 내용 붙여넣기
[Unit]
Description=apache
After=network.target syslog.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/apache/bin/apachectl start
ExecStop=/usr/local/apache/bin/apachectl stop
Umask=007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
- systemd 디렉토리에 apache.service 파일을 추가하자
sudo systemctl daemon-reload
sudo systemctl enable apache
sudo systemctl start apache
- systemctl daemon을 재시작하고, apache를 시작
- 타겟 그룹에서 헬스체크가 되는지 확인하자
- 재접속 시 다른 WEB 인스턴스로 트래픽을 전달시켜준다
- Bastion Host에서 SSH 접속이 가능하게 규칙을 추가하자
- 아직 NLB를 생성 안했으므로 8080포트에 대해 임시로 인바운드 규칙을 추가하자
- Bastion Host의 아웃바운드 규칙에 SSH 접속 허용을 추가해주자
- 기존에 생성한 키 페어와 보안그룹을 이용해 WAS 인스턴스 2개를 생성하자
참조 : https://velog.io/@bonjaski0989/AWS-EC2-Linux-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%86%B0%EC%BA%A3-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
참조 : https://velog.io/@bonjaski0989/EC2-Tomcat-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%93%B1%EB%A1%9D
- JSP : 자바 언어를 이용한 웹 프로그래밍용 언어
- JDK : 자바 기반 프로그램을 작성하기 위한 개발 키트
sudo su - # root 계정으로 전환
sudo yum install java-1.8* # 자바 설치
- 먼저 Java를 설치하자
[ec2-user@ip-10-0-118-87 ~]$ java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment Corretto-8.362.08.1 (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM Corretto-8.362.08.1 (build 25.362-b08, mixed mode)
[ec2-user@ip-10-0-118-87 ~]$ javac -version
javac 1.8.0_362
- 설치 버전을 확인해보면, 잘 설치된 것을 확인할 수 있다
# 소스 파일 다운로드
sudo wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz
# 다운로드된 파일 압축해제
sudo tar xvfz apache-tomcat-8.5.87.tar.gz
# tomcat 폴더 생성 & 이동
sudo mv apache-tomcat-8.5.87 /usr/local/tomcat8.5
- 소스 파일을 다운 받아 압축 해제한 후, 폴더를 생성하여 압축 해제한 파일들을 이동시키자
- Java 라이브러리와 Javac 명령어를 어디서든 사용할 수 있도록 설정해야 한다
[ec2-user@ip-10-0-118-87 ~]$ cd /usr/lib/jvm/
[ec2-user@ip-10-0-118-87 jvm]$ ls
java jre
java-1.8.0 jre-1.8.0
java-1.8.0-amazon-corretto jre-1.8.0-openjdk
java-1.8.0-amazon-corretto.x86_64 jre-openjdk
java-1.8.0-openjdk
- 먼저 Java가 설치된 경로부터 확인하자
- 우리는 여기서 java-1.8.0-amazon-corretto.x86_64를 기억해두면 된다. 환경 변수에서 경로를 지정해야 되기 때문이다
# sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64
export CATALINA_HOME=/usr/local/tomcat8.5
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
- 환경 변수를 설정하는 profile 파일에 들어가서 환경 변수를 추가하자. 마지막 줄에 추가하면 된다!
- Path는 어디서든 Javac 명령어를 사용할 수 있도록 설정하는 것이다
- Class는 Java 라이브러리를 사용할 수 있도록 살정하는 것이다
source /etc/profile
[ec2-user@ip-10-0-118-87 ~]$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64
[ec2-user@ip-10-0-118-87 ~]$ echo $CATALINA_HOME
/usr/local/tomcat8.5
- 환경 변수를 적용하고, 잘 적용됬는지 확인하자
# sudo vi /usr/local/tomcat8.5/conf/server.xml
# 이 부분을 수정하면 된다
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
# URIEncoding="UTF-8"을 추가해주자
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
- server.xml에 들어가서 URIEncoding을 추가하자
# 권한 부여
cd /usr/local/tomcat8.5/bin
chmod +x startup.sh
chmod +x shutdown.sh
# Tomcat 시작
/usr/local/tomcat8.5/bin/startup.sh
# 중지 명령은 아래와 같다
/usr/local/tomcat8.5/bin/shutdown.sh
- 실행 파일에 권한을 부여하고, Tomcat을 실행하자
# vi /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat 8.5
After=network.target syslog.target
[Service]
Type=forking
User=root
Group=root
# 실행 파일 경로
ExecStart=/usr/local/tomcat8.5/bin/startup.sh
# 중지 파일 경로
ExecStop=/usr/local/tomcat8.5/bin/shutdown.sh
# 디렉토리 권한 770 && 새로운 파일 권한 660
UMask=0007
[Install]
WantedBy=multi-user.target
- tomcat.service 파일을 생성하여 다음 내용을 추가해주자
systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat
- 리눅스는 파일 기반 시스템이다. 데몬은 부팅 시에 파일의 내용을 읽어서 설정에 반영한다. 따라서 파일에 변경한 내용을 데몬에 적용하려면 데몬을 재부팅해서 파일에 변경된 내용을 데몬이 읽어야 한다
- Systemd 데몬을 재부팅하여 tomcat.service 내용을 반영하고, tomcat을 실행하자
- 잘 실행된다!!!
- 8080 포트에 잘 접근된다!
sudo su -
cd /usr/local/tomcat8.5/webapps/ROOT
vi index.jsp
# 아래 내용으로 수정. 보여지는 내용을 WAS 서버 구분과 현재 날짜로 설정
<%@ page contentType="text/html; charset=UTF-8"%>
<html>
<head><title>This is WAS1</title></head>
<body>
WAS1 TEST
TIME IS <%= new java.util.Date()%>
</body>
</html>
- 보여지는 페이지를 수정하자. webapps/ROOT 디렉토리의 index.jsp를 위의 내용으로 수정하자
- webapps 디렉토리 : Tomcat이 제공하는 웹애플리케이션의 기본 위치
- webapps 디렉토리안에 디렉토리를 만들고, 그 안에 html이나 jsp 파일에 접속하려면 '주소:8080/디렉토리/index.html' 형식이다
systemctl restart tomcat
- Tomcat을 재시작하여 변경 내용을 적용시켜주자
[ec2-user@ip-10-0-118-77 tomcat8.5]$ curl http://localhost:8080
<html>
<head><title>This is WAS1</title></head>
<body>
WAS1 TEST
TIME IS Thu Mar 30 07:42:49 UTC 2023
</body>
</html>
- 잘 적용되었다
- NLB에 대한 대상 그룹을 생성하자
- 포트는 8080으로 지정한다
- 대상으로 지정할 WAS 인스턴스 2 개를 지정하자
- Network Load Balancer 선택
- 내부에서 동작하는 로드밸런서이므로 Internal 선택
- WEB SUBNET에 NLB 인스턴스가 위치하게 설정하자
- Listener를 설정하자
- NLB는 ALB와 다르게 보안그룹이 없다
- WAS 보안그룹 : NLB는 WEB1 / WEB2 SUBNET에 존재하므로, 해당 네트워크에서 8080 포트로 들어오는 트래픽을 허가하도록 규칙을 추가하자
- WEB 보안그룹 : 마찬가지로 NLB가 WEB1 / WEB2 SUBNET에 존재하며, Listener 포트를 8080으로 설정했으므로, 해당 네트워크의 8080 포트로 트래픽이 나가는 걸 허가하도록 규칙을 추가하자
- 헬스 체크가 잘 되는지 확인하자
- Apache에 기본적으로 설치되는 Mod_Proxy를 이용하여 Apache가 외부에서 들어오는 요청을 NLB에 전달하도록 설정하자
- 이는 Apache가 리버스 프록시처럼 동작하게 설정하는 것이다
- 리버스 프록시 : 클라이언트 요청을 대신 받아 내부 서버로 요청을 전달하고, 데이터를 가져오는 프록시. 로드 밸런싱, 보안, 암호화, 캐싱과 같은 장점을 가진다
sudo vi /usr/local/apache/conf/httpd.conf
- httpd 설정 파일에 접근해서 아래의 설정을 해주자
- ( 필수 아님 ) 위 3가지 주석을 해제하자. LoadModule은 해당 모듈을 불러와서 사용한다는 의미이다. 사실 해당 부분을 주석 해제 하지 않고, 밑에 VirtualHost만 설정해도 잘 실행된다
<VirtualHost *:80> # 80번 포트로 들어오는 모든 Ip에 대한 설정
ProxyRequests Off
ProxyPreserveHost On
<Proxy *> # 들어오는 모든 Ip 에 대한 규칙 지정
Order deny,allow
Allow from all
</Proxy>
# 밑에 설정한 주소로 보내준다
ProxyPass / http://'NLB DNS 주소':8080/ disablereuse=on
ProxyPassReverse / http://'NLB DNS 주소':8080/
</VirtualHost>
- 맨 마지막 줄에 위 내용을 추가하자. ProxyPass에는 NLB DNS 주소를 설정하면 된다
sudo systemctl restart apache
- 변경한 설정을 적용하자
- 번갈아가며 WAS 서버에 설정한 페이지가 잘 출력된다