본문 바로가기
Spring

스프링부트 EC2 배포 종결 + EC2 스왑적용으로 안전하게 build

by 지식을 쌓는 개구리 2024. 8. 7.

여는 글

멋쟁이사자처럼 해커톤을 준비하면서 스프링부트 프로젝트를 ec2-리눅스, 우분투 환경에서 여러번 & 다양한 방식으로 배포하다가

가장 효율적이고, 안정적이며 쉽게 배포할 수 있는 방법을 찾게되어 이를 기록해두고 과정을 정리해보기위해 글을 쓰게 되었다.

스프링부트 프로젝트는 배포과정은 간단하나 자체로 무겁기에 프리티어기준 ec2를 사용한다면 build중 서버가 멈추게 된다.

이를 해결하기위해 ec2 스왑을 진행해주어 안전하게, 좀 더 빠르게 build 및 배포를 할 수 있게 진행할 예정이다.

포스트 글을 차분히 따라간다면 스프링부트 프로젝트를 쉽게 배포할 수 있을 것이라 생각한다.

아래 과정을 따라 진행해보자.

 

1. EC2 대여 및 인바운드 규칙 편집

1. EC2 대여

=> 서비스 클릭 > EC2를 클릭하자

 

=> 지역이 "서울"로 되어있는지 꼭 확인한다.

=> 좌측 메뉴바의 "인스턴스"를 클릭한다.

 

=> 인스턴스 시작을 클릭한다.

=> 이름을 설정하고 애플리케이션 및 OS 이미지에서 Ubuntu 클릭 + 사진에 보이는 Image 타입을 선택한다.(두번째)

=> 인스턴스 유형은 t2.micro로 선택한다.

 

=> 다음으로 "새 키 페어 생성"을 클릭한다.

 


=> 키 페어 이름을 적어주고, 주의할 점은 프라이빗 키 파일의 형식이 pem, ppk로 나눠져있는데 맥을 쓴다면 pem으로, 윈도우를 쓴다면 ppk로 선택해야한다.

=> 필자는 맥이라 pem으로 선택함 -> 이후 키 페어 생성을 클릭하자

=> 클릭하면 키가 다운로드 된다. 이 키는 서버를 접속하는 열쇠로써 사용된다.

 

=> 네트워크는 그대로 두자


=> 스토리지도 그대로 둬도 되지만, 30기가로 수정하는게 좋다. -> 프리티어는 30기가 까지 괜찮아서 30으로 설정해도 ok

 

=> 모든 설정이 끝났으니 인스턴스 시작을 클릭한다.

 

 

2. 인바운드 규칙 편집

=> 생성한 ec2는 EC2 대시보드에서 인스턴스를 클릭하면 볼 수 있다.

=> 아래의 보안 그룹 클릭 > 인바운드 규칙> 인바운드 규칙 편집 클릭

 

=> 위와 같이 인바운드 규칙을 추가해주자 -> "규칙추가"버튼을 클릭해서 추가 진행을 하면 된다.

-> 스프링부트 기본 포트 8080과 http요청을 열어두고 규칙저장 클릭

 

 

 

2. 배포전 ec2 스왑파일 생성

=> 스왑파일을 왜 설정하는지 먼저 이유를 설명하자면 다음과 같다.

이전 부터 배포를 계속진행해왔으나, build부분에서 늘 서버가 다운되는 현상이 발생했는데 이는 ec2 프리티어 스펙의 한계로 자연스러운

발생이였다.

ec2 프리티어의 경우 램이 1기가밖에 되지 않기에 스프링부트와 같은 자바 기반 서비스를 빌드하고 운영하기에 버거운 스펙이기 때문이다.

따라서 우리는 "스왑"을 통해 부족한 RAM을 1기가에서 +2기가로 총 3기가로 확장할 것이다.

스왑은 RAM이 부족할 때 사용하는 디스크 공간이다. 하지만 물리적인 RAM을 추가하는 것은 아니기에 실제 RAM만큼 빠르지는 않으나,

메모리가 부족할 때 시스템의 안정성을 유지하는 데는 매우 유용하기에 스왑을 적용하면 스프링부트에 한해서는 빌드할 때 서버가 다운되는 현상은 발생하지 않을 것이다.

=> 아래의 과정으로 스왑을 진행해보자.

 

=> 인스턴스를 클릭하고 "연결"버튼을 누르자

 


=> 연결 버튼 클릭 

=> 그럼 다음과 같은 화면이 출력된다.

 

 

1. swapfile 생성 후 권한 부여를 진행해야한다.

sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chmod 600 /swapfile

 

2. swap의 영역을 설정한다.

sudo mkswap /swapfile

 

3. swap 영역에 swapfile 추가 사용설정 진행

sudo swapon /swapfile

 

4. 잘 설정되었는지 확인

sudo swapon -s

=> 잘 설정된 것을 볼 수 있다.

 

5. 서버를 시작할 때 스왑파일을 함께 시작할 수 있도록 설정

sudo vi /etc/fstab

=> 다음으로 파일을 열고 i 키를 입력해서 인서트모드로 들어간다.

