IT/Spring

[안드로이드 앱 서버 만들기] 4. AWS EC2 인스턴스에 배포

김 정 환 2021. 7. 6. 18:11
반응형
게시된 내용은 작성자가 공부한 내용을 정리하여 기록하였습니다. 일부 빠지거나 부족한 부분이 있을 수 있습니다. 최대한 편집 없이 기록하였습니다.

출처 블로그

 

 

사용 도구 : STS 4 (Spring Tools Suite), AWS EC2, MariaDB, Windows


1. Github에 올리기

Github Desktop 애플리케이션을 이용해서 스프링 프로젝트를 Github에 올리겠습니다. 

 

Github 주소와 연동한 후에 Local에서 프로젝트를 가져와서 올려줍니다.

 

올라갔습니다.

 

 

 


2. 인스턴스에 프로젝트 가져오기

 

Putty를 이용해서 ec2 인스턴스에 접속합니다. 접속하는 방법을 잊어버리셨다면, 여기에 있습니다.

 

아래 명령어로 Github의 프로젝트를 가져옵니다. Private 레파지토리를 가져올 경우에는 Github의 계정과 비밀번호를 입력해야 합니다.

git clone [github 주소]

 

아래와 같이 완료됩니다. 프로젝트 이름에 오타가 발생해서 spring이 아니라 sping이되었습니다.

 

 


3. Java 8 설치

프로젝트 생성할 때 자바 8로 설정했습니다. 인스턴스에 무슨 자바가 설치되어 있는지 확인합니다.

 

자바 8 설치가 필요하면 설치해 줍니다.

 

 

 


4. 프로젝트 빌드

아래 명령어로 Gradlew 파일에 권한을 부여합니다.

sudo chmod 777 ./gradlew

 

그러면 ls 명령어를 쳤을 때 파일이 초록색으로 나타납니다.

 

아래 명령어로 빌드합니다.

sudo ./gradlew build

 

 


메모리 문제 발생

오류를 먼저 제거하느라 본인의 오류 이미지를 남기지 못했습니다. 그래서 인터넷에서 비슷한 오류 이미지를 가져왔습니다.

 

아래 명령어로 메모리를 확인하겠습니다.

free -h

아래와 같이 나왔습니다. 

 

2가지 해결책을 찾아보았습니다.

1. JVM 메모리 늘리기

2. swap 공간 활용하기

 

전체 1GB인데 JVM에게 더 이상 늘려주는 것은 소용없어 보였습니다. 그래서 swap partition을 만들어서 사용하기로 했습니다. swap partition은 windows의 가상 메모리와 같은 역할을 합니다. 방법은 여기에 있습니다.

 

해결


 

메모리 문제를 해결하고 빌드하니 성공했습니다.

 

./build/libs 디렉터리 안에 jar 파일이 생성되어 있습니다. 아래 명령어로 실행시킬 수 있습니다. 

Spring에는 톰켓이 내장되어 있어서 빌드된 파일을 실행하면 서버가 가동됩니다.

java -jar [파일명].jar

 


연결 오류 문제

연결이 안되는 경우, EC2의 보안 그룹 설정이 이루어지지 않았을 수도 있습니다. 

 

(캡쳐 해놓은 이미지가 없고 사용했던 인스턴스는 지워서 글로 대신하겠습니다)

-> AWS EC2의 인스턴스로 갑니다.

-> 왼쪽 메뉴 쯤에서 '보안 그룹'을 찾아서 누릅니다.

-> 인바운드를 누르고, 편집을 누릅니다.

-> 아래와 비슷한 화면이 나옵니다. 그러면 '소스'를 EC2 인스턴스의 프라이빗 IP로 지정합니다. 또는, 보안상의 문제가 없거나 여러 위치에서 테스트를 해야할 경우에는 위치 무관(0.0.0.0)으로 지정합니다.

EC2로만 이용을 제한할 경우에는 퍼블릭 IP가 아닌 프라이빗 IP로 지정해야 합니다.

 

이렇게 하면, EC2에서 DB 연결 문제를 해결합니다.

 

해결


 

 

 


5. 프로젝트 접속 테스트

이제 클라이언트에서 EC2(서버)로 접근 테스트를 해보겠습니다.

 

보안 그룹 설정이 필요합니다. 인스턴스의 보안 그룹으로 갑니다. 그리고 포트를 위치 무관으로 해줍니다.

 

 

열렸는지 확인해보겠습니다. EC2의 퍼블릭 IP를 웹 브라우저에 입력하니 아래와 같이 응답합니다.

 

API도 잘 동작합니다.

 

 

 


6. 배포용 코드 작성

Git pull, 실행까지 알아서 해주는 코드를 작성해 보겠습니다. 아래 명령어로 파일을 만듭니다.

sudo vi deploy.sh

 

아래 코드를 작성합니다. 각 부분이 무슨 의미인지는 여기서 확인하실 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
REPOSITORY=Spingboot-JPA-hikariCP-restAPI-CRUD-example # TODO 경로 수정
cd $REPOSITORY
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
sudo ./gradlew build
echo "> Build 파일 복사"
sudo cp ./build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f Spingboot-JPA-hikariCP-restAPI-CRUD-example) # TODO 피드명 수정
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
 
        echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
        echo "> kill -2 $CURRENT_PID"
        kill -9 $CURRENT_PID
        sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'restapi-0.0.1-SNAPSHOT.jar' | tail -1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &
 
cs

 

생성한 파일에 권한을 부여하고 실행합니다.

sudo chmod 775 ./deploy.sh
./deploy.sh

 

실행하고 나면, nohup.out 파일이 생성되어 있습니다.

아래 명령어로 실시간 확인이 가능합니다.

tail -f nohup.out

 

curl 명령어를 이용해서 서버가 정상작동중인지 확인 가능합니다.

curl [ip주소]:3232/member/select

 

 

 


7. 포트 리다이렉트

ip주소:포트 형식을 간단하게 바꿀 수 있습니다. 아래 명령어를 사용합니다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3232

 

그러면 ip주소만 넣어도 됩니다.

리다이렉트 테이블은 아래 명령어로 확인할 수 있습니다.

sudo iptables -t nat -L -–line-numbers

 

삭제하는 방법은 아래 명령어 입니다. 1은 테이블에서 1번을 나타냅니다. 출처입니다.

sudo iptables -t nat -D PREROUTING 1

 

 

 


서버 배포를 완료했습니다.

반응형