스프링부트로 웹 서비스 출시하기 6일차

박세건·2023년 8월 22일
0

이전시간에 모든 설정을 완료하고 퍼블릭 DNS로 접근이 가능한지 확인하는 과정에 에러가 발생해서 접근할 수 없었다.
이유를 계속해서 찾던도중에 deploy.sh 파일이

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=springboot-webservice #잘못된 부분!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 내 프로젝트 이름이 들어가야한다.

echo "> Build 파일 복사"

cp $REPOSITORY/zip/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fl springboot-webservice | grep jar | awk '{print $1}')
#pgrep -fl springboot-webservice | grep jar -> 애플리케이션 이름으로된 jar 프로그램 찾기
#awk '{print $1}' -> 해당 ID를 찾는다.

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/*.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

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

로 되어있었고 알고보니 나의 프로젝트 이름(PROJECT_NAME) 은 예제와 다르다는 것을 잊고 그대로 사용했던 것이다.
참 어이없는 실수였다..
내 프로젝트 이름을 적용하고(board_project) 다시 확인해보자!!

똑같이 접근은 불가했고
다시 로그를 확인해보니

이전과 같은 오류가 발생했다.

travis를 통과하고 S3와 Codedeploy에서 성공을 배포까지는 잘 진행된것같은데 그렇다면 jar 파일을 실행할때인건가, 아니면 CodeDeploy를 위해 설정해줬던 appspec.yml 에서 문제가 발생한건가 아직 잘 모르겠지만 꾸준히 시도해보자

Travis CI를 통한 배포까지는 이상이없었기때문에 travis.yml은 통과하고 appspec.yml과 deploy.sh 를 살펴보자

appspec.yml

#배포 성공시 설정
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/step2/zip/
    overwrite: yes

#CodeDeploy에서 EC2 서버로 넘겨준 파일들 모두 ec2-user 권한을 갖도록 한다
permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

#CodeDeploy 배포 단계에서 실행할 명령어 지정 -> CodeDeploy가 jar 파일을 실행시키기위함 즉 deploy.sh 를 실행시키기위함
hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ec2-user

오타가 있을만한 부분이 없기때문에 deploy.sh를 살펴보자

deploy.sh

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=board_project

echo "> Build 파일 복사"

cp $REPOSITORY/zip/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fl board_project | grep jar | awk '{print $1}')
#pgrep -fl board_project | grep jar -> 애플리케이션 이름으로된 jar 프로그램 찾기
#awk '{print $1}' -> 해당 ID를 찾는다.

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/*.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

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

deploy.sh를 살펴보다가 프로젝트 이름 같은경우는 이미 수정을 했고 오타또한 발견되지가 않아서
하나하나 위치를 살펴보면서 제대로 작동하고 있는지 확인해보았다.

REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=board_project

echo "> Build 파일 복사"

cp $REPOSITORY/zip/*.jar $REPOSITORY/

EC2로 확인했을때에 step2에 board_project.jar 파일이 정상적으로 생성이되었기때문에 이상 없다.

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fl board_project | grep jar | awk '{print $1}')
#pgrep -fl board_project | grep jar -> 애플리케이션 이름으로된 jar 프로그램 찾기
#awk '{print $1}' -> 해당 ID를 찾는다.

echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"

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

실행중인 애플리케이션이 있다면 종료하는 것이기때문에 jar 파일 실행시오류가 나는 부분이 아니다.

echo "> 새 어플리케이션 배포"

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

이부분 부터가 실제로 jar 파일을 찾는 과정이 시작이기때문에 중요하다
EC2에

ls -tr $REPOSITORY/*.jar | tail -n 1

이 문장을 복사해서 넣어보았다.

ls -tr /home/ec2-user/app/step2/*.jar | tail -n 1

이런식의 코드가 될것이다.

결과값 : /home/ec2-user/app/step2/board_project-0.0.1-plain.jar
즉! 나는 계속 jar 파일이 아닌 plain.jar 파일을 실행했던 것이다.

알아보니

스프링 부트 gradle 플러그인 2.5 버전부터 gradle 빌드 시 JAR 파일이 2개 생성된다.
별도의 설정을 하지 않았을 때 하나는 "프로젝트 이름-버전.jar",
다른 하나는 "프로젝트 이름-버전-plain.jar"이라는 이름을 가진다.

plain archive는 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고,
작성된 소스코드의 클래스 파일과 리소스 파일만 포함한다.
모든 의존성이 존재하는 게 아니기 때문에 plain jar는 "java -jar" 명령어로 실행 시 에러가 발생한다.

2.6.7 버전의 공식문서에는 "bootJar 혹은 bootWar가 설정되어 있어도 분류자의 컨벤션에 따라 Plain Archive를 사용하기 위해 jar 혹은 war Task가 설정된다."라고 명시되어 있습니다.
관련 블로그

따라서 plain.jar 파일을 제거해주고 다시 생기지 않게 설정해주었다.

제거후에 다시 커밋&풀 해주고 travis를 통과하고 다시 codedeploy-agent.log 를 열어보니 같은 오류가 발생하고있었다...

일단 이어서 deploy.sh를 살펴보자!

ls -tr /home/ec2-user/app/step2/*.jar | tail -n 1

다시 이 코드를 실행했을때 정상적으로

jar 파일을 갖고있는 것을 확인했다 그럼 그다음.

nohup java -jar $REPOSITORY/jar/$JAR_NAME &

가만보니 이상한점이있었다. JAR_NAME에는 방금전에

ls -tr /home/ec2-user/app/step2/*.jar | tail -n 1

이 코드를 실행시킨 결과 값이 들어있다면 JAR_NAME=/home/ec2-user/app/step2/board_project-0.0.1.jar 이 전체가 들어가게되는데
이때

nohup java -jar $REPOSITORY/jar/$JAR_NAME &

이 구문을 실행하게되면

nohup java -jar /home/ec2-user/app/step2/jar//home/ec2-user/app/step2/board_project-0.0.1.jar &

이런식에 코드가 완성되게 되는 것이였다.
nohup으로 실행시키려고 했던 파일의 위치가 잘못되었던 것이다!!

JAR_NAME에 REPOSITORY가 들어있기때문에 따라서 nohup으로 실행시키는 문장을

nohup java -jar $JAR_NAME &

로 수정하고 다시 comit&pull을 해주고 travis에게 통과처리를 받고 EC2의 퍼블릭 도메인 주소에 접속해보니...


드디어 정상적으로 애플리케이션에 접근할 수 있었다!!

그렇다면 통과했을때에 codedeploy-agent.log 에는 어떤 구문이 뜨는지 궁금해서 확인해봤더니

여전히 같은 오류를 보여주고있었다......
이게 무슨일인가 생각을 해보니
오류를 해결할때에 처음에 발생한 오류부터 알아보자고 해서 codedeploy-agent.log 을 읽을때에
more코드로 이 파일을 열어 보았다 (more는 모든 글을 보는것이 아닌 처음부터 조금씩 차례차례로 볼 수 있게 해주는 함수이다.)
log에는 계속해서 결과값이 쌓이게된다는 것을 알았고 결국 내가 보고 있는 이 오류는 내가 제일 처음으로 이 애플리케이션을 연결할때 발생했던 오류를 계속 보고 있었던 것이다...
참 바보같고 어리석은 실수였다.

오늘 이 경험을 통해서 다시는 이런 실수를 하지 않게 확실히 잡아놓자.

제대로 cat 함수(모든 log내용을 보여주기때문에 마지막 문장을 확인할 수 있다)를 사용해서 codedeploy-agent.log 파일을 열어보니

코드는 에러 없이 잘 진행되는 코드를 보여주고 있었다.

오늘 진행하면서 시도해봤던 방법들 해결방법들을 기억하고 기록해서 잊지말고 다음에 같은 오류가 발생했을때에 빠르게 해결할 수 있도록 하자.
다음은 index 페이지를 변경한 후에 제대로 반영이 되는지 확인해보자!!

profile
멋있는 사람 - 일단 하자

0개의 댓글