AWS EC2 배포(기본)

윤주훈·2023년 11월 30일

AWS

목록 보기
1/2


🍎 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 ~

  1. Java JDK ubuntu에 설치
    • sudo apt update(메뉴판 update)
  • sudo apt install openjdk-11-jdk
  1. gradlew 에 권한주기
  • chmod u+x gradlew
  1. gradlew 로 프로젝트를 jar 파일로 변경
  • ./gradlew build
  1. nohup으로 jar 파일 실행
  • 👐 nohup 이란 리눅스의 프로세스를 실행한 터미널의 세션이 종료되어도 지속적으로 동작할 수 있게 해주는 명령어이다.

  • 우리가 눈으로 보이는 프로그램들은 포그라운드 실행이다. 이것을 -nohup으로 실행을 했다고 하더라도 터미널 종료시 함꼐 종료된다.

👏 우리는 백그라운드 모드로 실행하여야 한다.

  • 백그라운드 모드 실행법 :
    ex) nohup java -jar *.jar & 뒤에 and키를 붙여주면 된다.

🍒 로그 보는법

  • nohup에서 로그를 볼 수 있는 nohup.out 파일에 로그를 출력해준다.
  • 모니터링 명령어 ex) : 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 로 돌고있는 프로세스를 찾았지만 이렇게 많은 데이터를 찾아서 또 포트번호를 찾고 하는게 번거롭다.
    ex) ps -ef | grep *.jar | grep -v grep | awk '{print $2}' 이렇게 사용하여도 되지만 너무 길다..
    👐 이럴때에는 pgrep -f ~ 명령어를 사용하면 손쉽게 찾아낼 수 있다.

🍓 간단한 종료스크립트 짜보기

  • vi Spring-stop.sh 파일 생성
  • Insert모드로 변환 후
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

  • * * * * * 의 의미
  • 앞의 * 부터 분(0~59) , 시(0~23), 일(1~31), 월(1~12), 요일(0~7)

❗️> 와 >> 의 차이
> : 덮어씌우기
>> : 추가

🍏 crontab 스크립트 짜보기

  • vi myScript.sh
  • insert 모드로 crontab -l 1>crontab_new :wq
  • crontab -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

  • if절에 대해서 정리해보자.
    비교식
    [ -z ${A} ] : A 문자열의 길이가 0이면 TRUE
    [ -n ${A} ] : A 문자열의 길이가 0이 아니면 TRUE
    [ ${A} -eq ${B} ] : A와 B값이 같으면 TRUE
    [ ${A} -ne ${B} ] : A와 B값이 다르면 TRUE
    [ ${A} -gt ${B} ] : A가 B보다 크면 TRUE
    [ ${A} -ge ${B} ] : A가 B보다 크거나 같으면 TRUE
    [ ${A} -lt ${B} ] : A가 B보다 작으면 TRUE
    [ ${A} -le ${B} ] : A가 B보다 작거나 같으면 TRUE

[ 조건식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. 스프링 서버 종료 시 재시작
    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

🍓 재배포 프로세스

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 강의

profile
Dont regret it will be your future

0개의 댓글