⏳ Time Log/1. One Day (Daily · TIL)

Day 56 (1/7) - AWS 서버 자동화 배포 및 Crontab 무중단 재시작 스크립트 구현

this.Serena 2026. 2. 23. 04:28

AWS 서버 자동화 배포 및 Crontab 무중단 재시작 스크립트 구현

한 줄 요약: EC2 환경 내 Spring Boot 자동 배포 파이프라인 구성 및 cron 기반 프로세스 감시·재시작 로직 구축

 

1. 초기 환경 세팅 및 빌드 프로세스

  • 파일 전송 및 압축 해제: Xftp를 활용해 서버로 전송된 아카이브 파일(deploy.tar) 압축 해제 및 불필요한 원본 삭제
  • 초기 쉘 스크립트 가동: 서버 타임존 설정(timezone.sh) 및 사용자 정의 초기화 스크립트(myScript.sh) 실행
  • 디렉토리 구조화: 프로세스 모니터링을 위한 cron-restart 전용 디렉토리 생성 및 제어 스크립트 복사
  • 의존성 설치 및 빌드: JDK 21 설치, Git Clone 후 gradlew 권한 부여 및 프로젝트 빌드 수행
sudo apt update
sudo apt install openjdk-21-jdk -y
git clone https://github.com/hayohio-bit/aws-v1.git
cd ~/aws-v1
chmod u+x gradlew
./gradlew clean build

 

2. 프로세스 감시 및 자동 재시작 로직 (spring-restart.sh)

  • PID 추적: pgrep 명령어를 사용하여 현재 구동 중인 Spring Boot jar 파일의 프로세스 ID(PID) 확인
  • 상태 분기 처리: 쉘 스크립트 조건문(if [ -z "$SPRING_PID" ])을 통해 PID 값 존재 여부 검증
  • 자동 복구 및 로깅: 서버 다운 감지 시 현재 시간 로깅 후 nohup을 이용해 백그라운드에서 서버 즉시 재가동
#!/bin/bash
SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
SPRING_PATH="/home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar"

if [ -z "$SPRING_PID" ]; then
    echo " 스프링 재시작 - $(date) " 1>>/home/ubuntu/cron-restart/spring-restart.log
    nohup java -jar $SPRING_PATH 1>log.out 2>err.out &
else
    echo " 스프링이 시작된 상태 ... "
fi
  • 참고 사항: 로그 파일(spring-restart.log) 경로를 절대 경로로 지정하여 crontab 실행 시 발생할 수 있는 경로 인식 오류 원천 차단

 

3. 원클릭 자동화 배포 파이프라인 (deploy.sh)

  • 안전망 구축: set -e 옵션을 선언하여 스크립트 실행 중 에러 발생 시 파이프라인 즉시 중단 처리
  • 배포 단계 명세: 배포 프로세스 진행 상황을 파악할 수 있도록 각 단계별 작업 내역 표준 출력(echo)
  • Crontab 자동 등록: 백그라운드 재시작 스크립트를 1분 주기(* * * * *)로 반복 실행하도록 스케줄러에 명령어 자동 삽입
#!/bin/bash
set -e

# 배포 프로세스 실행
echo " 1. JDK install "
# ... (생략) ...
echo " 6. nohup으로 Spring Boot 실행 "

# 서버 감시 스케줄러 등록
JOB_LINE="* * * * * /home/ubuntu/cron-restart/spring-restart.sh"
(crontab -l 2>/dev/null || true; echo "$JOB_LINE") | crontab -
  • 주의 사항: crontab -l 2>/dev/null 구문을 통해 기존에 등록된 스케줄이 없을 경우 발생하는 에러를 무시하고 신규 작업 안전하게 덧붙임