AWS EC2 서버에 배포하기

jjunhwan.kim·2022년 1월 31일
0

AWS 사용하기

목록 보기
3/4
post-thumbnail

이 포스팅은 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스" 책을 보고 정리한 내용입니다. 이번 포스팅에서는 이전에 구축한 EC2 서버에 스프링 웹 애플리케이션을 배포해보겠습니다. 깃허브에 스프링 웹 프로젝트가 생성되어있다고 가정하고 진행합니다.

1. EC2에 프로젝트 Clone

  1. EC2에 SSH로 접속해서 깃을 설치한다. 설치가 잘 되었는지 확인한다.
sudo yum install git
git --version
  1. 깃허브에서 받아올 프로젝트를 저장할 디렉토리를 생성한다. 리눅스에서 경로 "~"는 홈 디렉토리를 의미한다. 홈 디렉토리는 루트디렉토리(/) 밑의 home디렉토리 밑의 리눅스 사용자 계정명으로 생성된 디렉토리이다. 아래 명령어는 홈 디렉토리 밑에 app 디렉토리와 app 디렉토리 밑에 step1 디렉토리를 생성한다.
mkdir ~/app && mkdir ~/app/step1
  1. step1 디렉토리로 이동한다. cd 명령어는 change directory를 의미한다.
cd ~/app/step1
  1. 자신의 깃허브 웹 페이지에서 https 주소를 복사하여 git clone을 한다.
git clone 복사한 주소
  1. 클론된 프로젝트로 이동하여 테스트를 수행한다. BUILD SUCCESSFUL 메시지가 뜬다면 테스트가 통과한 것이다.
./gradlew test
  1. 만약 권한이 없다는 메시지가 뜬다면 실행 권한을 추가한다.
chmod +x ./gradlew

2. 배포 스크립트 작성

배포란 작성한 코드를 서버 컴퓨터에 반영하는 것을 말한다. 구체적으로 설명하자면 아래와 같다.

  • git clone 또는 git pull 명령어를 통해 서버에 프로젝트를 받는다.
  • Gradle이나 Maven을 통해 프로젝트를 테스트하고 빌드한다.
  • EC2 서버에 빌드된 결과물을 실행한다.

배포할 때 명령어를 일일히 타이핑하고 실행하는 것은 불편하므로 쉘 스크립트를 작성해 스크립트를 실행하면 자동으로 진행되도록 한다.
쉘 스크립트는 .sh라는 확장자를 가진 파일이다.

  1. step1 디렉토리에 deploy.sh 파일을 생성한다.
vim ~/app/step1/deploy.sh
  1. 아래 스크립트 코드를 작성한다.
#!/bin/bash

# 변수 선언
REPOSITORY=~/app/step1
PROJECT_NAME=todo-app
EXECUTABLE_NAME=todo

# 디렉토리 경로 변경
cd $REPOSITORY/$PROJECT_NAME

# 문자열 출력
echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

# 프로젝트 빌드
./gradlew build

echo "> step1 디렉토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"

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

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

# 명령어 실행결과를 변수에 할당 $()
# todo.*.jar => "."는 하나의 문자 매치, "*"는 0개 이상의 문자 매치
CURRENT_PID=$(pgrep -f ${EXECUTABLE_NAME}.*.jar)

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

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

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

# ls: $REPOSITORY 디렉토리 내용 출력, -tr 옵션은 newest first sorting 결과를 reverse 따라서 최신파일이 나중에 출력
# grep: ls 결과를 받아서 jar가 들어간 행 출력
# tail: grep 결과를 받아서 마지막 행부터 1번째 줄 출력
JAR_NAME=$(ls -tr $REPOSITORY | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

# nohup은 터미널이 끊겨도 실행한 프로세스는 계속 동작하게 함. 실행 중 생기는 메시지를 nohup.out 파일을 만들어 이 파일에 출력
# 2>&1는 표준오류(stderr)를 표준출력(stdout)이 전달되는 곳으로 보냄. 따라서 nohup.out에 표준오류도 같이 씀
# 마지막 &는 명령을 백그라운드 작업으로 실행함
nohup java -jar $REPOSITORY/$JAR_NAME --spring.profiles.active=prod 2>&1 &
  • 변수는 $변수명, ${변수명}으로 참조한다.
  • 변수=$() 는 괄호 안의 명령어 실행결과를 변수에 할당한다.
  • pgrep 명령어는 프로세스 이름으로 pid를 찾는다.
  • ls 명령어는 해당 디렉토리의 내용물을 나열한다.
  • grep 명령어는 문자열, 패턴 등을 찾아준다.
  • tail 마지막 행을 기준으로 지정한 행 까지의 내용을 출력해준다.
  1. 생성한 스크립트에 실행 권한을 추가한다
chmod +x ./deploy.sh
  1. 스크립트를 실행한다.
./deploy.sh
  1. nohup.out 파일을 열어 잘 실행되었는지 로그를 확인한다.
vim nohup.out

3. 스프링 부트 RDS 연동

스프링 부트 프로젝트에서 RDS를 연동하기 위해서 몇 가지 작업을 해야한다.

  • RDS 데이터베이스안에 테이블을 생성해야 한다.
  • 프로젝트에 MariaDB 의존성을 추가한다.
  • EC2 서버 내부에 데이터베이스 접속 정보를 저장한다.

1) RDS 테이블 생성

스프링 웹 애플리케이션 실행시 발생하는 create table 로그를 복사하여 MySQL Workbench로 RDS에 접속하여 테이블을 생성한다.

2) 프로젝트 설정

build.gradle에 MariaDB 의존성을 등록한다.

runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

3) EC2 설정

EC2 서버에 RDS 접속 정보를 담은 application-prod.yml 파일을 생성한다.

spring:
  config:
    activate:
      on-profile: prod

  datasource:
    url: jdbc:mariadb://rds주소/database이름
    driver-class-name: org.mariadb.jdbc.Driver
    username: db계정
    password: db계정 비밀번호

  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        #show_sql: true
        dialect: org.hibernate.dialect.MariaDB103Dialect
        format_sql: true
        default_batch_fetch_size: 100

logging:
  level:
    org.hibernate.SQL: debug
#    org.hibernate.type: trace

지금까지 EC2 서버에 프로젝트를 클론하고 스크립트를 통해 자동으로 빌드 및 실행을 하도록 설정하였다. 다음 포스팅에서는 깃허브에 푸시하면 자동으로 EC2서버에서 빌드와 배포가 되도록 개선한다.

0개의 댓글