ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AWS] AWS 서버 구축 및 배포 5. AWS EC2에 프로젝트 배포
    DevOps/AWS 2022. 4. 21. 01:42
    728x90

    저번 포스팅까지 따라왔다면 이제 실제로 배포를 해볼 차례이다.

    바로 시작해보자.

     

    1. EC2에 프로젝트 Clone 받기

     

    일단 EC2로 접속해서 밑의 명령어로 git을 설치해주자.

    sudo yum install git // 깃 설치
    git --version // 설치가 완료된 후 설치 상태 확인

     

    git이 설치되었다면 이제 git clone으로 프로젝트를 저장할 디렉토리를 생성하고 생성한 디렉토리로 이동하자.

    mkdir ~/app && mkdir ~/app/step1
    cd ~/app/step1

     

    git repository의 https 주소를 복사해서 클론을 받아온다.

    git clone 레포지토리 주소

     

    git clone이 끝났으면 프로젝트 디렉토리로 이동해서 파일들이 잘 복사되었는지 확인하고

    코드들이 잘 수행되는지도 확인하자.

    참고로 gradle을 설치하지 않았어도 gradlew 파일 덕분에 사용이 가능하다. 

    cd 프로젝트명 ( 레포지토리 명 )
    ll // 파일들 확인
    chmod +x ./gradlew // 실행권한을 준 후
    ./gradlew // 실행

     

    여기까지 확인했다면 다음으로 넘어가자.

     

    2. 배포 스크립트 만들기

     

    배포할 때마다 git pull 하고, 빌드 도구를 이용해서 프로젝트 테스트와 빌드하고,

    EC2 서버에서 해당 프로젝트 실행 및 재실행 등 많은 것들을 명령어 하나하나 실행하는 것은

    너무 비효율적이다.

     

    이를 쉘 스크립트를 만들어서 해결할 수 있다.

    delpoy.sh 파일을 아래와 같이 생성해주자.

    vim ~/app/step1/deploy.sh

     

    vim 에디터의 사용법을 모른다면 찾아보길 바란다. 조금 불편하지만 어렵지 않게 사용할 수 있다.

    다음과 같이 작성해준다.

    #!/bin/bash
    
    REPOSITORY=/home/ec2-user/app/step1
    PROJECT_NAME=Spring-Security
    
    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 &

     

    자세히는 몰라도 리눅스 명령어를 안다면 대충 무엇을 하는지는 짐작할 수 있을 것이다.

    이제 이 스크립트를 명령어로 실행한다.

    ./deploy.sh

     

    실행하면 프로젝트에 따라 필요한 설정파일이 깃에는 없기 때문에 받아오지 못해서 오류가 날 수 있는데

    아래와 같이 설정파일들의 위치를 지정해서 사용할 수 있다.

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

     

     

    3. 스프링 부트 프로젝트에서 RDS 접근

     

    RDS는 Maria DB를 사용 중이므로 몇 가지 작업이 필요하다.

     

    1) 테이블 생성

    2) 프로젝트 설정

    3) EC2 설정

     

    - 테이블 생성

     

    먼저 RDS에 테이블을 생성하자.

    여기서 JPA가 사용될 엔티티 테이블과 스프링 세션이 사용될 테이블 2가지 종류를 생성한다.

    JPA가 사용할 테이블은 코드 수행 시 로그로 생성되는 쿼리를 사용하면 편하게 생성할 수 있다.

    나의 경우는 아래와 같았다.

    create table user (
           id bigint not null auto_increment,
            created_by varchar(255),
            created_date datetime(6),
            last_modified_by varchar(255),
            updated_date datetime(6),
            age integer,
            email varchar(255),
            password varchar(255),
            provider varchar(255),
            provider_id varchar(255),
            role varchar(255),
            username varchar(255),
            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 LONGVARBINARY 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;

     

    - 프로젝트 설정

     

    build.gradle 에 다음과 같이 Maria DB 드라이버를 등록한다.

    compile('org.mariadb.jdbc:mariadb-java-client')

     

    yml에 보안/로그상 이슈가 될 만한 설정들을 모두 제거하며 yml을 설정한다.

    이슈가 될 만한 것들은 EC2에 직접 생성해서 관리한다. ( git 에 올라가면 안 됨 )

    아래와 같은 것들을 추가해주었다. 

    spring:
      session:
        store-type: jdbc
      profiles:
        include: real-db # application-real-db로 EC2에 파일을 만들면 profile = real-db인 환경 구성
        
    jpa:
      properties:
        hibernate:
          dialect: org.hibernate.dialect.MySQL5InnoDBDialect

     

    - EC2 설정

     

    app 디렉토리에 Oauth나 RDS 접속 정보 등은 보안 이슈가 생길 수 있기 때문에

    EC2 서버에 직접 설정파일을 만든다.

     

    RDS 접속정보, db 계정, 비밀번호, oauth 설정 등을 입력해준다.

     

    이제 deploy.sh를 아까 위에서 설정을 보여준 것처럼 수정하고 실행하면

    배포가 성공적으로 이루어진 것을 알 수 있고, 실제 퍼블릭 DNS를 통해 접속할 수 있다.

    #!/bin/bash
    
    REPOSITORY=/home/ec2-user/app/step1
    PROJECT_NAME=Spring-Security
    
    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.yml,/home/ec2-user/app/application-real-db.yml \
           $REPOSITORY/$JAR_NAME 2>&1 &

     

    여기까지 AWS 서버 구축 및 배포를 마쳤고, 이어서 배포 자동화까지 포스팅해두었으니 관심이 있으신 분은 참고하기 바란다.

     

    https://yanglet.tistory.com/15

     

    [CI / CD] Travis CI 를 이용한 배포 자동화 (1)

    배포를 해보았는데, 이제는 깃허브에 push를 하게 되면 자동으로 배포가 되도록 환경을 구성해보자. 1. Travis CI 와 연동하기 Travis CI 사용을 위해 https://www.travis-ci.com/ 이 사이트로 접속해서 깃을 통

    yanglet.tistory.com

     

     

    참고 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스, 이동욱님 지음

    728x90
Designed by Tistory.