AWS를 이용한 게시판 서비스 배포 #2

임상규·2023년 10월 13일
1

AWS

목록 보기
24/33
post-thumbnail

이전 포스트)
AWS를 이용한 게시판 서비스 배포 #1

소스코드 수동 배포

사용하는 게시판 서비스는 깃허브에서 확인할 수 있다.

Putty / OpenVpn을 이용하여 app-ec2에 접근하였다.

스왑파일을 사용할 메모리 할당 방법

프리티어 EC2 사용 시 스프링 빌드를 할 때 멈춤현상이 발생하였다.
이유는 프리티어 EC2는 RAM이 1GB라서 멈춤 현상이 발생한다고 한다.
따라서 스왑파일을 생성하여 RAM의 크기를 늘려주었다.

  1. 스왑파일 생성
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16

➡️ dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성한다.
   bs는 블록의 크기이고 count는 블록의 숫자이다.
   스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값이다.

  1. 스왑 파일의 읽기 및 쓰기 권한을 업데이트
$ sudo chmod 600 /swapfile
  1. Linux 스왑 영역을 설정
$ sudo mkswap /swapfile
  1. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용 가능하게 설정
$ $ sudo swapon /swapfile
  1. 프로시저가 성공적인지 확인
$ sudo swapon -s
  1. /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 시작
$ sudo vi /etc/fstab

해당 파일로 들어가서

/swapfile swap swap defaults 0 0

파일 끝에 아래 문구 추가하고 저장

참고문서) AWS 공식문서

필요한 패키지 다운로드

웹 서버를 구동하기 위해서는
1. Java
2. MySQL
3. Git
4. Nginx
이 필요하다.

(Amazon Linux 2023 기준)
Java, Git, Nginx는 설치하는데 큰 어려움이 없다.
하지만 MySQL은 Yum에 등록되어있지 않아 바로 Yum 명령어를 사용하여 설치가 불가능하였다.

먼저 rpm 파일을 등록하고

$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

local directory에 있는 rpm pacakage 파일을 설치한다.

$ sudo yum localinstall mysql57-community-release-el7-8.noarch.rpm

Yum 명령어를 통해 MySQL을 설치한다.

$ sudo yum install mysql-community-server
$ sudo yum install mysql

설치가 완료되면 설치 및 버전을 확인한다.

$ mysql --version

Git Clone

패키지 설치가 완료되었으면 프로젝트를 저장할 디렉토리를 생성하고 이동한다.

mkdir ~/apps && mkdir ~/apps/step1
cd ~/apps/step1

깃 레포지토리에서 소스파일을 받아온다

git clone https://github.com/sk-lim19f/project-board.git

프로젝트 테스트 및 빌드

프로젝트 폴더로 이동한 후 코드들이 잘 수행되는지 확인한다.

./gradlew test
./gradlew build

아마 테스트 및 빌드가 실패할 것이다.

build 실패 (1) - DB 연결

JDBCConnectionException 에러은 DB 연결이 안됐을 경우 발생한다.

기존에 application.yaml에서 작성한 datasource에는 DB커넥션이 안되어있을것이다.

현재 EC2의 local에서는 MySQL 접근이 안되고 있어서 에러가 발생한다.
그래서 경로를 RDS 엔드포인트로 바꾸어주어야 한다.

RDS 엔드포인트는 생성한 RDS에 들어가서 확인할 수 있다.

해당 엔드포인트로 datasource를 수정한다.

IDE에서 수정해서 깃헙에 push 후, EC2에서 pull 한다.

git ignore

application.yaml 파일에는 반드시 ignore되어야 한다.
해당 파일에는 DB 인스턴스의 경로 및 마스터 사용자의 암호가 포함되어 있으므로
반드시 git ignore 되어야 한다.

.gitignore

src/main/resources/application.yaml

