0부터 시작하는 AWS 공부 - 3 Tier 구축 2편 - WEB & WAS & LB

Jaehong Lee·2023년 4월 4일
4
post-thumbnail

1. WEB & ALB

WEB 생성 및 접속

사진대로 사양을 설정하고, 네트워크는 WEB SUBNET으로 지정하자

  • 보안그룹은 일단 Bastion에서 SSH 접속이 가능하게만 해두자. 추가 인바운드와 아웃바운드는 밑에서 한 번에 설정할 것이다

Openssh는 접속 시, ppk가 아닌 pem 파일을 사용한다. 따라서 변환해주어야 한다

  • PuttyGen을 이용해 ppk 파일을 pem 파일로 변환하자
vi sshkey.pem
chmod 400 sshkey.pem
ssh -i sshkey.pem ec2-user@'접속할 주소'
  • Bastion Host에 pem Key를 옮기고, 권한 설정을 해준 뒤, ssh 접속을 하면 된다

  • 잘 접속 된다!!!

web2 서브넷에 인스턴스를 동일하게 생성하자


ALB 인바운드 트래픽 흐름

  • AWS ALB ( Internet Facing ) 의 인바운드 트래픽 흐름은 아래와 같다
    1. 외부에서 ALB의 EIP 주소를 향해 트래픽을 보낸다. 해당 트래픽은 인터넷 게이트웨이를 통해 ALB로 들어온다
    2. 해당 트래픽을 ALB의 AWS Internal Routing Node에게 보낸다. ELB 생성 시 지정한 서브넷에 ALB의 Internal Rounting Node가 생긴다
    3. Internal Routing node에서 ALB의 Routing Table을 통해 트래픽에 대한 적절한 라우팅 규칙을 찾는다. 라우팅 규칙을 통해 트래픽을 보낼 대상 그룹 및 인스턴스를 찾는다
    4. ALB에서 트래픽을 동일한 가용영역에 있는 인스턴스에게 보낸다

ALB 생성 및 설정

  • LB를 생성하자

  • ALB를 선택하자

  • Scheme는 외부에서 트래픽을 받아야하므로 Internet-facing으로 설정하자

  • vpc를 지정하고, 연결할 서브넷을 지정하자

  • 서브넷을 지정하면, 해당 서브넷에 로드 밸런서 노드가 생긴다. 즉, 해당 노드를 통해 트래픽이 들어오는데, 외부 ALB의 경우 인터넷에서 트래픽을 받아야 하므로, 인터넷 게이트웨이로 라우팅이 설정된 퍼블릭 서브넷을 선택해야 한다!!!

  • 2개의 WEB 서브넷을 지정하자

  • 보안그룹은 위와 같이 80번 포트를 설정하자
  • 외부에서 사용자들이 접속하므로, 모든 IP에 대해 HTTP 접속을 허용하고, 아웃바운드는 WEB 노드로 트래픽을 전달하기 위해, WEB 보안그룹을 지정해주자

WEB의 보안 그룹에 인바운드 규칙을 추가하자

  • WEB 보안 그룹에 들어가서 ALB가 80번 포트에 접속할 수 있게 인바운드 규칙을 추가하자. 대상을 ALB 보안그룹을 지정하면 된다

다시 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을 통해 접속할 수 있다!

APACHE 설치

Bastio Host를 거쳐서 WEB 서버에 SSH 접속하자

프로그램을 설치하는데는 yum을 이용한 바이너리 설치와 소스 파일을 이용한 소스 파일 설치 방식이 있다. 이번에는 소스 파일 설치를 진행해보자

YUM 으로 바이너리 설치하면 편리한데, 왜 소스 파일로 설치하는가?

sudo yum update -y
sudo yum install -y gcc gcc-c++ expat-devel.x86_64 pcre-devel
  • gcc와 관련 패키지를 설치하자
  • gcc란 gnu 컴파일러 모음이다
  • root 권한으로 실행해야 하므로, sudo로 명령 내려야 한다

