본문 바로가기

개발/Programming

[배포] AWS를 통한 배포 방법 알아보기(EC2 서버 실행)

반응형

안녕하세요😎 백엔드 개발자 제임스입니다 :)

저번 포스팅에서 인스턴스를 생성하고 연결까지 해보았습니다. 이전 내용이 궁금하면 아래 링크를 통해 확인해주세요.

https://kang-james.tistory.com/entry/%EB%B0%B0%ED%8F%AC-AWS%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%B0%B0%ED%8F%AC-%EB%B0%A9%EB%B2%95-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1%EA%B3%BC-%EC%97%B0%EA%B2%B0

 

[배포] AWS를 통한 배포 방법 알아보기(인스턴스 생성과 연결)

안녕하세요😎 백엔드 개발자 제임스입니다 :) 이번 포스팅에서는 AWS를 통한 배포하는 방법을 정리하려고 합니다. AWS는 Amazon에서 제공하는 클라우드 서비스입니다. 우리는 다양한 방법으로 애

kang-james.tistory.com

 

오늘은 EC2 인스턴스를 이용하여 서버를 실행하는 방법에 대해서 포스팅 하도록 하겠습니다.


1. 인스턴스에 개발 환경 구축


 

(1) 인스턴스에 연결합니다.

위 그림처럼 EC2 인스턴스에 연결합니다. 성공적으로 연결된다면 검은 터미널창이 열릴 것입니다.
(또는 SSH 클라언트에 적힌 명령어를 통해서 로컬 터미널에서 원격 접속도 가능합니다.)

(2) 패키지 매니저가 관리하는 패키지의 정보를 최신 상태로 업데이트합니다.

sudo apt update

(3) 자바 파일을 실행하기 위한 jdk를 설치합니다.

본인이 사용하는 버전에 맞게 설치하면 됩니다.
sudo apt install openjdk-11-jre-headless

설치가 모두 완료되었다면, 명령어 java -version을 통해서 설치가 잘 되었는지 확인해주세요.

(4) 배포할 프로젝트가 있는 git repository에서 서버 파일을 현재 인스턴스에 clone 한 후, build를 진행합니다.

git clone 시에 SSH 등록이 필요할 수 있습니다.
프로젝트 경로에서 ./gradlew build 명령어를 통해 build를 진행할 수 있습니다.

build 시에 에러 발생 시, 아래와 같이 해결하세요!

에러 내용 : ./gradlew: Permission denied

sudo chmod +x gradlew

위 이미지에서 처럼 gradlew을 통해 build 할 때 접근할 수 없다는 에러가 발생할 수 있습니다. 이럴 때는 권한을 수정하는 명령어인

'sudo chmod +x gradlew' 를 실행합니다. 실행을 했다면, 다시 ./gradlew build 명령어를 실행합니다.


 


2. EC2 인스턴스에서 서버 실행


빌드까지 완료했다면, 해당 경로에 build 폴더가 생긴 것이 보입니다.

(1) 프로젝트 폴더 > build > libs 경로 안에 jar 파일이 생긴 것을 확인합니다.

(2) jar 파일을 실행합니다.

java -jar 프로젝트명-0.0.1-SNAPSHOT.jar

정상적으로 실행된 것이 보입니다. 이제 터미널을 끄지 않은 채, EC2 IP 주소를 이용하여 접속 테스트를 진행하겠습니다.

(3) IPv4 주소 또는 DNS와 포트를 통해서 접급합니다.

http://ec2-54-180-147-234.ap-northeast-2.compute.amazonaws.com:9050

하지만 아래와 같은 오류 메시지가 보일 것입니다. 그 이유는 아직 설정을 다한 것이 아니기 때문입니다.


3. 보안 그룹 설정하기


(1) 인스턴스가 속한 보안 그룹 확인하기

인스턴스 조회 창에서 우측으로 스크롤을 이동하면 <보안 그룹 이름> 칸이 보입니다. 해당 부분에서 인스턴스가 속한 보안 그룹을 확인할 수 있습니다. 

(2) EC2 > 네트워크 및 보안 > 보안 그룹으로 이동합니다.

앞에서 확인했던 보안 그룹을 클릭하고, 인바운드 규칙으로 들어갑니다.

(3) 인바운드 규칙 편집 버튼을 누릅니다.

(4) 규칙 추가 버튼을 누른 뒤, HTTP 유형을 추가하고 아래와 같이 설정해줍니다.

위 사진은 소스를 Anywhere IPv4로 선택한 상태입니다. 이렇게 해준 이유는 모든 IP에 대해서 접속할 수 있도록 허용하기 위함입니다.

(5) 다시 인스턴스 주소를 접속합니다.

이제 서버가 제대로 실행된 것을 확인할 수 있습니다. 


3. background 상태에서 서버 애플리케이션 실행하기


이제 EC2를 통해서 Spring Boot 서버를 실행하는 법을 알았습니다. 하지만 문제가 있습니다. 인스턴스의 터미널을 종료하면 서버도 같이 종료된 다는 것입니다. 즉, 터미널 창을 항상 켜 둬야 하는 상황이 발생한 것입니다.

이럴 경우에는 어떻게 해야 할까요?

foreground에서 실행되는 애플리케이션을 background에서도 실행이 가능하게 하기 위해서는 실행 스크립트를 만들 수 있습니다.

이때 사용하는 것이 Shell Script인데요. 셀 스크립트는 셀이나 명령 중 인터프리터에서 돌아가도록 작성된 스크립트입니다. 즉, 운영체제를 위한 스크립트입니다.

> Spring Boot 백 그라운드 실행

(1) EC2 인스턴스 터미널에서 프로젝트의 build 폴더가 있는 경로로 이동합니다.

(2) .sh 라는 파일 형태를 만들고, 파일 내부로 들어갑니다.

nano restart.sh

nano 명령어를 통해서 restart.sh 파일을 만들고, 내부로 들어갑니다.

(3) 아래 코드 내용을 작성합니다.

코드에서 {프로젝트명} 부분은 본인 프로젝트 명으로 수정해줘야 합니다.
#!/bin/bash

ps -ef | grep "{프로젝트명}-0.0.1-SNAPSHOT.jar" | grep -v grep | awk '{print $2}' | xargs kill -9 2> /dev/null

if [ $? -eq 0 ];then
    echo "my-application Stop Success"
else
    echo "my-application Not Running"
fi

echo "my-application Restart!"
echo $1
nohup java -jar build/libs/{프로젝트명}-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev > /dev/null 2>&1 &
작성을 완료했으면, 단축키 ctrl + X -> y -> Enter 순서대로 눌러서 파일을 저장합니다.

(4) 아래 명령어를 통해 restart.sh 파일에 실행 권한을 합니다.

sudo chmod 755 restart.sh

(5) 아래 명령어를 통해 파일을 실행합니다.

./restart.sh

 

이제 EC2 터미널을 종료해도 서버가 동작하는 것을 볼 수 있습니다.

반응형