application.yaml을 ignore 했기 때문에 깃허브에 다시 push 해주어야 하지만 push를
할 수 없어졌다.
따라서 EC2 인스턴스에서 직접 수정을 실시하였다.

build 실패 (2) - database 생성

다음으로 발생할 수 있는 에러는 SQLSyntaxErrorException가 있다.

해당 에러는 문법에러를 뜻하는데 발생하는 이유는 application.yaml 파일의
datasource.url에서 board database에 접근하도록 설정해두었기 때문이다.

하지만 RDS에는 현재 board database가 없으므로 문법에러가 발생하는 것이다.

spring:
	datasource:
		url: jdbc:mysql://{RDS 인스턴스 엔드포인트}:3306/board

RDS에 접근하여 board database를 설치하면 해당 에러는 해결된다.

서버 실행

이제 프로젝트가 정상적으로 빌드되었으니 Nginx와 서버를 올리면된다.

Nginx 사용 이유

Nginx를 사용한 이유는 80번 포트를 열기 위해서 사용했다.
Nginx가 80번 포트에 수신대기하고 있다가 Client가 80번 포트로 접속하면
8080에서 대기하고 있는 Tomcat이 응답한다.

먼저 Nginx를 올리기 전에 설정파일을 수정해야한다.

server {
    listen 80;

    server_name localhost;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-proto $scheme;

        if ($http_x_forwarded_proto != 'https'){
                return 301 https://$host$request_uri;
        }

    }

    error_page   500 502 503 504   /50x.html;

    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

➡️ 먼저 server블록은 80번 포트에서 들어오는 연결을 수신한다.
   server_name localhost는 로컬에서 동작하는 웹 서버에 대해 요청을 처리한다.
   location / 블록은 웹 서버 루트 경로를 설정하며
   현재 서버(80번 포트)로 들어오는 모든 요청을 8080포트로 전달하도록 구성하며
   전달된 요청에 대한 헤더를 설정하는 지시로 실제 IP 주소를 포함하도록 설정한다.
   다음 구문은 전달된 요청에 대해 어디서 왔는지에 대해 정보를 포함하도록 하고
   HTTP 또는 HTTPS로 들어오는지 나타내도록 한다.
   if 구문은 만약 들어온 헤더가 HTTP일 경우 HTTPS로 리다이렉션하도록 한다.
   error_page 500번대는 /50x.html을 띄우도록 하고 해당 폴더 위치에 대해 정의하였다.

파일에 위치는 아래와 같다.

/etc/nginx/conf/*.conf

초기 파일은 없으므로 touch 명령어나 바로 vi 명령어를 통해 생성해주어도 되고
해당 파일을 미리 만들어두고 git에 push한 후 cp 명령어를 통해 옮겨주어도 된다.

Nginx 설정을 완료하였으면 서버를 구동할 준비가 되었다.

cd build/libs/
sudo java -jar project-board-v1.1.jar

이 때, 무중단 배포를 희망하면 아래 명령어를 입력하면 된다.

sudo nohup java -jar project-board-v1.1.jar &

localhost:8080에 정상적으로 서버가 올라온 모습이다.

80번 포트에도 서버가 정상적으로 올라오는지 확인해보았다.
현재 80번 포트는 openvpn을 통해서만 접근이 가능하니 curl 명령어를 통해 확인하였다.

80번 포트도 정상적으로 서버가 올라왔다.

서버를 실행하고 포트가 올라왔는지 확인하는 명령어

netstat -ntlp

ALB 엔드포인트를 통한 접근도 가능한지 확인해보았다.

엔드포인트로도 접근이 가능하다.
하지만 https로는 접근이 불가능 한 상태인데 그 이유는 도메인을 할당하지 않아서 그렇다.

다음 포스팅에서는 도메인을 할당하는 방법과 프로젝트를 진행하는 과정에서 겪은 에러와 해결방법에 대해서 작성해보겠다.😃

profile
Cloud Engineer / DevOps Engineer

0개의 댓글