aws 배포 1단계: EC2 수동 배포

wisdom·2022년 9월 4일
0

백엔드 개발자라면?

목록 보기
25/42

AWS-V1 배포

  • 로컬 컴퓨터에서 개발한 프로젝트를 github에 업로드하고, github에 업로드된 프로젝트를 운영 컴퓨터로 집어 넣자
  • 단계 별로 문제점과 흐름을 파악하면서 기본적인 배포부터 해보자
자바 설치(JDK)
sudo apt update 
sudo apt-cache search jdk | grep openjdk-11
sudo apt install openjdk-11-jdk -y
java --version

EC2에서 github 다운로드
git clone https://github.com/wisdom08/aws-v1.git

gradle 실행 권한 주기
cd ~/aws-v1 
chmod u+x gradlew


gradlew로 프로젝트를 jar 파일로 변경하기
./gradlew build

java로 jar를 실행
cd build/libs
java -jar *.jar

nohup 으로 백그라운드 실행(터미널이 꺼져도 종료 안되게)
sudo apt install nohup
nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar &

오류 로그 남기기
pwd -> build/libs
tail -f nohup.out

nohup 으로 실행 중인 거 종료하기(프로세스 아이디를 알아야 함)
ps -ef
sudo kill -9 PID

오류 로그 파일 변경(표준 입출력 리다이렉션) 
nohup java -jar *.jar > mylog.out &
tail -f mylog.out


서버가 종료되면 cron으로 자동 재시작(주기적 실행)
crontab -e 
* * * * * ls -l 1>>cron.log
    • 분(0-59)
    • 시간(0-23)
    • 일(1-31)
    • 월(1-12)
    • 요일(0-7)

nohup

  • 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어
  • 포그라운드로 실행하면 nohup이라고 하더라도 터미널 종료시에 종료되기 때문에 백그라운드로 실행해야함
    - 포그라운드 실행: nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar
    - 백그라운드 실행: nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar &
  • nohup은 자동으로 로그를 남긴다.
    - nohup.out 파일

에러 출력(2) 과 표준 출력(1)이 모두 nohup.put 에 로그로 남겨진다. 나누고 싶으면?

  • 나누는 이유: 배포를 위해서 작성했던 모든 명령어들을 스크립트로 작성하기 위해서
    - 자동화
nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar 1>log.out 2>error.out & 

시간 변경

  • 우분투 OS에 타임 셋팅
    - UTC -> KST
timedatectl
timedatectl list-timezones
timedatectl list-timezones | grep Seoul
sudo timedatectl set-timezone Asia/Seoul

pid 찾기

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

jar 파일 종료 스크립트 작성

pwd -> build/libs
vi spring-stop.sh

spring-stop.sh"

echo "Springboot Stop..."

SPRING_PID = $(pgrep -f aws-v1-0.0.1-SNAPSHOT.jar)

echo $SPRING_PID

kill -9 $SPRING_PID
spring-stop.sh 실행 권한 주기
chmod u+x spring-stop.sh

spring-stop.sh 스크립트 실행
./spring-stop.sh

종료됐는지 확인
netstat -nlpt

스크립트에서 $변수와 $(명령어)

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

스크립트로 cron 등록

vi myScript.sh

"myScript.sh"
crontab -l 1>crontab_new
echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new 
crontab crontab_new

vi job.sh

"job.sh" (현재 폴더에 있는 파일이나 디렉토리를 cron.log로 옮겨라!, 주기적 실행)
ls -l>/home/ubuntu/cron.log

chmod u+x job.sh

chmod u+x myScript.sh
./myScript.sh

cron

  • 주기적 실행
  • Daemon
    - 죽지 않는 프로세스

스프링 서버가 죽었을 때 cron으로 자동 재시작

pwd -> /home/ubuntu
mkdir cron-restart
cd cron-restart
vi spring-stop.sh

"spring-stop.sh"
echo "SPRINGBOOT STOP..."
SPRING_PID=$(pgrep -f aws-v1-0.0.1-SNAPSHOT.jar)
kill -9 $SPRING_PID

chmod u+x spring-stop.sh
netstat -nltp

