AWS EC2 인스턴스에 서버 배포

2023. 4. 16. 12:16Cloud

1. EC2 인스턴스 생성

1.1 아마존 계정에 접속하여 서비스 -> EC2 -> 인스턴스 시작을 클릭합니다.

1.2 인스턴스를 생성하기 위해 필요한 정보를 작성하고 선택합니다.

키 페어를 사용하여 SSL로 로컬 환경에서 원격 접속할 수 있습니다. 키 페어가 없는 경우 새 키 페어 생성 링크를 클릭하여 다음과 같이 생성합니다.

Linux, Mac OS 같은 경우 *.pem 확장자를 가진 키 페어 파일을 이용하여 SSL 접속을 할 수 있고 윈도우 같은 경우 putty를 사용하는 경우 *.ppk 확장자를 선택하면 됩니다. 단, 윈도우에서 git bash를 사용한다면 ppk가 아닌 pem 확장자 키 페어 파일을 이용하여 접속할 수 있습니다.

2. EC2 인스턴스에 설정된 보안 그룹의 인바운드 규칙 설정

기본적으로 생성된 보안 그룹에는 SSL 접속을 위한 22 포트번호밖에 열려 있지 않습니다. 서버 배포를 위해서 HTTP 80, 8080 포트를 설정해야 합니다.

2.1 서비스 -> EC2 -> 네트워크 및 보안 -> 보안그룹 클릭합니다.

2.2 보안 그룹에 들어가면 인스턴스 생성시 만든 보안 그룹이 있습니다. 보안 그룹 ID를 클릭하여 상세 설정에 들어갑니다.

2.3 보안 그룹에 대한 인바운드 규칙 편집을 다음과 같이 설정하고 규칙 저장합니다.

3. EC2 인스턴스에 연결

3.1 be-java-cafe-max 인스턴스를 선택하고 상단에 연결을 클릭합니다.

3.2 연결 메뉴 중 EC2 인스턴스 연결 탭 선택 -> 연결을 클릭하여 인스턴스에 접속합니다.

인스턴스에 연결하면 다음과 같은 콘솔창이 뜨면 성공입니다.

3.3 git & jdk 설치

Github에서 프로젝트를 clone하기 위해서 git을 설치합니다.

/home/ec2-user $ sudo yum install git

스프링 부트 프로젝트를 실행하기 위하여 open-jdk를 설치합니다. 우선 설치전에 설치할 수 있는 open-jdk가 무엇이 있는지 확인합니다.

/home/ec2-user $ sudo yum list java*
java-1.8.0-amazon-corretto.x86_64                                          1:1.8.0_362.b08-1.amzn2023                                                   amazonlinux
java-1.8.0-amazon-corretto-devel.x86_64                                    1:1.8.0_362.b08-1.amzn2023                                                   amazonlinux
java-11-amazon-corretto.x86_64                                             1:11.0.18+10-1.amzn2023                                                      amazonlinux
java-11-amazon-corretto-devel.x86_64                                       1:11.0.18+10-1.amzn2023                                                      amazonlinux
java-11-amazon-corretto-headless.x86_64                                    1:11.0.18+10-1.amzn2023                                                      amazonlinux
java-11-amazon-corretto-javadoc.x86_64                                     1:11.0.18+10-1.amzn2023                                                      amazonlinux

저는 자바 11 버전을 설치하겠습니다.

