spring

springboot & AWS - EC2 배포

Jan 08, 2020

EC2 서버에 프로젝트를 배포해 보자

목차

1. EC2에 프로젝트 배포
1.1 EC2에 프로젝트 Clone 받기
1.2 배포 스크립트 만들기
1.3 외부 Security 파일 등록하기
1.4 스프링 부트 프로젝트로 RDS 접근하기
1.5 EC2에서 소셜 로그인 하기

1. EC2에 프로젝트 배포

스프링부트로 서비스 코드를 개발했고, 배포 환경을 구성했으니 이들을 조합해 실제로 서비스를 한 번 배포하겠다.

1.1 EC2에 프로젝트 Clone 받기

1.2 배포 스크립트 만들기

배포는 작성한 코드를 실제 서버에 반영하는 것을 말한다. 여기서는 - git clone 혹은 git pull을 통해 새 버전의 프로젝트 받음 - Gradle이나 Maven을 통해 프로젝트 테스트와 빌드 - EC2 서버에서 해당 프로젝트 실행 및 재실행

배포할 때마다 개발자가 하나하나 명령어를 실행하는 것은 불편하므로 이를 쉘 스크립트로 작성해 스크립트만 실행하면 앞의 작업이 차례로 진행되도록 하겠다.

쉘 스크립트와 vim은 서로 다른 역할을 한다. 쉘 스크립트는 .sh라는 파일 확장자를 가진 파일이다. 쉘 스크립트 역시 리눅스에서 기본적으로 사용할 수 있는 스크립트파일의 한 종류이다.

vim(빔)은 리눅스 환경과 같이 GUI가 아닌 환경에서 사용하는 편집 도구다. 리눅스에서는 빔 이외에도 이맥스, 나노등의 도구를 지원하나 가장 대중적인 도구가 빔이므로 빔으로 진행한다.

~/app/step1에 depoly.sh 파일을 하나 생성한다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=springboot-webservice

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 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}*.jar)

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

if [ -z "$CURRENT_PID" ]; then
   echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
   echo "> kill -15 $CURRENT_PID"
   kill -15 $CURRENT_PID
   sleep 5
fi

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

JAR_NAME=$(ls -tr $REPOSITORY/ | grep *.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

1.3 외부 Security 파일 등록하기

위의 쉘 스크립트 애플리케이션을 실행하면 실패한다. ClientRegistrationRepository를 생성하려면 clientId와 clientSecret이 필요하기 때문이다. application-oauth.properties가 .gitignore로 제외 되었기 때문이다.

app 디렉토리에 properties 파일을 생성하고 로컬 application-oauth.properties의 내용을 복사한다.

그리고 나서 deploy.sh 파일을 수정한다.

nohup java -jar \
        -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties \
        $REPOSITORY/$JAR_NAME 2>&1 &

1.4 스프링 부트 프로젝트로 RDS 접근하기

Maria DB에서 스프링부트 프로젝트를 실행하기 위해선 몇 가지 작업이 필요하다.

  1. 테이블 생성
    • H2에서 자동 생성해주던 테이블들을 MariaDB에선 직접 쿼리를 이용해 생성한다.
  2. 프로젝트 설정
    • 자바 프로젝트가 MariaDB에 접근하려면 데이터베이스 드라이버가 필요하다.
  3. EC2(리눅스 서버) 설정
    • 프로젝트 안에 접속정보를 가지고 있다면 깃허브와 같이 오픈된 공간에서는 누구나 해킹할 위험이 있다. EC2 서버 내부에서 접속 정보를 관리하도록 설정한다.
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=rds주소:포트명/db명
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

deploy.sh 수정

nohup java -jar \
        -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
        -Dspring.profiles.active=real \
        $REPOSITORY/$JAR_NAME 2>&1 &

1.5 EC2에서 소셜 로그인 하기

curl 명령이를 통해 EC2 서비스가 잘 배포된 것은 확인했다.

스프링 부트 프로젝트를 EC2에 배포했다. 현재 방식은 몇 가지 문제가 있다.