=> 화살표 키로 두번째 끝라인으로 이동해서 엔터하고, 사진과 같이 아래에 명령어를 입력하자

=> 다 작성하였으면 esc키를 누르고 :wq 를 엔터하면 된다.

/swapfile swap swap defaults 0 0

 

 

6. 공간이 잘 추가되었는지 확인

sudo free

=> 다음과 같이 스왑공간 확보로 램 2기가가(실제 램은 아니고 디스크의 일부를 램처럼 활용) 추가로 사용될 수 있는 것을 확인할 수 있다.

 

3. 깃허브 레포 다운 & java설치 & 프로젝트 빌드

1. SSH Key 발급하기

(본인이 배포하려는 레포지토리가 public이라면 2번으로 패스해도 된다. private일 경우에만 진행)

ssh-keygen

=> 위 명령어로 key발급을 진행한다. (엔터엔터엔터 진행하면됨)

cd .ssh/
cat id_rsa.pub

=> key값을 읽고 복사하자

 

(2024.10.04 오류 업데이트)

과거 우분투와 달리 변동사항이 있다.

=> 다음과 같이 cat id_rsa.pub라고 쳐도 파일이 없어서 인식하지 못하는 경우가 있음

=> ll을 입력하여 파일 구조 파악후 위와 같이 보이는 .pub 파일을 cat해야함 -> cat id_ed25519.pub -> 자기에게 맞는 파일명으로 하기

 

 

key값이

<ssh-rsa AAAAB3NzaC1yc2EAAAAgsldkjflaksdjflkasjldkfjlaksjdlkfjalskjdlkfjlaskjdlkfjalksjdlfkjaslkdfjlkajsldkfasbdfbawkejfbkwhbefkbawkefI0ZHTHtYyD6UDyPoyRvBm9IZ+Q6FSa+tGGnwKGtK2EBZVntYXNuv+N68cZr1Rbsq3YSZwKz8kCMF/zlB7ITrPQBO/pIB8XQ8b58= ubuntu@ip-1711-31-0-16>

=> 이렇게 출력될 텐데 이걸 그대로 복사하면 된다.

 

=> 배포할 프로젝트 레포지토리 > settings > Deploykeys로 들어가서ADD deployee key를 클릭한다.

=> 아까 복사한 문자열을 넣고 add key 버튼을 클릭한다.

"그럼 키가 등록이되고 우분투에서 코드를 내려받을 때 private일때 아무나 받지 못하지만 허용을 해준다."

 

2. git으로 레포 내려받기

