제육's 휘발성 코딩
Published 2021. 9. 22. 19:37
[AWS] EC2 배포 🔷 Spring/AWS
반응형

EC2 프로젝트 Clone

  • sudo yum install git (깃 설치)
  • git --version 으로 버전 확인
  • mkdir ~/app && mkdir ~/app/step1 : git clone 으로 저장할 디렉토리 생성
  • cd ~/app/step1 : 생성한 디렉토리로 이동
  • git clone 깃헙 주소

image

  • cd 레포이름 , ll 을 통해 코드 확인

image

  • ./gradlew test 를 통해 테스트 검증 - permission denied 발생 시 chmod +x ./gradlew 를 통해 실행권한을 추가 부여

배포 스크립트 만들기

  • 배포할 때마다 개발자가 명령어를 실행하는 것은 불편하다.
  • 쉘 스크립트를 통해 자동으로 실행되도록 만든다. (쉘 스크립트는 .sh 확장자를 가진 파일)
  • vim ~/app/step1/deploy.sh 로 vim 파일 생성
#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=crawler-web

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 \
       -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties \
       $REPOSITORY/$JAR_NAME 2>&1 &

cd $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/ : build 결과물인 jar를 복사해 jar 파일을 모아둔 위치로 복사

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar) : 기존에 수행 중인 어플리케이션을 종료

-f 옵션은 프로세스 이름을 찾고 pgrep 은 process id만 추출하는 명령어

if ~ else ~ fi : 현재 구동 중인 프로세스가 있는지 없는지를 판단

외부 시큐리티 파일 등록

  • oauth.properties 파일은 gitignore로 막아둔 상태이다.
  • vim /home/ec2-user/app/application-oauth.properties를 통해 디렉토리를 생성한 후 프로퍼티를 복사해서 넣어주자.

image

  • 해당 결과가 나오면 정상

프로젝트로 RDS 접근

프로젝트 설정

  • RDS는 MariaDB를 사용 중이므로 스프링부트 프로젝트를 실행하기 위해 몇 가지 작업이 필요하다.
  • RDS 테이블 생성

image

  • schema-mysql.sql 파일을 찾아서 복사한 후 RDS에 반영
create table posts (id bigint not null auto_increment, created_date datetime, modified_date datetime, author varchar(255),
content TEXT not null, title varchar(500) not null, primary key (id)) engine=InnoDB

create table user (id bigint not null auto_increment, created_date datetime, modified_date datetime, email varchar(255) not null,
name varchar(255) not null, picture varchar(255), role varchar(255) not null, primary key (id)) engine=InnoDB

CREATE TABLE SPRING_SESSION (
    PRIMARY_ID CHAR(36) NOT NULL,
    SESSION_ID CHAR(36) NOT NULL,
    CREATION_TIME BIGINT NOT NULL,
    LAST_ACCESS_TIME BIGINT NOT NULL,
    MAX_INACTIVE_INTERVAL INT NOT NULL,
    EXPIRY_TIME BIGINT NOT NULL,
    PRINCIPAL_NAME VARCHAR(100),
    CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);

CREATE TABLE SPRING_SESSION_ATTRIBUTES (
    SESSION_PRIMARY_ID CHAR(36) NOT NULL,
    ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
    ATTRIBUTE_BYTES BLOB NOT NULL,
    CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
    CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
  • 엔티티 클래스도 추가로 넣는다.

EC2 설정

 implementation("org.mariadb.jdbc:mariadb-java-client")
  • MariaDB 드라이버 gradle 종속성 추가
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://RDS주소:3306/DB명
spring.datasource.username=db 계정
spring.datasource.password=db 계정 비번
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
  • 해당 내용을 ec2 에 vim ~/app/application-real-db.properties 파일을 생성하여 넣어주자
nohup java -jar \
        -Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties,classpath:/application-real.properties \
        -Dspring.profiles.active=real \
        $REPOSITORY/$JAR_NAME 2>&1 &
  • deploy.sh 의 nohup 수정 - 프로젝트에서 생성한 real.properties, ec2에 생성한 real-db.properties 추가

image

  • 해당 결과화면이 나오면 정상 작동 - curl localhost:8080 으로 html 코드가 나오는지 한번 더 확인

EC2 소셜 로그인

image

  • ec2 보안 그룹에 8080포트가 열려있는지 확인, 없다면 추가
  • 왼쪽 사이드바에서 인스턴스 - 퍼블릭DNS 확인 - DNS:8080 으로 접속

구글 EC2 등록

image

  • GCP - OAuth 동의화면 - 앱 수정에서 DNS 주소를 등록

image

  • API 및 서비스 - 사용자 인증 정보 - 리디렉션 - DNS:포트:login/oauth2/code/google 등록

네이버 EC2 등록

image

  • 생성한 애플리케이션 - API 설정 - 서비스 URL (DNS) , Callback (DNS:포트/login/oauth2/code/naver) 추가

본 포스팅은 프리렉-이동욱님의 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 참고하였습니다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^