이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 읽고 정리한 글입니다.
내용보다 중요한 점, 추가적으로 알아본 것 등을 위주로 적었습니다.
http://www.yes24.com/Product/Goods/83849117
8장. EC2 서버에 프로젝트를 배포해 보자
배포를 해보지 않은 입장에서, 이 챕터가 가장 도움이 된 챕터였다.
1. EC2에 프로젝트 Clone 받기
깃허브에 접속해 다음과 같은 코드를 실행한다.
sudo yum install git
mkdir ~/app
mkdir ~/app/step1
cd ~/app/step1
git을 다운로드 받고 app과 step1 폴더를 만들고 그 위치로 이동한 것이다.
그 후 내가 배포할 프로젝트를 git clone 받는다.
이제 ls 혹은 ll 명령어로 폴더를 들여다 보면 다음과 같은 파일이 보인다.
gradlew
gradlew.bat
gradlew 는 리눅스, 맥을 위한 스크립트이고, gradlew.bat는 윈도우를 위한 스크립트이다.
우리는 아마존 리눅스 2 서버이므로 gradlew 를 실행시킨다.
./gradlew test
test라는 task를 gradle로 실행시키겠다는 것이다. 테스트코드가 정상적이라면 제대로 실행될 것이다.
만약 여기서 권한에 막힌다면 다음을 실행하자.
chmod +x ./gradlew
+x 는 읽기, 쓰기, 실행 권한 중 실행권한을 추가해주는 것을 말한다.
2. 배포 스크립트 만들기
깃 원격 저장소에 있는 코드를 실행마다 자동으로 pull 하고 빌드하고 실행까지 해야할 일이 너무 많다. 배포 스크립트를 통해 이 모든 것을 스크립트만 실행하면 되도록 하자.
".sh"라는 확장자를 가진 쉘 스크립트는 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일이다.
vim ~/app/step1/deploy.sh
step1 디렉토리에 deploy.sh 라는 파일을 수정하는 vim 편집기로 이동한다. 모든 내용을 입력하고 :wq 혹은 ZZ 명령어를 통해 편집기를 나오면 파일이 만들어지면서 저장된다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1 //(1)
PROJECT_NAME=freelec-springboot2-webservice
cd $REPOSITORY/$PROJECT_NAME/ //(2)
echo "> Git Pull" //(3)
git pull
echo "> 프로젝트 Build 시작"
./gradlew build //(4)
echo ">step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/ //(5)
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar) //(6)
echo "현재 구동중인 애플리케이션 pid 확인"
if [ -z "$CURRENT_PID" ]; then //(7)
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) //(8)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 & //(9)
echo는 콘솔 창에서 띄워주는 문구라고 생각하면 된다. 실행시 창에 출력된다.
(1) 자주 사용하므로 변수에 저장. 프로젝트명이나 디렉토리 경로가 다르면 여기만 다르게 쓰면 된다.
(2) git clone 받았던 경로로 이동한다.
(3) github에 올라온 최신 코드를 git pull한다.
(4) gradlew 명령으로 build한다.
(5) build의 결과물은 jar 파일이다. 이걸 복사해 jar 파일들을 모아둔 위치로 이동시킨다.
(6) 진행중인 프로세스를 종료하고 pid를 출력한다.
(7) 만약 (6)에서 정상적으로 종료되지 않고 아직도 실행중인 프로세스가 있다면 쉘 스크립트를 중단시킨다.
(8) jar 파일들 중 가장 최신의 파일을 찾는다.
(9) 해당 jar 파일을 nohup으로 실행시킨다.
하지만 이렇게 해도 gitignore 된 파일 때문에 그 파일들을 가져와야 한다.
3. 외부 Security 파일 등록하기
비밀을 이유로 gitignore 된 파일들을 직접 ec2 서버에 넣어야 한다. 1차적인 방법은 ec2 서버에도 git pull을 해서 받아온 프로젝트 폴더가 있으니, 그 안에 src/main/java/.../resources 에 찾아들어가서 ignore된 파일을 직접 vim 편집기 (편집기는 상관없음)로 복붙해 넣는 것이다.
하지만 위의 쉘 스크립트에서 하듯이 프로젝트를 다시 pull 받아오는 과정이 있기 때문에 밖의 경로에 복붙해놓고 프로젝트 실행시 연결 시키는 것이 낫다.
따라서 step1 밖의 app 디렉토리 경로에서 ignore된 파일을 저장한다. 그리고 이 파일을 자동으로 연결하도록 deploy.sh를 수정한다.
...
nohup java -jar \ -Dspring.config.location=classpath:/application.properties, /home/ec2-user/app/application-oauth.properties, /home/ec2-user/app/application-real-db.properties, classpath:/application-real.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
그 후 다시 deploy.sh를 실행해보자.
필자는 스웨거 설정을 하고 배포를 한 후, 스웨거 ui 페이지로 들어갔다. 잘 출력된다. (기쁨...)
(추가로 현재 보안 및 로그인 부분은 오류가 해결되지 않아 일단 하지 않고 배포한 상태이다. 오류 해결 후 다시 여기에 이어 붙이겠다...)
'스프링부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
06,07장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - AWS 서버 와 데이터베이스 환경을 만들어보자 - AWS EC2, RDS (0) | 2023.02.03 |
---|---|
03장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (0) | 2023.01.20 |
02장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 스프링 부트에서 테스트 코드를 작성하자 (0) | 2023.01.20 |
01장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 인텔리제이로 스프링 부트 시작하기 (0) | 2023.01.13 |