cicd codedeploy 후 .war 파일 복사 후 tomcat unpack 했는데 작동 안함 (unpack 폴더 빈상태)

처음 원인 분석 : src/main/resources/application.yml 에 문제가 있었던 것 같아서 이 부분부터 수정했다.
하지만 또 되기도 하고 안되기도 하고 원인을 찾으려고 로그도 둘러보고 했다.

거의 원인 분석이 되가는 부분은 appspec.yml 안에 배포 진행 라이프사이클에 따른 hook을 작성하고 그 해당 hook에서 쉘스크립트인 start.sh 파일을 작동시키는 데 여기서 여러가지 조건에 걸려 작동을 제대로 안하는 것 같다.

우선 appspec.yml안에서 s3에서 배포 압축파일을 받은 후 실행인 ApplicationStart 의 runas 를 aws ec2 서버 계정인 ec2-user로 해두었다.

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ec2-user/deploy/
file_exists_behavior: OVERWRITE

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: shellScripts/start.sh
      timeout: 60
      runas: ec2-user

즉 해당 파일에 대한 소유자와 그룹을 전부 ec2-user로 지정하고 쉘 스크립트도 ec2-user로 하는 것이다.
root로 해놨다가 뭔가 복사된 파일이 ec2-user로만 작동하는 것 같아서 이렇게 지정했다.

하지만 이슈는 해결되지 않았다.

다음 진행으로는 shellScripts/start.sh 파일을 손보는 것이다.

start.sh 상에는 배포 후 파일을 지정된 곳으로 복사하면 자동으로 unpack되기 때문에 cp 명령과 재기동만 있을 뿐이다.

#!/bin/bash

REPOSITORY=/home/ec2-user/deploy
cd $REPOSITORY

JAR_PATH="$REPOSITORY/build/libs/project.war"
TOMCAT_PATH="/home/ec2-user/tomcat/webapps"
ERROR_LOG="$REPOSITORY/error.log"
DEPLOY_LOG="$REPOSITORY/deploy.log"
APP_LOG="$REPOSITORY/application.log"

TIME_NOW=$(date +%c)

# build 파일 복사
echo "$TIME_NOW > $JAR_PATH 파일 복사" >> $DEPLOY_LOG

#복사
cp -rfp /home/ec2-user/deploy/build/libs/project.war /home/ec2-user/tomcat/webapps
#cp -rfp $JAR_PATH $TOMCAT_PATH > $APP_LOG 2> $ERROR_LOG

echo "$TIME_NOW > 서버 재기동" >> $DEPLOY_LOG
sudo service tomcat restart

현재 가장 이슈는 cp -rfp /home/ec2-user/deploy/build/libs/project.war /home/ec2-user/tomcat/webapps 이 커맨드가 쉘스크립트상에서 작동되서 파일이 복사되면 unpack 할 때 빈폴더로 unpack 되고

ssh 로 접속해서 cp -rfp /home/ec2-user/deploy/build/libs/project.war /home/ec2-user/tomcat/webapps 를 입력하면 정상적으로 복사된 후 서버가 구동된다는 것이다.

쉘스크립트의 샵뱅이 문제였던 거 같아서 기존에 #!/usr/bin/env bash 였던 것도 #!/bin/bash 로 바꾸었다.
하지만 여전히 정상작동되지 않는다.

cp 부분도 퍼미션까지 그대로 가져가라고 -p 옵션도 추가했다. 오류는 여전했다.

무엇이 잘못되었을까?
cp 부분도 변수로 선언해서 가져오던 cp -rfp $JAR_PATH $TOMCAT_PATH > $APP_LOG 2> $ERROR_LOG 것도 지우고 순수 복사만 넣어본 상태다.

여기까지 분석된 결과다.

이 글은 오류를 찾아 진행하면서 앞으로 업데이트 할 글이다.


2023. 9. 13 추가

cp 명령어가 작동되고 바로 리스타트해서 그런 것 같아서 wait와 sleep을 주어 cp 처리 후 10초의 시간을 주었더니 좀 더 이상없이 진행되고 있다.

수정한 start.sh 는 아래와 같다.

#!/bin/sh

REPOSITORY=/home/ec2-user/deploy
cd $REPOSITORY

JAR_PATH="$REPOSITORY/build/libs/project.war"
TOMCAT_PATH="/home/ec2-user/tomcat/webapps"
ERROR_LOG="$REPOSITORY/error.log"
DEPLOY_LOG="$REPOSITORY/deploy.log"
APP_LOG="$REPOSITORY/application.log"
TIME_NOW=$(date +%c)

# build 파일 복사
echo "$TIME_NOW > $JAR_PATH 파일 복사" >> $DEPLOY_LOG

sudo chmod u+x $JAR_PATH

#복사
nohup cp -rfp $JAR_PATH $TOMCAT_PATH > $APP_LOG 2> $ERROR_LOG &
PID1 = $!
wait PID1

echo "$TIME_NOW > 서버 재기동" >> $DEPLOY_LOG
sleep 10
sudo service tomcat restart


2023. 9. 14 추가

appspec.yml 에 퍼미션 755를 추가해주었다.

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ec2-user/deploy/
file_exists_behavior: OVERWRITE

permissions:
  - object: /
    pattern: "**"
    mode: '755'
    owner: ec2-user
    group: ec2-user

hooks:
  AfterInstall:
    - location: shellScripts/stop.sh
      timeout: 60
      runas: ec2-user
  ApplicationStart:
    - location: shellScripts/start.sh
      timeout: 60
      runas: ec2-user

위 코드 중에 permissions 의 mode : '755' 부분이다.

이 이후에 아직 오류는 발생하지 않고 있다.


2023. 11. 3 추가

서버의 메모리를 swap 을 통해 2GB 확장했더니 그 이후로 서버가 죽지 않았다.
그 외 다른 액션은 없었다. 아직은 오랫동안 상당히 잘 유지되고 있다.

아무래도 t2.micro 사양이라 메모리가 부족했던 것 같다.

Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

0 댓글
Inline Feedbacks
View all comments
TOP