[8. Spring boot] EC2 서버에 프로젝트를 배포해 보자

박현우·2021년 4월 16일
0

Spring

목록 보기
9/11
post-custom-banner

EC2에 프로젝트 Clone 받기

다른 작업 장소에서 프로젝트를 이어가려면 깃허브에 올린 프로젝트를 clone해야 합니다.

EC2로 접속 후 git 설치 -> 디렉토리 생성 후 clone 진행

다음과 같이 EC2에 프로젝트가 복사된 것을 확인할 수 있습니다.
여기에서 gradle로 테스트를 할 수 있는 이유는 gradlew 라는 wrapper 파일 때문입니다.

wrapper 파일은 새로운 환경에서 프로젝트를 설정할 때 java나 gradle을 별도로 설치 하지 않고 gradle을 사용할 수 있게 해줍니다.


배포 스크립트 만들기

작성한 코드를 실제 서버에 반영하는 것을 배포라고 합니다.

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

위의 3가지 경우 모두 배포에 해당한다고 볼 수 있습니다.
이것을 배포할 때마다 명령어로 하나하나치면 불편함이 동반됩니다. 따라서 쉘 스크립트로 스크립트만 실행하면 일련의 과정을 실행하는 작업을 진행합니다.

~/app/step1/deploy.sh

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=Spring_Practice

cd $REPOSITORY/$PROJECT_NAME

echo "> Git PULL"
git pull
echo "프로젝트 빌드 시작"

./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 &

vim 에서는 $변수명으로 변수에 접근할 수 있습니다.

저렇게 작성한 뒤 실행권한을 주고 실행하면 됩니다.

그럼 다음과 같이 nohup.out이 생성되는데 여기에 로그가 담겨있습니다.

nohup.out

내용은 애플리케이션의 실행에 실패했다는 내용입니다.


외부 Security 파일 등록하기

애플리케이션이 실패한 이유는 ClientRegistrationRepository생성에 실패했기 때문인데, clientId와 clientSecret이 있어야 합니다. 로컬에서는 application-oauth.properties파일에 id와 secret을 저장했지만, .gitignore파일에 올려놨기 때문에 pull을 실행해도 파일을 받지 못한 것입니다.

그렇기 때문에 EC2에서 직접 이 설정들을 가지고 있어야 합니다.
로컬에서 properties파일의 내용을 복사해 ec2 디렉토리 내에 저장하고, 쉘 스크립트에 경로를 붙여줍니다.


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

현재 RDS는 MariaDB를 사용 중입니다.

  • 테이블 생성: H2에서 자동 생성해주던 테이블들을 MariaDB에선 직접 쿼리를 이용해 생성해야 합니다.
  • 프로젝트 설정: 자바 프로젝트가 MariaDB에 접근하려면 데이터베이스 드라이버가 필요합니다. MariaDB에서 사용 가능한 드라이버를 프로젝트에 추가합니다.
  • EC2 (리눅스 서버)설정: 데이터베이스의 접속 정보는 중요하게 보호해야 할 정보입니다. 때문에 프로젝트 안이 아닌 EC2 서버와 같은 private한 공간에 접속 정보를 관리해야 합니다.

RDS 테이블 생성

H2 테이블-> RDS 테이블 복사
JPA가 사용될 엔티티 테이블, 스프링 세션이 사용될 테이블 2가지를 생성합니다.
JPA 테이블은 테스트 로그에 나온 쿼리를 그대로 사용합니다.

스프링 세션 테이블은 schema-mysql.sql 파일에서 확인할 수 있습니다.
이것 역시 복사하여 RDS에 반영하도록 합니다.


프로젝트 설정

먼저 MariaDB 드라이버를 build.gradle에 등록합니다.
그리고 서버에서 구동될 환경을 구성하기 위해
src/main/resources/application-real.properties 파일을 추가합니다. 실제 운영될 환경이기 때문에 보안상 이슈가 될 만한 설정들은 모두 제거합니다.

application-real.properties

spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc

EC2 설정

OAuth와 마찬가지로 RDS 접속 정보도 보안 사항입니다.
app/application-real-db.properties

spring.jpa.hibernate.ddl-auto=none

spring.datasource.url=jdbc:mariadb://rds주소:포트명(기본은 3306)/database명
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

deploy.sh가 real profile을 쓸 수 있도록 코드를 개선한 뒤 deploy.sh를 다시 실행 시키면 html 코드가 나옵니다.


EC2에서 소셜 로그인하기

  • AWS 보안 그룹 변경

이제 저희가 EC2에 배포한 서비스가 브라우저에서 확인할 수 있는지 봐야합니다.
먼저 프로젝트가 8080포트로 배포되었으니 8080포트가 보안 그룹에 열려있는지 확인합니다.
그리고 다른 사용자들이 들어올 수 있어야 하기 때문에 HTTP, HTTPS 포트를 열어줍니다.

  • AWS EC2 도메인으로 접속
    EC2에서 퍼블릭 DNS를 확인할 수 있는데 여기 뒤에 :8080을 붙이면 어디서든 서비스에 접속할 수 있습니다. 이렇게 도메인을 가지게 되었는데 도메인은 추후에 변경할 수 있습니다.

  • 구글, 네이버에 EC2 주소 등록
    프로젝트에 접근은 가능하나 아직 EC2 주소를 등록하지 않아 로그인이 안됩니다. 따라서 localhost뿐 아니라 EC2 도메인도 추가해 주어야 합니다.

post-custom-banner

0개의 댓글