Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[AWS] EC2에서 스프링부트 프로젝트 배포 본문

AWS

[AWS] EC2에서 스프링부트 프로젝트 배포

mangdo 2021. 4. 16. 22:44

1. EC2서버에 git 설치

깃헙에서 코드를 받아올 수 있게 EC2에 git을 설치한다.

sudo yum install git

git --version

git clone으로 프로젝트를 저장할 디렉토리 생성하고 생성된 디렉토리로 이동한다.

mkdir ~/app
mkdir ~/app/step1

cd ~/app/step1

 

2. git clone

깃헙 리포지토리에서 주소를 복사해온 후에 git clone을 진행한다.

git clone (깃헙 리포지토리 주소)

 

3. 테스트 검증

gradlew 파일 덕분에 EC2서버에 gradle을 설치하지않아도된다.

gradlew 파일은 그레이들이 설치되지 않은 환경에서도 해당 프로젝트에 한해서 그레이들을 쓸 수 있도록 지원하는 wrapper파일이다. 해당 파일을 직접 이용하기 때문에 별도의 설치가 필요하지않다.

cd (프로젝트명)
ls -al

chmod +x ./gradlew
./gradlew test

chmod

더보기

chmod는 권한을 변경해주는 명령어이다.

권한의 종류에는 읽기(r), 쓰기(w), 실행(x)가 있다.

 

4. 배포스크립트 생성

vim 편집기로 스크립트를 생성한다.

vim ~/app/step1/deploy.sh

[ deploy.sh ]

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=SpringBootBoard/demo

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"
git pull

echo "> 프로젝트 빌드 시작"
./gradlew build

echo "> step1 디렉토리로 이동"
cd $REPOSITORY

echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f demo.*.jar)

echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi

echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep .jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

 

생성된 배포 스크립트에 권한을 추가한다.

chmod +x ~/app/step1/deploy.sh

* 배포 스크립트 해석

더보기

deploy.sh

#! /bin/bash

   : #는 주석기호가 아닌 실행가능한 쉘 스크립트라는 것을 나타낸다.

   : #! 뒤에는 경로명으로 스크립트에 들어있는 명령어들을 해석할 프로그램의 위치를 나타낸다.

   : 즉, #! /bin/bash는 현재 스크립트가 bash 쉘스크립트라는 것을 미리 알려주는 것이다.

 

grep : 특정문자열을 찾아낸다.

pgrep : ps명령어 + grep명령어

         : 프로세스 id만 추출하는 명령어이다.

         : -f 옵션은 프로세스 이름으로 찾아낸다.

 

if ~ else ~ if 구문 : 현재 구동중인 프로세스가 있다면 해당 프로세스를 종료시킨다.

kill -15 : 정상종료

kill -9 : 강제종료

 

ls : 디렉토리의 내용을 확인한다

    : -t 옵션은 시간순 정렬

    : -r 옵션은 거꾸로 정렬

 

JAR_NAME=$(ls -tr $REPOSITORY/ | grep .jar | tail -n 1)

    : 새로 실행할 jar 파일명을 찾는다.

    : 여러 jar파일이 생기기 때문에 tail-n으로 가장 나중의 jar파일(최신파일)을 변수(JAR_NAME)에 저장한다.

 

 

nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

 

& : 백그라운드로 실행시킨다.

java -jar [파일명] &

   : 사용자가 로그아웃시 프로그램 종료된다.

nohup java -jar [파일명] &

   : 사용자가 로그아웃해도 백그라운드로 실행되게한다.

 

2>&1

   : 0은 표준입력, 1은 표준출력, 2는 표준에러이다.

   : 쉘 스크립트를 실행할 때 중간에 어러발생시 에러 메시지가 화면에 출력되는 것이 보기 힘드니, 로그파일에 에러메시지를 기록하게 한다.

 

 

*  JAR파일은 JRE만으로도 실행가능하다. 독립적이고 가볍다.

WAR파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹 서버 (WEB)또는 웹 컨테이너(WAS)가 필요하다.

일반적으로 외장 WAS를 사용하는 경우에는 WAR파일을, 내장 WAS를 사용하는 경우 JAR파일을 사용한다고 한다.

스프링 부트는 JAR에 톰캣을 내장하고 있고, 디폴트로 JAR로 빌드를 한다.

 


5. 배포 스크립트 실행

./deploy.sh

6. nohup.out을 열어 로그 확인

vim nohup.out

spring이 시작되다가...
멈췄다^^
오류 메시지

7. 에러 수정 - deploy.sh 수정 

보안의 문제로 github에 올리지 않았던 application-oauth.properties가 없어 에러가 났다.

EC2서버에 직접 application-oauth.properties을 만들면된다.

step1아닌 app디렉토리에 생성한다.

vim /home/ec2-user/app/application-oauth.properties

 

(application-oauth.properties 작성..)

 

방금 서버에 생성한 application-oauth.properties를 쓰도록 deploy.sh 파일을 수정한다.

nohup java -jar\
        -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties\
        $REPOSITORY/$JAR_NAME 2>&1 &

 

8. 다시 배포 스크립트 실행

다시 deploy.sh를 실행하고 나서 nohup.out으로 가보자.

./deploy.sh
vim nohup.out

잘안보일 것같으니 밑에 사진을 추가한다
톰캣이 시작된 것을 확인할 수 있다.

 

+) 에러 사항

개인적으로 이부분에서 많이 헷갈려 했는데 nohup에서 틀린거였다. nohup의 띄어쓰기에서 틀리게 되면 하이라이팅이 다르게 나온다. 잘 체크해야한다. 그것도 아니라면 nohup 파일을 삭제해보는 것도 좋은 방법이다.

github.com/jojoldu/freelec-springboot2-webservice/issues/582

 

참고 출처 :

스프링부트와 AWS로 혼자 구현하는 웹서비스(이동욱 저)

'AWS' 카테고리의 다른 글

[AWS] AWS의 IAM  (0) 2021.04.18
[AWS] RDS에서 스프링부트 프로젝트 실행  (0) 2021.04.17
[AWS] RDS 인스턴스에 접속하기  (4) 2021.04.16
[AWS] RDS에 맞는 파라미터 설정하기  (0) 2021.04.16
[AWS] RDS 인스턴스 생성하기  (0) 2021.04.16