-
[AWS] AWS 서버 구축 및 배포 5. AWS EC2에 프로젝트 배포DevOps/AWS 2022. 4. 21. 01:42728x90
저번 포스팅까지 따라왔다면 이제 실제로 배포를 해볼 차례이다.
바로 시작해보자.
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'DevOps > AWS' 카테고리의 다른 글
[AWS] AWS 서버 구축 및 배포 4. AWS RDS 접속 및 확인 (0) 2022.04.15 [AWS] AWS 서버 구축 및 배포 3. AWS RDS (0) 2022.04.09 [AWS] AWS 서버 구축 및 배포 2. EC2 서버에 접속 및 환경설정 (0) 2022.04.08 [AWS] AWS 서버 구축 및 배포 1. AWS EC2 (0) 2022.04.06