반응형
EC2 프로젝트 Clone
- sudo yum install git (깃 설치)
- git --version 으로 버전 확인
- mkdir ~/app && mkdir ~/app/step1 : git clone 으로 저장할 디렉토리 생성
- cd ~/app/step1 : 생성한 디렉토리로 이동
- git clone 깃헙 주소
- cd 레포이름 , ll 을 통해 코드 확인
- ./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를 통해 디렉토리를 생성한 후 프로퍼티를 복사해서 넣어주자.
- 해당 결과가 나오면 정상
프로젝트로 RDS 접근
프로젝트 설정
- RDS는 MariaDB를 사용 중이므로 스프링부트 프로젝트를 실행하기 위해 몇 가지 작업이 필요하다.
- RDS 테이블 생성
- 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 추가
- 해당 결과화면이 나오면 정상 작동 - curl localhost:8080 으로 html 코드가 나오는지 한번 더 확인
EC2 소셜 로그인
- ec2 보안 그룹에 8080포트가 열려있는지 확인, 없다면 추가
- 왼쪽 사이드바에서 인스턴스 - 퍼블릭DNS 확인 - DNS:8080 으로 접속
구글 EC2 등록
- GCP - OAuth 동의화면 - 앱 수정에서 DNS 주소를 등록
- API 및 서비스 - 사용자 인증 정보 - 리디렉션 - DNS:포트:login/oauth2/code/google 등록
네이버 EC2 등록
- 생성한 애플리케이션 - API 설정 - 서비스 URL (DNS) , Callback (DNS:포트/login/oauth2/code/naver) 추가
본 포스팅은 프리렉-이동욱님의 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 참고하였습니다.
반응형