AWS EC2에 SpringBoot jar파일 배포하기(+ shell script 실행)

devdo·2022년 2월 2일
0

AWS

목록 보기
3/6
post-thumbnail

AWS EC2 서버 실행하기

AWS EC2 서비스를 통해서 인스턴스에 하나 만든다.
(프리티어 micro size, Ubuntu 20.04LTS 선택)

여기서 보안그룹에 들어가서
네트워크 인바운드 규칙을 추가시켜준다!

인바운드 규칙 편집을 클릭하고 HTTP 80포트와 사용자지정 8080포트를 넣어준다. 0.0.0.0/0은 IPv4버전의 모든 아이피를 대상으로 허용한다는 말이다.

MobaXterm(SSH 원격접속 프로그램)을 통해서 pem키를 등록하여 EC2 인스턴스에 들어간다.

keygen, 파일전송 프로그램 다 들어가 있고 여러모로 putty보다 훨씬 나은 프로그램이다.

여기 빨간 사각형 안에 ssh-key로 만든 pem파일을 넣어주면 들어가 진다!

ec2 우분트 인스턴스라면, login as :ubuntu로 들어가 주면 된다.

$ login as : ubuntu


수동 실행

수동으로 칠 명령어는 다음과 같다.

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

$ java -version

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

$ git clone https://github.com/mooh2jj/cpu-bound-application-1.git

$ cd cpu-bound-application-1/

$ ./mvnw clean package

빌드도구는 mavengradle이 있다.

빌드 명령어./mvnw clean package 하면 처음에는 권한부여 거절이 돼서 안될 것이다. 빌드를 해주는 mvnw파일에 실행권한부여를 해줘야 한다. 리눅스에서 실행권한을 편집하는 명령어 chmod 사용하면 된다.

$ chmod +x mvnw
## x(executable) 유저(user)에게 실행권한을 부여한다는 뜻 
$ ./mvnw clean package

다시 해보면 성공! target 폴더가 생성되고 여기에 jar 파일이 생겼을 것이다.

# 항시 jar를 실행할시 그 폴더위치에서 명령어를 친다.
$ cd target
$ java -jar cpu-0.0.1-SNAPSHOT.jar

실습할 환경은 gradle이므로 다음 명령어로 실행해야 한다!

## gradle도 마찬가지
$ chmod +x gradlew
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar cpu-0.0.1-SNAPSHOT.jar 2>&1 &
## 파일 실시간으로 끝 내용을 봄
$ tail -f nohup.out

✳️ 참고

nohup : 일반적인 리눅스 프로세스는 SSH 세션이 종료될 경우 백그라운드 여부와 관계 없이 종료된다. nohup을 사용하면 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어

  • 2>&1: 표준 에러 출력 스트림(2)을 표준 출력 스트림(1)으로 리디렉션
  • &: 프로세스를 백그라운드에서 실행
  • nohup.out : 에러와 출력 메시지를 모두 nohup.out 로그 파일로 저장

jar 파일이 EC2 인스턴스에 배포된 것을 터미널에서 확인한 후,
이제 실제 웹에서도 배포되었는지 확인하기 위해 웹을 킨다.

[퍼블릭 IPv4 주소]:8080/hello

  • 결과 : 성공적으로 뜨는 것을 확인 할 수 있다.

  • 프로세스 죽이기
# 어플리케이션 프로세스 죽이기
$ ps -ef | grep "8080"

$ kill -9 {pid}

shell script 로 실행하기

위 과정들의 절차를 한번에 파일로 실행할 수 있는 게 shell script 파일이다. vi 편집기로 만들어주면 된다.

shell script 문법 참고 블로그 : https://probe29.tistory.com/47

  • 간단한 예시 샘플

hello.sh

#!/bin/bash                   
# 쉘 스크립트의 시작

# echo 함수 사용 
echo "Hello Bash!"            

deploy.sh

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


# 2
cd $REPOSITORY/$PROJECT_NAME/

# 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/


# 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 &

$ sudo chmod +x deploy.sh

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

💥 주의사항
/bin/sh^M: bad interpreter: No such file or directory 오류 발생 시
이것은 윈도우에서 스크립트 파일을 만든 뒤, linux 에서 실행했기 때문에 나타나는 오류이다.
정확히는 줄 끝 (줄바꿈)을 의미하는 개행문자가 달라서 발생하는 문제인데 이것의 해결을 위해서는 다음의 방법 중 한 가지로 처리한다.

vi -b deploy.sh

vi 의 바이너리 모드로 들어가면 ^M 이라는 문자가 보인다. 이것을 지워주면 된다.



출처

profile
배운 것을 기록합니다.

0개의 댓글