처음 원인 분석 : 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 사양이라 메모리가 부족했던 것 같다.