DevOps/AWS

[AWS] AWS Lightsail를 이용해서 Spring 프로젝트 배포

SeungbeomKim 2023. 5. 12. 15:39
반응형

오늘은 프로젝트 배포에 대해서 알아보려고 합니다. 

EC2 프리티어 무료사용(750시간)을 예전에 사용했기에, LightSail 인스턴스에서 프로젝트를 배포해보려고 합니다.

 

Amazon Lightsail이란 무엇인가?

Amazon Lightsail은 가상 프라이빗 서버(VPS) 공급자로, 클라우드에서의 애플리케이션 구축 및 호스팅 솔루션이 필요한 개발자, 소규모 비즈니스, 학생 및 다른 사용자가 가장 손쉽게 AWS를 시작할 수 있는 방법입니다. Lightsail은 개발자에게 클라우드에서 웹사이트와 웹 애플리케이션을 배포하고 관리할 수 있는 컴퓨팅, 스토리지 및 네트워킹 용량 및 기능을 제공합니다. Lightsail에는 프로젝트를 빠르게 시작하는 데 필요한 모든 것(가상 머신, 컨테이너, 데이터베이스, CDN, 로드 밸런서, DNS 관리 등)이 포함되어 있으며, 이러한 서비스를 저렴하고 예측 가능한 월간 요금으로 사용할 수 있습니다.

 

가상 프라이빗 서버란?

'인스턴스'라고 하는 가상 프라이빗 서버는 VPS 호스팅을 통해 고도의 보안과 가용성이 보장되는 환경에서 웹 사이트와 웹 애플리케이션을 경제적으로 실행할 수 있는 서버입니다.

 

Lightsail 인스턴스 생성

다음과 같이, AWS에 로그인하여 무료 인스턴스를 하나 생성해 줍니다(3개월 무료)

ssh를 사용하여 연결을 클릭하여 발급받은 ip로 접속해 줍니다. 해당 서버에서 배포에 필요한 요소들을 직접 다운받아야 합니다.

 

방화벽 설정

또한 외부 포트도 허용해줘야 하기에, 3306, 8080 포트를 개방해 줍니다. (Add rule : MYSQL/Aurora, 8080 포트를 개방해 줍니다)

22번 포트, 80번 포트는 각각 HTTP 통신, SSH 접속을 default 포트 번호입니다. (인스턴스 생성 시 자동으로 설정)

 

Mysql, Git, Java17를 서버로 설치해 줍니다. 

# apt-get 업데이트
sudo apt-get update

# Git 
sudo apt-get install get
sudo apt install git

# Java 17(본인 프로젝트에 맞는 버전 설치)
sudo apt-get install openjdk-17-jdk

# Mysql 
sudo apt-get install mysql-server

Mysql 외부 접속 허용 (bind-address = 127.0.0.1 주석 처리)

bind-address는 127.0.0.1에서만 접속을 허용한다는 의미입니다.

 

Mysql config파일이 있는 경로로 이동해줍니다

# ubuntu
sudo vi /etc/mysql/my.cnf

외부 접속을 허용하기 위해 bind-address 주석 처리

Mysql DB 관련 오류 해결

1. access denied for user 'root'@'localhost' 

해결 방법 1. mysql_native_password로 접근할 수 있도록 처리(다른 호스트에서 Mysql 서버에 접속하여 작업하는 것이 가능해짐)

plugin을 auth_socket에서  mysql_native_password로 바꿔주고, select문을 통해 plugin이 바뀌었는지 확인해 줍니다.

2. root 권한 부여 

# root 계정 접속
sudo mysql -u root -p 
# 권한 부여
grant all privileges on *.* to 'root'@'localhost'
# 변경사항 반영
flush privileges

2. access denied for user 'root'@'localhost' (using password: yes)

이 에러는 확실하게 서버에서 root의 비밀번호가 해당 프로젝트 yml에 설정해 줬던 비밀번호랑 달라서 뜨는 에러입니다. 

해결 방법 : application.yml 파일의 password가 대여한 lightsail 서버에서 root의 password와 맞춰주어야 정상적으로 동작합니다.

3. unknown database "DB이름"

lightsail 서버에 DB가 존재하지 않아서 발생하는 에러입니다.

해결방법 : create Database "DB명"

이제 설정은 완벽히 끝났으니, 배포 순서에 대해서 설명드리겠습니다. 

 

  1. git clone "프로젝트 레포지토리 url 주소" 
  2. 해당 디렉터리로 이동(cd 디렉토리명)
  3. ./gradlew build (빌드를 다시 할 경우 ./gradlew clean build(빌드된 파일을 지우고 다시 빌드))
  4. build후 생기는 jar파일 실행 (libs 디렉토리에 존재하기에 libs로 이동해서, java -jar [jar파일명].jar으로 배포)

입니다. 

 

하지만, 이러한 배포는 리눅스를 종료하면, 스프링부트도 자동적으로 종료되기에 서버가 종료됩니다. 그래서 리눅스 연결이 끊겨도 서버가 유지되는 백그라운드 배포를 하려고 합니다. 

 

백그라운드 배포과정 

nohup java -jar [jar파일명].jar & (nohup : 리눅스 연결이 끊겨도 실행을 해주겠다는 의미, & : 백그라운드 실행)

nohup : ignoring input and appending output to 'nohup.out' 로그가 출력되면 성공

이를 통해 터미널을 종료해도 해당 서버에 접속하면, 서버가 끊기지 않음을 알 수 있습니다. 

 

기존 배포 주소 http:[lightsail Public IP주소]:8080/ 인데, 8080을 지워도 접속이 가능하게 하려면 포트포워딩을 해줘야 합니다.

포트 포워딩은 외부 IP랑 내부 IP를 연결해 주는 기술입니다. 

즉, HTTP 기본 포트 넘버인 80번 포트로 서버에 요청해도, 8080번 포트로 포워딩되도록 설정해 줄 수 있는 기능입니다.

 

설정

# 관리자 권한으로 이동
sudo su
# 포트 리다이렉트 설정
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

이를 통해 80번 포트로 접속하면 8080으로 리다이렉트 되도록 설정되었습니다.

 

그러면 해당 서버를 종료할 때는 어떻게 해야 할까요?

 

ps -ef (현재 실행되고 있는 프로세스 조회) 
ps -ef | grep (찾을 단어)
sudo kill -9 (PID number) (해당 프로세스 강제 종료)

 다음과 같은 명령어를 통해 해당 프로세스를 찾아 kill 명령어를 통해 프로세스를 강제 종료하면 서버를 종료시킬 수 있습니다.

 

이상으로 포스팅 마치겠습니다.

 

 

 

반응형