
🍎 EC2에 배포하는 방법을 알아보자.
AWS에 접속하여 ec2 카테고리로 접속한다.
우측 상단에 인스턴스 시작을 클릭한다.

배포할 이름을 선택한다.

여러 OS 중 ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server를 사용하였다.

기존 키가 없다면 새 키페어 생성 클릭

키 페어 이름 입력 후 유형에서 RSA 암호화 알고리즘 선택(비대칭키)

프라이빗 키 파일 형식은 잘 알지 못해 공부하면서 퍼왔습니다.

출처 : https://iboxcomein.com/types-and-uses-of-ssh-keys-and-pem-and-ppk-keys/
마지막으로 스토리지 구성은 프리티어에서는 30GB 무료라고 하네요. 30GB 입력하고 하단 인스턴스 시작을 눌러줍니다.

ssh -i /Users/y.j.h/Desktop/study/aws-key/aws-study-key.cer ubuntu@IP주소Before : git clone ~
- sudo apt update(메뉴판 update)
👐 nohup 이란 리눅스의 프로세스를 실행한 터미널의 세션이 종료되어도 지속적으로 동작할 수 있게 해주는 명령어이다.
우리가 눈으로 보이는 프로그램들은 포그라운드 실행이다. 이것을 -nohup으로 실행을 했다고 하더라도 터미널 종료시 함꼐 종료된다.
👏 우리는 백그라운드 모드로 실행하여야 한다.
nohup java -jar *.jar & 뒤에 and키를 붙여주면 된다.🍒 로그 보는법
tail -f nohup.out nohup java -jar *.jar > mylog.out & 하면 로그파일이 mylog.out 파일로 옮겨진다. 똑같이 모니터링 명령어를 쳐서 로그를 확인해보자.nohup java -jar v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &✋🏻 타임존 변경 & 종료스크립트
호스팅한 컴퓨터 시간 보기 : timedatectl
바꿀 수 있는 시간 설정 보기 : timedatectl list-timezones | grep Seoul
=> 너무 많으니 grep으로 찾아본다. timedatectl list-timezones | grep Seoul
찾은 다음 세팅을 해준다. sudo timedatectl set-timezone Asia/Seoul
❗️TIP
ps -ef 로 돌고있는 프로세스를 찾았지만 이렇게 많은 데이터를 찾아서 또 포트번호를 찾고 하는게 번거롭다.ps -ef | grep *.jar | grep -v grep | awk '{print $2}' 이렇게 사용하여도 되지만 너무 길다..pgrep -f ~ 명령어를 사용하면 손쉽게 찾아낼 수 있다. 🍓 간단한 종료스크립트 짜보기
vi Spring-stop.sh 파일 생성echo "Springboot Stop......"
SPRING_PID=$(pgrep -f 찾을파일이름)
echo $SPRING_PID
kill -9 $SPRING_PID
ls -l 로 실행권한 있는지 확인하고 없다면 chmod u+x 파일이름./파일이름. => 실행🍓 cron 주기적 실행
❓ crontab이란?
crontab -e 입력 후 vim 에디터 선택
* * * * * ls -l 1>>cron.log
* * * * * 의 의미❗️> 와 >> 의 차이
> : 덮어씌우기
>> : 추가
🍏 crontab 스크립트 짜보기
vi myScript.shcrontab -l 1>crontab_new :wqcrontab -l 은 기존의 crontab에 있는 내용을 그대로 가져온다.# 크론탭 내용을 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
해석 : 기존의 crontab을 crontab_new로 옮기고
* * * * * /home/ubuntu/job.sh 을 crontab_new 에 추가하고 crontab으로 실행 => 매분 /home/ubuntu/job.sh 을 실행하라는 의미
vi job.sh 파일 편집 후ls -l > /home/ubuntu/cron.log 추가
ls -l > /home/ubuntu/cron.log: 현재 파일에 있는 모든 폴더를 cron.log로 옮겨라 라는 의미 (띄어쓰기 조심)
🍓 cron으로 서버 재시작해보기
mkdir cron-restart 폴더를 하나 만들어 이곳에서 시작해보자.
spring-restart.sh 를 만들어 스프링 서버를 재시작해보자.
SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
SPRING_PATH="/home/ubuntu/aws-study-v1/build/libs/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
nohup java -jar $SPRING_PATH 1>log.out 2>err.out &
else
echo "스프링 시작된 상태..."
fi
👐Shell Script
[ 조건식A -a 조건식B ] : 조건식 A와 B가 모두 TRUE이면 TRUE (&& 와 동일)
[ 조건식A -o 조건식B ] : 조건식 A가 TRUE거나 조건식B가 TRUE면 TRUE (|| 와 동일)
파일관련
[ -d ${A} ] : A 파일이 디렉토리면 TRUE
[ -e ${A} ] : A 파일이(노드, 디렉토리, 소켓 등등 모두) 존재하면 TRUE
[ -L ${A} ] : A 파일이 심볼릭 링크면 TRUE
[ -r ${A} ] : A 파일이 읽기 가능하면 TRUE
[ -s ${A} ] : A 파일의 크기가 0 보다 크면 TRUE
[ -w ${A} ] : A 파일이 쓰기 가능하면 TRUE
[ -x ${A} ] : A 파일이 실행 가능하면 TRUE
[ -c ${A} ] : A 파일이 Special character file 이면 TRUE
[ -f ${A} ] : A 파일이 디렉토리가 아닌 일반 regular 파일이면 TRUE
[ -S ${A} ] : A 파일이 소켓이면 TRUE
[ ${A} -nt ${B} ] : A 파일 B 파일보다 최신파일이면 참
[ ${A} -ot ${B} ] : A 파일이 B 파일보다 이전파일이면 참
[ ${A} -ef ${B} ] : A 파일과 B 파일이 같은 파일이면 참
🍇 배포 프로세스
1.배포 프로세스
echo "deploy start..."
echo "1. JDK install"
echo "2. github project download"
echo "3. gradle 실행권한 주기"
echo "4. project build"
echo "5. ubuntu timezone 세팅하기"
echo "6. nohup 으로 스프링부트 실행시키기"
🍓 재배포 프로세스
1. 기존 서버를 중지시켜야 함
2. aws-v1 폴더를 통쨰로 삭제
``` rm -r /home/ubuntu/aws-v1```
3. git clone 다운
``` git clone```
4. gradlew 실행권한 주기
```cd /home/ubuntu/aws-v1```
``` chmod u+x gradlew```
5. 빌드하기
```./gradlew build```
6.jar 실행
``` nohup java -jar /home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &```
7. cron으로 자동 재시작
```deploy.sh``` 를 만들고
------------------------------
echo "cron apply"
crontab -l > crontab_new
echo "* * * * * /home/ubuntu/cron-restart/spring-restart.sh" 1>>crontab_new
crontab crontab_new
rm crontab_new
❗️ 하나의 배포 스크립트를 만들어두면 좋음
출처: 메타코딩 Devops 강의