aws 배포 - 백그라운드, 로그, cron

최준호·2024년 4월 29일
0

배포 구성

  • 배포를 하는 방법을 구조를 만들어본 것입니다.
    로컬 컴퓨터에서 제작한 프로젝트를 github에 등록하고ㅡ 운영서버인 EC2에서 프로젝트를 다운하여, 서버에 받아 배포단계를 거처 운영하는 겁니다.

배포 순서

aws 배포용 인스턴스 생성

  • OS - ubuntu 20.04
  • 인스턴스 유형 - t2.micro
  • 키 페어 - aws_dist_v1
  • 네트워크 설정 - 보안 구성 설정 - 8080포트 방화벽 해제
  • 나머지 설정은 기본으로 둡니다.

유동 IP

  • 만약에, 5개 가구에서 인터넷을 사용하고 있다면, SK에서는 3~4개의 IP만 준비하고, IP를 안쓰는 타이밍에 서로 바꿔가면서 계속 IP 변경시키면서 인터넷이 가능하도록 합니다. 배포를 하는 입장에선 IP가 바뀌면, 원래 있던 IP로 접속이 안되기 때문에 고정시키는 것이 필수입니다.

aws 고정 IP 설정 (엘라스틱 IP 설정)

  • EC2 인스턴스 - 좌측 메뉴 - 네트워크 및 보안 - 탄력적 IP (고정 아이피) 클릭

탄력적 IP 주소 할당 - 할당

  • 작업 메뉴 - 탄력적 IP 주소 연결

  • 인스턴스 - 배포할 컴퓨터
  • 프라이빗 IP 주소 - 배포할 컴퓨터 프라이빗 IP

  • 배포할 EC2를 확인해보면 IP가 변경된 것을 확인 할 수 있습니다.

  • 고정 IP로 접속이 되는걸 확인 할 수 있습니다.

자바 다운

sudo apt update
// apt 메뉴리스트 업데이트

sudo apt-cache search jdk | grep jdk | grep openjdk-11
// jdk 11 버전 리스트 찾기

sudo apt install openjdk-11-jdk
// apt 리스트에서 jdk 11 다운

git 연결

  • git이 다운이 되어 있는 지 확인하고, 현재 계정의 폴더에 깃 정보를 받아올 예정입니다.

git clone (주소)
// 프로젝트 다운

  • git으로 다운받은 폴더에 들어가면 gradle로 되어있고, gradlew을 실행시켜 프로젝트를 jar파일로 변경시킬 수 있습니다. = 빌드

  • gradlew 권한을 보면, 실행권한이 없는걸 확인 할 수 있는데, 실행권한을 ubuntu에게 부여합니다.

chmod u+x gradlew
// 실행 권한 유저에게 부여

./gradlew build
// gradlew는 환경변수가 아니기 때문에, 
// ./gradlew 현재폴더내에 있는 걸 선택하여 빌드

  • build 후에, build/libs 폴더 내에 jar 파일이 생성되어있는걸 확인 할 수 있다. 이게 실행파일입니다.

java -jar v1-0.0.1-SNAPSHOT.jar
// 실행 명령어

  • 배포가 잘 된걸 확인할 수 있습니다.

gradle tip

  • spring 프레임워크에 build.gradle 설정에
    jar 파일을 하나만 생성시켜주는 설정입니다.

nohup?

  • 리눅스에서 프로세스를 실행한 터미널의 세션이 끊어지더라도 지속저으로 동작할 수 있게 해주는 명령어입니다.

nohup 백그라운드 배포 실행

  • 실행중인 스크립트를 빠져나오면 배포가 중단되는 걸 알 수 있다, 따라서 백그라운드에 실행시켜야 배포를 계속 진행할 수 있습니다.

  • nohup 버전 확인
  • nohup이 없다면 apt에서 다운.

nohup java -jar v1-0.0.1-SNAPSHOT.jar
// 포그라운드 실행 - nohup 실행하여도 터미널 종료시 함께 종료

nohup java -jar v1-0.0.1-SNAPSHOT.jar &
// 백그라운드에서 실행
  • 백그라운드 실행하면 터미널에서 log가 보이지는 않습니다.

  • log는 nohup.out에 저장됩니다.

  • tail -f (파일) 로 실시간으로 볼 수 있습니다.

  • nohup.out이 아니라 임의로 만든 파일에 로그를 넣도록 하겠습니다.

nohup java -jar v1-0.0.1-SNAPSHOT.jar > mylog.out & 
  • 이 방식으로 하면 mylog.out파일이 만들어지면서 로그가 저 파일로 들어가게 됩니다.

  • 에러 로그와 표준 출력 로그를 나눠주는 것이 훨씬 운영에 유리합니다.

nohup java -jar v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &
// 1은 표준 출력
// 2는 에러 출력

ubuntu 시간 변경

timedatectl
  • 현재 timedate확인하는 명령어입니다.

timedatectl list-timezones | grep Seoul
// 바꿀 수 있는 시간에서 서울 찾기
sudo timedatectl set-timezone Asia/Seoul
// 시간을 서울로 변경

종료 스크립트 생성

pgrep -f v1-0.0.1-SNAPSHOT.jar
//현재 실행한 jar 파일의 pid를 가져옵니다.
  • 현재 실행중인 프로세스의 pid를 가져오는 명령어입니다.
vi spring-stop.sh
// spring-stop.sh 파일 생성

chmod u+x spring-stop.sh
// spring-stop.sh 파일의 실행권한을 부여합니다.

---
echo "Springboot Stop..."
SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
echo SPRING_PID
kill -9 $SPRING_PID
---
// 프로세스 종료 스크립트

  • 스크립트가 잘 실행되는 것을 확인할 수 있습니다.

cron 주기적 실행 명령어

crontab -e
// 크론 탭 설정 화면이 뜹니다.
// 처음 명령어를 입력하면, vi 에디터를 사용하도록 합니다.

  • (* * * * *)의 의미는 분, 시간, 일, 월, 요일을 의미합니다.

  • 위 명령어의 의미는 모든 요일, 월, 일, 시간의 매분에 ls -l 1>>cron.log를 실행한다는 의미입니다.

  • 여기 >>의 의미는 파일에 append 하는걸 의미합니다.

  • 계속 실행하는 걸 확인하였습니다.

vi myScript.sh
vi job.sh
chmod u+x myScript
chmod u+x job.sh

--- myScript.sh

crontab -l 1>crontab_new
// crontab의 내용을 crontab_new 파일을 생성하여 붙입니다.

echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new
// crontab_new 파일에 출력한 내용을 붙여줍니다.

crontab crontab_new
// crontab_new 크론을 실행해줍니다.

--- job.sh
ls -l > /home/ubuntu/cron.log
// /home/ubuntu/cron.log 파일을 생성하여 ls -l 로그를 값을 넣어줍니다.

  • 결과가 출력되는 걸 확인할 수 있습니다.

스프링 실행 확인 스크립트

  • 스크립트 if 문 조건
SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
SPRING_PATH="/home/ubuntu/aws-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/spring-restart.log
        nohup java -jar $SPRING_PATH 1>/home/ubuntu/log.out 2>/home/ubuntu/err.out &
else
        echo "스프링 실행된   상태"
        kill -9 $SPRING_PID
        echo "스프링 종료"
fi
  • spring-restart.sh 파일 생성
  • chmod 실행파일로 변경
  • 실행중일 경우 프로세스 종료
  • 실행중이 아닐경우 스프링부트 실행
profile
변화를 두려워하는 사람이 가장 불행한 사람이다.

0개의 댓글