본문 바로가기
Cloud | CICD/Deploy

[AWS] EC2 Instance에 Spring boot jar 파일 무중단 배포하기

by seoyamin 2022. 10. 19.

와 드디어 며칠을 계속 시도한 끝에 드디어 EC2에 jar 파일을 수동 배포하였다!!!!!
작성한 API도 잘 돌아가는 것을 확인하고 나니, 서버 관련 첫 걸음을 내딛은 것 같아서 벅찼다.

 

사실 시험기간이었지만 EC2 배포를 무조건 하고 싶어서 붙들고 있었는데, 보람이 있었다.

잊어버리기 전에 그 과정을 후다닥 기록하고자 한다.

 

 

Spring boot 파일을 EC2 인스턴스에 배포하는 방법

Spring boot 프로젝트를 통해 API를 짜고 나면, 이를 항시 구동중인 서버 위에 배포해야 누구든 접근해서 해당 기능을 사용할 수 있다. 즉 내가 짠 API를 세상에 내놓기 위해서는 배포가 필요한 것이다.

이를 위해서는 프로젝트 파일을 빌드한 후, 그 결과로 생긴 jar 파일을 서버에서 java -jar 명령어로 RUN 해줘야 한다.

배포하는 방법에는 아래 두 가지가 있으며, 지금은 1번째 방법으로 배포를 진행해봤다.

(두번째 방법으로도 해봤는데, build할 때 너무 시간이 오래 걸리면서 진행이 계속 멈춰있는 문제가 있어서 나중에 다시 시도해봐야 겠다)

 

  Method 1 Method 2
Local 로컬에서 build해서 jar 파일 생성 로컬에서 github repository에 프로젝트를 올리기
EC2  인스턴스에 그대로 복붙 →  RUN 인스턴스에서 clone → build해서 jar 파일 생성 → RUN

 

 


 1   EC2 인스턴스 생성

(1) 인스턴스 생성

(2) 보안 그룹 설정

 

 2   EC2 인스턴스 환경 설정

서버도 하나의 client이다!
따라서 서버에서 어떠한 빌드 파일을 실행하려면, 해당 파일을 실행하기 위한 환경을 로컬에서처럼 설정해줘야 한다.

 

내가 실행하려는 프로젝트는 spring boot & MySQL을 이용하기 때문에, jdk와 mysql을 EC2에 설치해줘야 한다.

 

1.  jdk 설치

나는 sdk 11을 이용하는 프로젝트를 실행할 것이므로, jdk 11을 설치했다.

완료 후,  java -version  했을 때 설치한 버전이 잘 나오면 성공!

$ apt-get update
$ apt-get install openjdk-11-jdk

 

2.  MySQL 설치

완료 후,  mysql --version  했을 때 버전이 잘 나오면 성공!

$ apt-get update $ apt-get install mysql-server

 

3.  MySQL 환경 설정

(1) MySQL 접속

$  mysql -u root -p
$  (비밀번호 입력)

 

(2) 사용자 생성

- 모든 ip에서 접속 가능한 범용 사용자 만들기
$  create  user  '사용자명'@'%'  identified  by  '비밀번호'  ;
$ create user 'admin'@'%' identified my 'test1234';
- 일반적인 사용자 만들기
$  create  user  '사용자명'@'ip주소'  identified  by  '비밀번호'  ;

 

(3) 사용자에게 권한 부여

$  grant  all  privileges  on  db명.table명  to  '사용자명'@'%' ;

 

 

(4) 사용자 목록 확인

사용자 목록은 'mysql' 이름의 database의 'user' 이름의 테이블안에 저장되어 있다.

$  select user, host from mysql.user ;

 

(5) 모든 외부 ip에서 해당 mysql에 접속 허용하기 

이 과정은 mysql> 에서 나와서 ubuntu에서 진행한다. (설정 파일을 변경해야 하므로  sudo su  이후 진행)

 

 

 

 3   dataSource 설정

application.yml 파일에서 데이터베이스 관련 설정을 해준다.

 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://{database endpoint}:3306/{database name}?zeroDateTimeBehavior=convertToNull & useLegacyDatetimeCode=false
    username: {username}
    password: {password}

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: update
    defer-datasource-initialization: true

 

 4   로컬에서 빌드하기

1. spring boot 프로젝트에서 gradlew 파일이 있는 위치까지 이동

터미널 상에서 이동하면 된다

 

2. build

빌드가 완료되고 나면, build 폴더 아래에 libs/myproject-0.0.1-SNAPSHOT.jar 파일이 생성된다.

./gradlew build -x test


※  이미 한 번 이상 build 했던 경우            
     ./gradlew clean build 

※  textApplication은 빌드에서 제외하기   :     -x test

 

 

3. 로컬의 jar 파일을 EC2로 복붙

$  scp  ./build/libs/myproject-0.0.1-SNAPSHOT.jar  {호스트명}:/home/ubuntu

 

※  호스트명 :  ubuntu@{퍼블릭 ip}   or   간소화된 호스트명 (.ssh에 등록해놓은 경우)

 

 

 5   EC2에서 jar 파일 실행하기

1. 그냥 실행

java  -jar  myproject-0.0.1-SNAPSHOT.jar 

 

2. 무중단 실행

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

 

3.  배포 결과 확인

 http://{Elastic IP}/{port번호} 로 접속해보면 서버가 잘 돌아가는지 확인 가능!

 ex )   http://123.45.6.78/3001