스프링 서버 실행 cron

vi spring-restart.sh

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

echo $SPRING_PID
echo $SPRING_PATH

if [ -z "$SPRING_PID" ]; then  // 스프링 서버가 꺼졌다면 
 echo "스프링 종료된 상태!"
else
 echo "스프링 시작된 상태!"
fi

chmod u+x spring-restart.sh
./spring-restart.sh

nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar 1>log.out 2>error.out & 
netstat -nltp
./spring-restart.sh

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

echo $SPRING_PID
echo $SPRING_PATH

if [ -z "$SPRING_PID" ]; then
 echo "스프링 종료된 상태!"
 echo "스프링 재시작 - $(date)" 1>>/home/ubuntu/cron-restart/spring-restart.log
 nuhup java -jar $SPRING_PATH 1>log.out 2>error.out &
else
 echo "스프링 시작된 상태!"
fi

./spring-restart.sh
  • 위에 까지 잘 진행하면 ./spring-restart.sh 명령어를 직접 쳐야 스프링 서버가 재시작된다. 위 스크립트를 cron에 등록해서 자동화를 해보자.

"deploy.sh"

# 1.배포 프로세스
echo "deploy start!"
echo "1. JDK install"
echo "2. github project download"
echo "3. gradlew 실행 권한 추가"
echo "4. project build 하기"
echo "5. ubuntu timezone setting"
echo "6. nohup 으로 springboot 실행"

# 2. 스프링 서버 종료 시, 재시작
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
chmod u+x deploy.sh
./deploy.sh

./spring-stop.sh

1분 쯤 뒤 자동으로 서버가 재시작됨(-> 스크립트 덕분)
netstat -nltp 

plain.jar

  • plain archive는 애플리케이션 실행에 필요한 모든 의존성을 포함하지 않고 작성된 소스코드의 클래스 파일과 리소스 파일만 포함한다.
  • 이렇게 생성된 *plain.jar 파일은 모든 의존성이 존재하는게 아니기 때문에 java -jar 명령어로 실행시 에러가 발생한다.
  • 아래 코드는 jar 빌드시에 plain.jar 파일이 생성되지 않게 해주는 코드이다.
"build.gradle"
jar {  
   enabled = false 
}

고정 IP

  • 엘라스틱 IP
  • AWS 프리티어 기준 고정IP 하나를 무료로 제공해준다
    - 조건: EC2 -고정 IP 연결을 반드시 해야함
    - 고정 IP를 생성만 하고 연결 안하면 비용 발생
    - 고정 IP 2개 생성 시 비용 발생

재배포 프로세스 이해

  • 하나의 배포 스크립트가 필요함

  • 첫 번째면 최초 배포 프로세스, 두 번째 이상이면 재배포 프로세스

    redeploy.sh 재배포 스크립트를 작성하자!

    1. 기본 서버를 중지시켜야 함.
서버 중단 스크립트

"spring-stop.sh"
echo "SPRINGBOOT STOP..."
SPRING_PID=$(pgrep -f aws-v1-0.0.1-SNAPSHOT.jar)
kill -9 $SPRING_PID
    1. aws-v1 폴더를 통째로 삭제`
rm -rf /home/ubuntu/aws-v1
    1. 깃 클론 다운
git clone https://github.com/wisdom08/aws-v1.git
    1. gradlew 실행 권한 주기
cd /home/ubuntu/aws-v1
chmod u+x gradlew 
    1. 빌드하기
./gradlew build
    1. jar 실행
nohup java -jar aws-v1-0.0.1-SNAPSHOT.jar 1>log.out 2>error.out & 
    1. cron으로 자동 재시작
"deploy.sh"

crontab -l > crontab_new
echo "* * * * * /home/ubuntu/cron-restart/spring-restart.sh" 1>>crontab_new
crontab crontab_new
rm crontab_new

위 2번부터 7번까지의 과정에서 서버가 멈춰있다.
즉, 재배포를 하게 되면 서버는 멈춘다.
-> 해결해야 할 문제

profile
문제를 정의하고, 문제를 해결하는

0개의 댓글