=> Code > SSH로 접근해주고 이 주소를 복사해서 -> (아까 2번으로 건너뛰었다면 그냥 HTTPS를 클릭해 주소를 복사하면 된다.

=> cd .. 으로 원래 경로로 돌아와서

git clone {주소} 를 입력해 진행한다.

=> 코드 다운이 잘 완료되었음

 

3. application.properties 파일 추가 (혹은 application.yml)

이것 역시 .gitignore로 프로퍼티 or yml파일을 제거하지 않고 그대로 올렸다면 패스해도 좋다.=> .gitignore처리했다면 파일이 존재하지 않기 때문에 위 파일을 생성해주어야 한다.

=> 경로가 보통 이렇게 되어있으니

ubuntu@ip-172-31-11-29:~/Back-End/ATC/src/main/resources$

=> 위와 같은 경로로 -> 프로젝트로 들어오고 resources경로로 들어온다. (cd 폴더명 입력하면 들어가짐 & 폴더구조 확인은 ll 입력하면 된다.)

혹시 resources 폴더까지 gitignore처리했다면? src/main 위치에서 "mkdir resources" 명령어를 입력해 resources폴더를 생성해주자

 

그럼 이어서

ubuntu@ip-172-31-11-29:~/Back-End/ATC/src/main/resources$ 이 경로에서

vi application.properties

=> 위 명령어를 입력해 프로퍼티 혹인 yml파일을 생성해주고

본인의 application.properties or application.yml 파일을 복사하고 여기에 붙여넣기 해준다.=> esc 키를 누르고 :wq 를 입력하고 엔터하여 파일을 저장하고 나오자

 

4. java 및 관련 업데이트 진행

  1. sudo apt-get update => 이 OS에서 다운받아야하는 것들이 있는지 기본 체크하는 과정이다.
  2. sudo apt-get upgrade => 업그레이드 하는 과정 ⇒ 보라색 화면이 뜨면 엔터 누르면 됨
  3. sudo locale-gen ko_KR.UTF-8 => 지역설정
  4. sudo apt install openjdk-17-jdk ⇒ 본인 버전에 맞게 jdk설치

=> 진행중 아래와 같은 화면이 여러번 뜰 수 있는데

=> 오류가 아니고, 이 화면은 시스템 업데이트나 패키지 설치 후에 일부 데몬(서비스)이 오래된 라이브러리를 사용하고 있기 때문에 다시 시작해야 함을 알리는 메시지이다. -> 새로운 업데이트를 적용하기 위해 필요한 절차라고 보면 된다.

=> 필요한 서비스를 화살표로 선택하고 엔터하면 된다. -> 모두 첫번째로 그대로 두고 엔터하자.

 

 

5. jar build

위 필요 항목들을 모두 설치하였다면 이제 다시 프로젝트 루트 경로로 들어가고..

chmod +x ./gradlew
./gradlew build

=> 위 명령어를 입력해 빌드를 진행해주자

=> 위 사진과 같이 프로젝트 위치(필자의 경우 ATC가 프로젝트 루트 경로)에서 진행해주어야 한다.

 

cd build
cd libs

=> 빌드가 진행되었으니 위 경로로 들어가서 ll 명령어를 통해 폴더 구조를 확인하면,,

=> 이렇게 jar이 생성된 것을 확인할 수 있다.

 

6. 빌드파일 실행

nohup java -jar ATC-0.0.1-SNAPSHOT.jar &

=> 다음과 jar파일 이름을 입력하고 뒤에 &를 붙여 백그라운드에서 돌아갈 수 있게 진행하자

이어서

ls

-> 이 명령어를 입력하고 

cat nohup.out

=> 같은 libs경로에서 위 명령어를 입력하면 돌아가고 있는 스프링부트 프로젝트의 로그를 볼 수 있다.

 

"해당과정으로 배포가 끝났다."

=> ec2 콘솔을 꺼도 잘 돌아감

 

http://본인ec2 ip:8080 -> 여기로 접속하면된다. (따로 설정해둔게 없다면 아래 사진처럼 뜨는게 정상)

=> 위와 같은 화면이 뜨면 성공

 

=> 다음과 같이 api호출을 하면 정상작동되는 것을 확인할 수 있다.

 

4. 프로젝트 종료하는 방법 및 코드 변경되었을 때 다시 build및 실행하는 방법

1. 프로젝트 종료를 하고 싶다면..

jobs

=> ~libs/ 경로에서 위 명령어를 입력해 백그라운드에서 돌아가고 있는 스프링부트 프로젝트를 확인

fg %인덱스번호

=> ex. 1번으로 뜨면 fg %1 입력을 해서 가져오고 -> 컨트롤 + c 키를 눌러 꺼버리면 끝

=> 다시 실행을 원한다면 위 3-6번의 과정을 다시 실행하면 된다.

 

2. 코드가 변경되었을 때 다시 build 및 실행하는 방법

마찬가지로 프로젝트를 수정하고 또 추가로 개발해야할 수 있다. 따라서 코드가 변경되었다면 변경사항을 git push하고

git pull

=> 프로젝트 경로 위치에서 pull한다.

./gradlew build

=> 그리고 빌드를 다시 진행한뒤 위 게시글 3-5의 과정을 이어서 진행해주면 된다.

 

참고문서 & 공식문서

https://repost.aws/ko/knowledge-center/ec2-memory-swap-file

 

스왑 파일을 사용하여 Amazon EC2 인스턴스에서 메모리를 스왑 스페이스로 할당합니다.

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 스왑 파일로 사용할 메모리를 할당하고 싶습니다. 어떻게 해야 하나요?

repost.aws

https://velog.io/@jonghyun3668/SpringBoot-프로젝트-EC2-배포하기

 

SpringBoot 프로젝트 EC2 배포하기

깃헙에 있는 프로젝트를 AWS EC2에 git clone을 통해 내려받아 jar 파일 빌드를 해보겠습니다.(EC2 인스턴스는 우분투로 진행합니다. 또한 따로 배포 시스템을 구축하지 않고 수동으로 배포하는것만

velog.io

https://velog.io/@dooboocookie/CICD-SpringBoot-프로젝트-.jar-파일-빌드-및-배포-자동화

 

[CI/CD] SpringBoot 프로젝트 .jar 파일 빌드 및 배포 자동화

지난번 EC2 배포(링크) 이후, 배포 후 변경 점을 서버에 적용하기 위해서 이미 .jar파일 실행을 종료하고 파일 변경 후 다시 실행시켜야한다는 번거로움이 있었다.그래서, CI/CD를 적용하기로 했다.

velog.io

 

 

5. 혹시 도메인 적용과 https적용이 필요하다면?

https://choiet.tistory.com/68

 

스프링부트 EC2 - 도메인 적용 & https 적용 -> 무료 인증서 & 인증서 발급 자동화까지

여는 글이전 스프링부트 프로젝트 안전하게 배포하는 블로그 포스팅에 이어 마지막으로 스프링부트 프로젝트에 우리가 구매한 도메인을 어떻게 적용하는지, https적용을 어떻게 진행하는지 기

choiet.tistory.com

=> 도메인 적용 방법과 https적용 방법도 블로그 게시글로 모두 정리해두었다.

도메인의 경우 AWS-Route53으로 구매하고 적용하는 방법 & 가비아로 저렴하게 구매후 적용하는 방법을 기술해두었으니 선택하여 진행하면 되고, https적용의 경우는 렛츠인크립트를 활용하여 무료로 & 자동갱신으로 진행한다.

=> 위 게시글을 참고하자!