공부함

aws ec2로 spring 프로젝트 배포하기 본문

infra

aws ec2로 spring 프로젝트 배포하기

찌땀 2024. 8. 18. 03:20

이번 사이드 프로젝트를 진행하면서 aws ec2로 스프링 프로젝트를 혼자 배포했는데 그 과정을 기록해 보고자 한다.

사실 배포한지 좀 되었고 변경사항이 생길 때마다 pull 받고 재배포만 하고 있어서 초기 세팅은 약간 기억이 왜곡되었을 수도 있다..

 

https://velog.io/@jonghyun3668/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

 

SpringBoot 프로젝트 EC2 배포하기

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

velog.io

 

인스턴스 생성 및 연결

aws에서 ec2 인스턴스를 시작해준다. 이 때 region은 서울로 해주자.

환경은 ubuntu, 아키텍처는 64bit, 인스턴스 유형은 t2 micro로 해주자. (프리티어는 이렇게 해야 과금이 되지 않음)

다음으로는 키 페어를 만들어준다. 키 페어는 원격 접속을 위해 필요하다. 파일을 다운받아 보관해야 한다. 

나는 사실 원격 접속할 일이 없었고, 팀원은 IAM 계정으로 접속하는 방식으로 진행해서 키 페어가 딱히 쓰였던 적은 없는 걸로 기억한다?

다음으로 보안 그룹을 생성해준다. 방화벽 관련된 내용이고, 기존 보안 그룹이 있으면 선택할 수 있다. 

SSH 트래픽 허용은 인스턴스 생성 후 로컬 PC로 접속하는걸 허용한다는 뜻이므로 체크해주자. 또 나는 노트북으로 다양한 네트워크에 접속해 인스턴스에 연결할 것이므로 모든 IP를 허용하는 0.0.0.0으로 해주자. 

나는 지금 시험삼아 만들어 보는 것이기 때문에 전에 만들어놓은 보안 그룹을 사용했다.

 

사용한 보안 그룹의 세팅은 이렇다. 

인바운드 규칙은 외부에서 ec2로 접근할 때의 방화벽이고, 아웃바운드 규칙은 ec2에서 외부로 접근할 때의 방화벽이다. 

인바운드 규칙을 보면 기본적으로 0.0.0.0으로 모든 ip에 대해 열어놓았다.

8080포트는 스프링, 3306은 mysql, 443은 https, 80은 http, 22는 ssh(위에서 설명한 원격 접속용) 포트다.

아웃바운드 세팅은 따로 건드린게 없다. 

스토리지 구성은 다음과 같다. 여기까지 하고 인스턴스를 시작해준다!

인스턴스를 연결하려고 보면 4가지 방법이 있고, 나는 위 화면의 ec2 인스턴스 연결 방식으로 바로 연결했기 때문에 key가 따로 필요없었다.

ssh 클라이언트 연결 방법을 보면 위 화면처럼 key가 필요한 것을 확인할 수 있다. 

인스턴스 세팅 

인스턴스를 세팅하려면 스프링 프로젝트를 배포하기 위해 환경설정을 해줘야 한다. 

먼저 스왑 메모리 설정을 하고, git, java, spring, mysql 등을 설치할 것이다.

스왑 메모리 

https://diary-developer.tistory.com/32

 

[AWS] EC2 스왑 메모리 설정하기 (EC2 메모리 늘리기) - Swap Memory

AWS의 EC2를 사용하고 있는데 프리티어를 사용하다 보면 램 메모리가 1GB 밖에 되지 않기 때문에 메모리가 부족한 현상을 겪을 수 있다. 이를 해결하기 위해 램이 높은 인스턴스 유형을 선택하면

diary-developer.tistory.com

 

스왑 메모리 설정을 해야 하는 이유는 무료로 사용하는 프리티어이기 때문에 램이 1GB여서 prog-rangers, rednose를 배포할 때 빌드가 특정 %에서 계속 멈추는 현상을 겪었다. 따라서 부족한 램을 디스크 용량으로 대체하기 위해 스왑 메모리 설정을 해주는 것이다. 

위 글에서 자세한 방법에 관해 설명해준다!

https://admm.tistory.com/102

 

[Linux] vi(vim)에디터 사용방법

리눅스를 이용한 개발 혹은 리눅스서버를 운영하는 개발자라면 반드시 알아야 하는 것중에 한가지가 바로 텍스트 에디터를 사용하는 방법입니다. 윈도우의 경우 메모장이나 혹은 Edit Plus와 같

admm.tistory.com

리눅스 환경에서 사용하는 텍스트 에디어 vim 에디터를 사용하게 되는데 위 글에 관련 단축키들이 정리되어 있으니 참고하자!

추가로 리눅스 환경에서 붙여넣기는 shift+insert, 복사는 ctrl+insert다. 

 

java 17 설치

이제 우분투 환경에 java, git 등 다양한 프로그램을 설치해야 한다. 이 때 사용되는 것이 apt로 apt는 Advanced Package Tool로 리눅스 기반 환경에서 소프트웨어 설치, 업그레이드, 다운그레이드 등 관리에 효과적이다. 

sudo apt-get update

위 명령어로 먼저 프로그램 목록?을 최신으로 만들어준다. 

 

https://languagestory.tistory.com/154

 

Ubuntu JDK(JAVA Development Kit) 17 설치

