AWS EC2에 jar파일 배포하기

kmb·2023년 5월 16일
0

AWS

목록 보기
1/2
post-thumbnail

1. AWS EC2 인스턴스 생성 (프로젝트 배포용도, MySQL 설치용도 따로)

(OS : Ubuntu 20.04LTS , 인스턴스유형 : t2.micro)

2. EC2 -> 보안그룹 -> 인바운드 규칙 편집

에 들어가서 사용자 지정 TCP의 포트범위 8080 및 0.0.0.0/0 으로 설정하여 규칙을 저장한다.
이는 IPv4의 모든 아이피를 대상으로 8080포트의 접근을 허용한다는 의미다.
(MySQL 인스턴스는 포트범위 3306 및 0.0.0.0/0 으로 설정)

3. MobaXterm(SSH 원격접속 프로그램)

을 통해서 Specify username은 ubuntu로 입력하고
Remote host 주소에 AWS EC2에서 생성한 인스턴스의 퍼블릭 IPv4 주소를 입력하고
Use private key에 키페어로 생성한 pem 파일을 입력하고 접속한다.


수동으로 실행

 
1. 한국시간으로 타임존 변경

sudo rm /etc/localtime

sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# 타임존 변경확인
date

 
2. swap 메모리 할당 (EC2 프리티어는 AWS가 권장하는 swap공간으로 RAM 1GB → 2GB)

# dd 명령어로 swap 메모리를 할당
# 조금 기다려야 함
sudo dd if=/dev/zero of=/swapfile bs=128M count=32

# swap 파일의 읽기/쓰기 권한을 업데이트
sudo chmod 600 /swapfile

# Linux swap 영역을 설정
sudo mkswap /swapfile

# swap 공간에 파일을 추가하여 swap 파일을 즉시 사용
sudo swapon /swapfile

# 본 과정이 성공적으로 진행되었는지 확인
sudo swapon -s
# /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 활성화
sudo vi /etc/fstab

# 파일 끝에 다음 줄을 새로 추가
/swapfile swap swap defaults 0 0

free

 
3. EC2 인스턴스내 MySQL 설치하기 (MobaXterm에서 MySQL 설치용도로 만든 EC2 인스턴스에 접속해서 진행)

sudo apt-get update

sudo apt-get install mariadb-server

sudo systemctl status mariadb
sudo mysql -u root # MySQL에 처음접근하면 비밀번호가 없다.
# mysql) 들어와서 계정 생성 및 비밀번호 설정
mysql> CREATE USER 'kmb'@'%' IDENTIFIED BY '1234';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'kmb'@'%';

exit
mysql -u kmb -p # 만든 계정으로 접속한다음
mysql> CREATE DATABASE {DB이름};  # DB 생성  ex) CREATE DATABASE coupon;
mysql> SHOW DATABASES;
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf # 해당 경로로 가서 // bind-address 주석처리

sudo systemctl restart mysql

 
4. EC2 인스턴스내 gradle 빌드하기 (MobaXterm에서 프로젝트 배포용도로 만든 EC2 인스턴스에 접속해서 진행)

$ sudo apt update
$ sudo apt install openjdk-11-jdk

$ java -version

$ ## sudo apt-get install git ## ubuntu는 이미 git이 깔려있음.

$ git clone {깃헙에서 자신이 만든 레파지토리주소}  # git clone https://github.com/minbo2002/spring-project-challenge-study.git

$ chmod +x gradlew

$ ./gradlew clean build  # 만약 .gradlew clean build 할때 test코드 제외하려면  --> .gradlew clean build -x test

# 방법1) jar 실행
$ java -jar build/libs/deploystudy-0.0.1-SNAPSHOT.jar

# 방법2) nohup 백그라운드로 jar 실행 (ssh프로그램 세션을 닫아도 프로세스가 안끊어짐)
$ cd build/libs
$ nohup java -jar deploystudy-0.0.1-SNAPSHOT.jar 2>&1 &
# 2>&1: 표준 에러 출력 스트림(2)을 표준 출력 스트림(1)으로 리디렉션
# &: 프로세스를 백그라운드에서 실행
# nohup.out : 에러와 출력 메시지를 모두 nohup.out 로그 파일로 저장

# 파일 실시간으로 끝 내용을 봄
$ tail -f nohup.out

 
이후에 웹에서 배포된것을 확인하기 위해
퍼블릭 IPv4주소:8080/api/coupon 를 입력해보면

더미데이터 결과가 조회되는것을 확인할 수 있다.


쉘스크립트로 실행

 
먼저 수동으로 8080포트에서 실행중인 프로세스를 죽인다.
만약 netstat 명령어가 실행되지 않는다면 먼저 netstat tool을 설치

sudo apt-get install net-tools  # Ubuntu 20.04 에서는 자주 쓰는 툴인 netstat 설치
$ netstat -nlpt  #현재 사용되고 있는 포트번호의 정보를 확인

8080포트를 사용중인 프로세스의 PID가 17075임을 확인.
kill 명령어를 사용하여 실행중인 프로세스를 죽인다.

kill -9 17075  #kill -9 {PID번호}

 
이후에 아래의 명령어를 입력한다.

touch deploy.sh #deploy.sh 파일생성

vim deploy.sh #deploy.sh 파일내부로 일반모드로 진입

 
deploy.sh

# 전체 진행과정
# 1) i키를 누른다음 입력 모드로 진입
# 2) 아래의 코드작성 
# 3) esc키 눌러서 입력 모드에서 일반 모드로 빠져나온다
# 4) :wq 입력하고 빠져나간다. :wq! 로 강제로 빠져나갈 수 있다.

# ':' 명령 모드로 진입 
# 'w' 저장(save) 명령
# 'q' 종료(quit) 명령
# '!' 변경 사항이 있더라도 묻지 않고 강제로 종료

#!/bin/bash
# 1
REPOSITORY=/home/ubuntu
PROJECT_NAME={본인의 깃 레포지토리 프로젝트 이름}


# 2
cd $REPOSITORY/$PROJECT_NAME/ 
# 만약 본인 깃 레포지토리가 폴더 형태로 여러개의 프로젝트로 관리하고 있다면 뒤에 폴더명 추가
# ex) cd $REPOSITORY/$PROJECT_NAME/1주차

# 3
echo "> Git Pull"
git pull origin main


# 4
echo "> 프로젝트 Build 시작"
./gradlew clean build


# 5
echo "> git 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"

cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
# 만약 본인 깃 레포지토리가 폴더 형태로 여러개의 프로젝트로 관리하고 있다면 
# $PROJECT_NAME과 build 사이에 폴더명 추가
# ex) cp $REPOSITORY/$PROJECT_NAME/1주차/build/libs/*.jar $REPOSITORY/

# 6
echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"


# 7
if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi

echo "> 새 애플리케이션 배포"


# 8
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"


# 9
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

이후에

$ chmod +x deploy.sh  #deploy.sh 파일 실행권한 부여

$ ./deploy.sh  #deploy.sh 파일 실행

 
웹에서 배포된것을 확인하기 위해
퍼블릭 IPv4주소:8080/api/coupon 를 입력해보면

더미데이터 결과가 조회되는것을 확인할 수 있다.

 

출처

profile
꾸준하게

0개의 댓글