httpd-2.4.x 버전 부터는 apr, apr-util, pcre를 별도로 설치해야 한다!!!

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 상관없이 동작하기 위한 라이브러리

자 이제 설치가 끝났다!


Apache 설정 & 서비스 등록

sudo vi /usr/local/apache/conf/httpd.conf
ServerName localhost:80
  • httpd.conf 파일에 들어가서 서버 이름을 localhost로 지정하자

소스 파일을 컴파일 하여 설치할 경우, 자동으로 Systemd에 등록되지 않으므로, 직접 Systemd에 서비스를 등록해야 한다. 이를 통해 서비스를 Systemctl 명령어를 통해 편리하게 관리할 수 있으며, 서버 부팅 시 자동으로 서비스가 실행되도록 할 수 있다

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를 시작

  • 타겟 그룹에서 헬스체크가 되는지 확인하자

index.html은 /usr/local/apache/htdocs 경로에 위치한다

  • 재접속 시 다른 WEB 인스턴스로 트래픽을 전달시켜준다

2. WAS & NLB

WAS 보안그룹

  • Bastion Host에서 SSH 접속이 가능하게 규칙을 추가하자
  • 아직 NLB를 생성 안했으므로 8080포트에 대해 임시로 인바운드 규칙을 추가하자

  • Bastion Host의 아웃바운드 규칙에 SSH 접속 허용을 추가해주자

  • 기존에 생성한 키 페어와 보안그룹을 이용해 WAS 인스턴스 2개를 생성하자

Tomcat 설치 및 설정

참조 : 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

Tomcat은 자바로 작성된 JSP를 실행할 수 있는 서버이다. 따라서 자바와 JDK가 필요하다

  • 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
  • 환경 변수를 적용하고, 잘 적용됬는지 확인하자

server.xml 수정

# 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을 추가하자

Tomcat 실행

# 권한 부여
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을 실행하자

Tomcat 서비스 등록

Tomcat 서비스를 Systemd에 등록하자

# 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 포트에 잘 접근된다!

Tomcat index.jsp

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>
  • 잘 적용되었다

WAS 2도 변경시켜주자


NLB 생성 및 설정

대상 그룹 생성

  • NLB에 대한 대상 그룹을 생성하자
  • 포트는 8080으로 지정한다

  • 대상으로 지정할 WAS 인스턴스 2 개를 지정하자

NLB 생성

  • Network Load Balancer 선택

  • 내부에서 동작하는 로드밸런서이므로 Internal 선택

  • WEB SUBNET에 NLB 인스턴스가 위치하게 설정하자

  • Listener를 설정하자

WEB & WAS 보안그룹 수정

NLB를 생성했으니, WEB & WAS 보안그룹을 수정하자

  • NLB는 ALB와 다르게 보안그룹이 없다

  • WAS 보안그룹 : NLB는 WEB1 / WEB2 SUBNET에 존재하므로, 해당 네트워크에서 8080 포트로 들어오는 트래픽을 허가하도록 규칙을 추가하자

  • WEB 보안그룹 : 마찬가지로 NLB가 WEB1 / WEB2 SUBNET에 존재하며, Listener 포트를 8080으로 설정했으므로, 해당 네트워크의 8080 포트로 트래픽이 나가는 걸 허가하도록 규칙을 추가하자

보안그룹 설정이 끝났으면, 헬스체크를 확인하자

  • 헬스 체크가 잘 되는지 확인하자

WEB - NLB - WAS 연결

WEB 서버에 접근하자. WEB에서 받는 트래픽을 NLB로 보내주게 설정하면 된다

  • 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 서버에 설정한 페이지가 잘 출력된다

DB 생성 및 연동은 다음 편에서 이어집니다

https://velog.io/@lijahong/0%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-AWS-%EA%B3%B5%EB%B6%80-3-Tier-%EA%B5%AC%EC%B6%95-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3-DB

profile
멋진 엔지니어가 될 때까지

0개의 댓글