[AWS] AWS EC2 기본 배포하기(1)
0. EC2 서버 생성AWS에서 EC2 서버를 생성하고 탄력적 IP까지 연결해 주었다고 가정하고 진행하겠다. 1. 로컬에서 Github로 프로젝트 업로드배포하고자 하는 프로젝트를 Github에 업로드한다. 2.
allyouredreaminof.tistory.com
1. nohub으로 백그라운드 실행
빌드를 하면 실제로 실행할 jar 파일과 plain.jar 파일 총 2개의 파일이 생성된다.
plain.jar 파일은 프로젝트가 의존하는 라이브러리를 포함하지 않고, 작성한 코드의 클래스 파일과 리소스 파일만을 포함한다.
따라서 build.gradle에 아래 코드를 추가하여 plain.jar 파일이 생성되지 않도록 하면, java -jar *.jar 명령어를 실행했을 때 하나의 jar 파일을 실행시킨다.
// build.gradle
jar {
enabled = false
}
- nohup이란?
nohup은 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어이다.
터미널 창이 종료되어도 서버가 종료되지 않도록 nohup을 사용해 백그라운드로 실행할 수 있다.
nohup java -jar *.jar &
* & 없이 nohup java -jar *.jar 명령어를 실행하면 포그라운드로 실행된다.
2. 오류 로그 남기기(표준 입출력 리다이렉션)
표준 입출력을 변경하여 로그를 nohup.out에서 mylog.out으로 redirection 한다.
2-1. 로그 확인
nohup을 사용하면, nohup.out 파일에 자동으로 로그가 남는다.
- cat 명령어로 확인하기
cat nohup.out

- 실시간으로 확인하기
실시간으로 로그를 확인하기 위해 tail 명령어를 사용할 수 있다.
tail -f nohup.out
2-2. 프로세스 종료
프로세스를 종료시키기 위해서는 PID를 알아야 한다.
- 실행 중인 프로세스 확인
netstat -nlpt
- 모든 프로세스 목록 확인
ps -ef
- 프로세스 강제 종료
kill -9 [PID]
2-3. 로그 파일 변경 후 실행
nohup.out 파일 대신, 원하는 파일에 로그를 남길 수 있다. (ex. mylog.out)
nohup java -jar *.jar > mylog.out
* 실시간으로 로그 파일을 모니터링 하려면 tail -f mylog.out 명령어를 사용한다.
2-4. 표준 출력과 에러 출력 분리
- 표준 출력과 에러 출력을 분리하는 이유?
배포를 위해 작성했던 명령들을 스크립트로 작성해 자동화 시키게 되면,
실행 여부에 따라 원하는 로그만 확인하는 것이 편리하다.
표준 출력은 log.out 파일에, 에러 출력은 err.out 파일에 출력을 리다이렉션 한다.
(표준 출력은 1, 에러 출력은 2)
nohup java -jar v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &
2-5. 타임존 변경
EC2 서버는 미국 시간 기준으로 타임존이 설정되어 있다.
미국 시간은 우리나라보다 9시간 늦기 때문에 별도의 설정이 필요하다.
- 타임존 확인하기
timedatectl

- 서울 시간 찾기
timedatectl list-timezones | grep Seoul

- 서울 시간으로 세팅
sudo timedatectl set-timezone Asia/Seoul
변경 후 다시 타임존을 확인해보면 Etc/UTC에서 Asia/Seoul로 변경된 것을 확인할 수 있다.

타임존 변경 후 서버를 재시작 해야한다!
2-6. 스크립트로 종료
자동으로 종료될 수 있게 스크립트를 작성해 보겠다.
- 종료 스크립트 작성
spring-stop.sh에 아래와 같이 스크립트를 작성한다.
echo "Springboot stop"
Spring_PID=$(pgrep -f .jar)
echo $SPRING_PID
kill -9 $SPRING_PID

- 스크립트에 실행 권한 부여
chmod u+x spring-stop.sh

- 스크립트로 프로세스 종료
./spring-stop.sh

3. cron으로 자동 재시작
cron은 시간 기간 잡 스케줄러로, 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케쥴링하기 위해 사용한다.
crontab은 cron 작업을 설정하는 파일로, cron 프로세스가 /etc/crontab 파일에 설정된 내용을 읽어서 작업을 수행한다.
서버가 종료되면 cron을 통해 자동으로 재시작하도록 해보겠다.
- cron 편집하기
crontab -e
- cron.log로 리다이렉션 하는 코드를 스크립트에 추가한다.
* * * * * ls -l 1>>cron.log

cron.log 내부에 로그가 남은 것을 확인할 수 있다.
이제 이 cron을 자동화해 보겠다.
4. cron 자동화
- myScript.sh 파일 생성
crontab -l 1>crontab_new
- 권한 부여
chmod u+x myScript.sh
- 스크립트 실행
./myScript.sh
권한 부여 후 실행하면 다음과 같이 crontab_new 파일이 생긴다.

- myScript 수정
# 크론탭 내용을 crontab_new로 옮긴다.
crontab -l 1>crontab_new
# crontab_new 파일에 echo의 결과를 추가한다.
echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new
# crontab에 crontab_new에 작성한 내용을 반영한다.
crontab crontab_new

- job.sh 생성
ls -l >/home/ubuntu/cron.log
- myScript.sh 실행
1분 기다리면 cron.log가 생긴다.
주기적으로 현재 폴더에 있는 모든 결과가 cron.log 파일에 추가된다.

4-1. 스크립트로 cron 등록
# 크론탭 내용을 crontab_new로 옮긴다.
crontab -l 1>crontab_new
# crontab_new 파일에 echo의 결과를 추가한다.
echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new
# crontab에 crontab_new에 작성한 내용을 반영한다.
crontab crontab_new
# crontab_new 파일을 삭제한다.
rm crontab_new
'Cloud' 카테고리의 다른 글
| [AWS] AWS EC2 기본 배포하기(1) (0) | 2024.08.17 |
|---|