/home/ec2-user $ sudo yum install java-11
/home/ec2-user $ java -version
openjdk version "11.0.18" 2023-01-17 LTS
OpenJDK Runtime Environment Corretto-11.0.18.10.1 (build 11.0.18+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.18.10.1 (build 11.0.18+10-LTS, mixed mode)

4. Github에서 프로젝트를 clone하여 서버 실행하기

4.0 디렉토리를 생성합니다.

/home/ec2-user $ mkdir app
/home/ec2-user $ cd app

4.1 Github 프로젝트에서 프로젝트 clone합니다.

/home/ec2-user/app $ git clone -b step4 https://github.com/yonghwankim-dev/be-java-cafe-max.git
  • git clone -b {브랜치명} : 특정 브랜치를 클론하여 가져옵니다.

4.2 be-java-cafe-max 프로젝트 디렉토리로 이동후 빌드합니다.

/home/ec2-user/app $ cd be-java-cafe-max
/home/ec2-user/app/be-java-cafe-max $ ./gradlew build
/home/ec2-user/app/be-java-cafe-max $ java -jar ./build/libs/cafe-0.0.1-SNAPSHOT.jar

4.3 인스턴스의 주소를 확인하고 브라우저를 통해서 접속을 테스트합니다.

위 그림과 같이 제 실행중인 인스턴스의 퍼블릭한 Ip 주소는 3.34.129.8입니다. 이 주소는 고정되어 있지 않고 동적으로 할당된 주소입니다. 따라서 인스턴스가 중지되고 다시 실행되면 주소가 변할 수 있습니다.

 

5. 서버 배포 스크립트 작성하고 실행하기

5.1 배포과정은 무엇인가

배포는 다음의 과정을 모두 포괄하는 것을 의미합니다.

  1. git clone 혹은 git pull을 통해 새 버전의 프로젝트를 받음
  2. Gradle이나 Maven을 통해 프로젝트 테스트와 빌드
  3. EC2 서버에서 해당 프로젝트 실행 및 재실행

5.2 배포 스크립트 필요한 이유

배포 과정을 수행하기 위해 위에 3개의 과정을 실행하기 위해 여러 단계의 명령어들을 실행하는 것은 불편함이 많습니다. 따라서 쉘 스크립트로 작성해서 스크립트에 작성된 명령어들을 차례대로 진행되도록 합니다.

 

5.3 EC2 인스턴스에서 프로젝트 가져오기

/home/ec2-user $ mkdir app
/home/ec2-user $ cd app
/home/ec2-user/app $ git clone -b step3 https://github.com/yonghwankim-dev/be-java-cafe-max.git
/home/ec2-user/app $ cd be-java-cafe-max
/home/ec2-user/app/be-java-cafe-max $  

 

5.4 배포 스크립트 작성

 

5.4.1 배포 스크립트를 작성할 파일 생성

/home/ec2-user/app/be-java-cafe-max $ vi deploy.sh

 

5.4.2 deploy.sh 파일에 다음과 같이 배포 스크립트를 작성합니다.

#!/bin/bash
#1
REPOSITORY=/home/ec2-user/app
PROJECT_NAME=be-java-cafe-max

#2
cd $REPOSITORY/$PROJECT_NAME/

#3
echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

#4
./gradlew build

echo "$REPOSITORY 디록토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"

#5
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

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

#6
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 &
  • #1 : 프로젝트 저장 위치(REPOSITORY) 및 프로젝트 이름(PROJECT_NAME)을 저장합니다.
  • #2 : 프로젝트 디렉토리로 이동합니다.
  • #3 : 원격 저장소로부터 pull 받습니다.
  • #4 : 프로젝트를 빌드합니다.
  • #5 : jar파일을 REPOSITORY 변수에 해당하는 위치에 복사합니다.
  • #6 : 현재 구동중인 애플리케이션 pid를 출력합니다.
  • #7 : 조건문에서 애플리케이션의 프로세스 ID가 비어있는지(-z) 확인합니다. 비어있지 않으면 프로세스를 제거합니다. 제거하는 이유는 애플리케이션 실행전에 실행된 애플리케이션이 있다면 종료하기 위해서입니다.
  • #8 : JAR 파일의 이름을 저장합니다.
  • #9 : 애플리케이션을 백그라운드로 실행하고 터미널 세션 연결이 끊겨도 계속 실행됩니다. 에러 출력도 표준 출력으로 리다이렉션합니다. 스프링 부트는 내장 톰캣을 갖고 있어서 바로 서버를 실행할 수 있습니다.
  • ls -tr
    • '-t' : 파일 및 디렉토리를 수정 시간(최근 수정 시간) 순선대로 정렬합니다.
    • '-r' : 역순으로 정렬합니다.
      • 파일들을 가장 최근에 수정된 파일 및 디렉토리가 마지막에 출력됩니다.
    • tail : 파일의 끝 부분을 출력하는데 사용됩니다.
      • '-n 1' : 파일의 끝에서부터 1줄을 출력합니다.

5.4.3 배포 스크립트 권한 추가

/home/ec2-user/app/be-java-cafe-max $ chmod +x ./deploy.sh

 

5.4.4 배포 스크립트 실행

/home/ec2-user/app/be-java-cafe-max $ ./deploy.sh

 

References

https://bcp0109.tistory.com/356 https://mandu-dev.blog/2023/04/08/aws.html 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%B0EC2-%EC%84%9C%EB%B2%84-%EC%8B%A4%ED%96%89

'Cloud' 카테고리의 다른 글

Travis CI 배포 자동화  (0) 2023.05.14