1. 시험환경 · Ubuntu 20.04 x64 · openjdk-amd64 v17 2. 목적 · Ubuntu 환경에서 JDK를 설치한다. · 설치한 JDK 환경을 설정한다. 3. 적용 ① sudo 권한으로 apt 업데이트하고 openjdk v17을 설치한다. - $ sudo apt update

languagestory.tistory.com

sudo apt install openjdk-17-jdk
java -version

 java 17 버전을 설치하고 맞게 설치했는지 버전을 확인해준다. 

sudo vi /etc/environment

환경변수 설정을 위해 vim 에디터를 사용한다. 위 명령어로  environment 파일을 열어서 

JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"

를 추가해준다. java 17 디폴트 설치 경로가 위와 같다. 

git 설치 및 설정 

sudo apt-get install git
git --version

이제 git을 설치해준다. 위 명령어로 간단하게 설치하고 제대로 설치했는지 버전을 확인해준다. 

또 이 서버에서 github 계정을 인증하려면 github에서 ssh key를 생성해서 그걸 이용해 인증할 수 있다!

이후 clone해서 배포하고자 하는 프로젝트를 받아오자. 

mysql 설치 및 설정

이제 내가 사용한 db인 mysql을 설치하고 계정 설정 등을 해주자. 

apt-get install mysql-server

이후 mysql -u root -p 명령어로 접속을 시도하면 접근이 거절당하며 에러가 발생한다. 

해결을 위해 sudo apt-get install mysql-server로 mysql에 일단 접속한 후, root 계정의 plugin 컬럼을 보면 auth_socket인 것을 확인할 수 있다. 이 컬럼 값을 바꿔줘야 한다. 

UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;

컬럼 값을 mysql_native_password로 바꿔준다. 그리고 다시 select 문을 통해 잘 바뀌었는지 확인해보자. 

이렇게 하고 다시 mysql에 접속해보면 정상적으로 접속할 수 있다 (root 계정의 초기 비밀번호는 그냥 빈칸이다)

이제 데이터베이스랑 테이블을 생성해주면 된다!

로컬 환경에서 사용하는 application.properties인데, 어차피 application.properties는 git에 올리지 않기 때문에 직접 vim으로 작성해줘야 한다.datasource.url 부분의 localhost를 배포 서버의 ip로 바꿔주고 기타 등등 바꿔서 작성해줄텐데, 아무튼 database는 rednose, 접속할 계정은 root에 pw 0000으로 설정해 놓았으니 이에 맞게 rednose database를 만들고 미리 준비해놓은 sql문으로 테이블들을 생성해주자. ddl-auto=none이므로 테이블을 직접 생성해줘야 한다. (주워들은? 바로는 실무에서는 거의 무조건 none을 사용한다고 한다)

 

사실 전에 배포할 때는 sudo mysql -u root -p 명령어로 접속한 다음 다른 계정을 생성해 그 계정으로 접속하도록 해서 root 계정의 컬럼을 바꾸는 과정이 필요하지 않았던 걸로 기억하는데(아마도), 이 방법도 알아두면 좋을 것 같다. 

 

application.properties 작성 

application.properties뿐만 아니라 git으로 track하지 않는 파일들은 clone 했을 때 없으니까 vim을 이용해 작성해 주면 된다. 나는 application.properties, application-private.properties를 각각 main 폴더와 test 폴더에 만들어 주었다. (로컬에서도 test랑 실제 실행할 때 db를 분리하기 위해 설정파일을 따로 관리했다)

 

이 과정은 vim을 사용해 그냥 배포 환경에 맞게 일부 값만 수정해서 복붙하면 되니까? 이정도로 넘어가겠다.

 

배포

이제 배포해주면 된다!

빌드파일 생성
./gradlew build
이미 빌드파일이 있다면 클린 빌드를 해주자
./gradlew clean build

 

빌드파일을 생성해준 다음 build -> libs 디렉토리로 이동한다. 

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

이런 식으로 실행해주면 된다. 뒤에 &를 붙여서 무중단 배포(내가 ec2 콘솔 접속을 끊더라도 계속 돌아감)를 할 수 있다. 또 nohup.out 파일에 로그가 남기 때문에 문제가 발생하면 확인할 수 있다. 

 

재배포 

재배포는 간단하다. 변경사항이 발생하면 git pull을 통해 받아온 후 clean build를 해준다. 

8080 포트에서 실행중인 프로세스 pid 찾기
sudo lsof -i :8080
해당 pid를 통해 프로세스를 죽여준다
sudo kill -9 <PID>

그리고 실행중이던 프로세스를 죽여주고 다시 nohup ~ 명령어를 통해 재배포 해주면 된다! 

 

후기

처음 프로젝트를 배포하려고 할 때 팀원과 카페에서 하루종일 끙끙대며 겨우 배포했던 기억이 난다.. 그리고 다음 프로젝트에서는 혼자 배포를 하게 되었는데 그때의 기억 + 구글링을 통해 혼자 배포를 해내서 매우 뿌듯했고, 메모장에 대충 적어놓고 계속 참고하면서 재배포 하다가 블로그 글로 정리하게 되었다. 별거 없는 내용이지만 추후에 또 배포할 때 시간을 절약해 줄 것 같고, 내 블로그 아무도 안보는 것 같긴 하지만.. 나와 같은 시행착오를 겪는 분들이 혹시나 본다면? 도움이 되었으면 좋겠다!! 

그리고 참고한 글 들은 참고한 내용 근처에 링크를 다 걸어두었기 때문에 관련해서 더 자세한 설명은 링크를 참고하면 좋을 것 같습니다!