[AWS] AWS 배포 V1

Jimin·2023년 7월 14일
0

AWS(metacoding)

목록 보기
5/5

AWS 배포 V1

프로젝트 백그라운드로 실행

  • nohub: 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어
  • foreground로 실행했기 때문에 nohup으로 실행해도 터미널 종료 시 함께 종료됨
  • 백그라운드로 실행해야함!
  • 8080 실행 중임!
  • 터미널 종료하면 로그를 확인할 수 없음
  • nohub은 자동으로 로그를 남김

로그 확인 nohup.out


실시간 로그 모니터링

  • tail -f nohup.out

로그 파일 위치 변경

표준 출력, 표준 에러

에러 출력(2) - nohup.out

  • jar 파일명 오타 → cat nohup.out 출력하면 두 번째 사진과 같은 결과가 나옴

표준 출력(1) - nohup.out

  • 에러 출력, 표준 출력 모두 nohup.out에 출력함
  • 정상 로그와 에러 로그를 분리해야 함
  • nohup java -jar 파일명 1>log.out 2>err.out
  • 이유: 배포를 위해서 작성했던 모든 명령어를 스크립드 작성(자동화)하기 위해서
  • 리다이렉션 설정을 해줄 때 꺾쇠의 양 옆에는 띄어쓰기 하지 않는 것에 주의!

타임존 변경 및 종료 스크립트 작성

종료 스크립트 작성

  • ps -ef | grep *.jar | grep -v grep | awk '{print $2}’
  • pgrep -f *.jar

  • $변수: 변수의 값을 출력 혹은 실행
  • $(명령어): 명령어 결과를 리턴

cron 주기적 실행

  • 부하, 에러 (서버 종료될 수 있음)

  • 서버가 종료됐다는 로그를 남김 → nohup 2>err.out

  • 그러나 자동 재시작이 되지 않음 → 직접 재시작을 해야함

  • 자동 재시작을 하는 방법

  • cron : 주기적 실행 명령어

  • crontab -e
    - * * * * *: 분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)

  • 1 * * * *: 매 시각 1분에 실행

  • 1 3 * * *: 매일 새벽 3시 1분

  • 1 3,4 * * *: 매일 새벽 3시 1분, 4시 1분

스크립트로 cron 등록

  • cron: 주기적 실행

  • Demon: 죽지 않는 프로세스

  • 스크립트 실행 시 contab에 자동 등록되게 하고 싶음

  1. crontab -l
  2. 2.crontab_new 파일에 옮김
    • 추가 >> 표준 입출력
  3. crontab crontab_new 실행
    - crontab -e에 추가된 내용이 들어감

cron으로 스프링 서버 재실행 하기

SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
SPRING_PATH="/home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar"

echo $SPRING_PID
echo $SPRING_PATH

if [ -z "$SPRING_PID" ]; then
  echo "스프링이 종료된 상태..."
else
  echo "스프링이 시작된 상태..."
fi
  • 서버 재실행

  • 서버 종료

  • 종료 후 재시작 테스트

deploy

  • deploy.sh

  • deploy 스크립트 파일 실행

  • crontab -e

  • 잘 등록되어 있음

  • 테스트
    - 서버 중지

  • pm 5:18

  • pm 5:19

재배포 프로세스 이해

재배포 스크립트 작성 - redeploy.sh

  1. 기존 서버 중지

  2. aws-v1 폴더를 통째로 삭제

    1. rm -rf /home/ubuntu/aws-v1 (강제 삭제)
  3. git clone 다운

    1. git clone https://github.com/codingspecialist/aws-v1.git
  4. gradlew 실행 권한 주기

    1. cd /home/ubuntu/aws-v1
    2. chmod u+x gradlew
  5. 빌드

    1. ./gradlew build
  6. jar 실행

    1. cd /home/ubuntu/aws-v1/build/libs
    2. nohup java -jar /home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &
  7. cron으로 자동 재시작

    1. deploy.sh
    echo "crontab 등록 - spring restart..."
    crontab -l > crontab_new
    echo "* * * * * /home/ubuntu/cron-restart/spring-restart.sh" 1>>crontab_new
    crontab crontab_new
    rm crontab_new
  • 하나의 배포 스크립트를 만들어주면 좋음

    • 최초: 최초 배포 프로세스
    • 두 번째 이상: 재배포 프로세스
  • 해결사항: 2~7번까지 서버가 멈춰있음 즉 재배포를 하게 되면 서버는 멈춤

  • 재배포 시에 ec2를 새로 생성해서 거기에 재배포를 하고 (apt update, JDK 설치, crontab 다시 등록)

  • 배포가 잘 됐으면 기본 서버를 종료시키고

aws-v1 문제점

  1. 자동화 스크립트가 없음
  2. 서버가 멈춤 → 재배포 할 때
  3. 테스트를 못 하고 바로 배포가 됨

  1. 사용자 폭증 - 못 버팀
  2. Github 코드 push만 하면 자동 재배포가 될 수 없을까?
  3. ec2 서버에 프로그램 설치가 귀찮음
    • 엘라스틱 빈 스톡 (jdk 설치되어 있는 서버)
  4. 로컬 개발할 때 동일한 환경에서 개발할 순 없을까?
    • 가상화 기술 → 도커!

업로드중..

0개의 댓글