※ 이번 포스트는 <스프링부트와 AWS로 혼자 구현하는 웹서비스> 책의 8장을 공부하면서 정리한 것입니다.
EC2에 프로젝트 클론 받기
EC2 서버에 접속하여 다음의 명령어로 git을 설치합니다.
sudo yum install git
그리고 아래의 명령어로 설치가 잘 되었는지 확인합니다.
git --version
다음 mkdir 명령으로 클론받을 디렉토리를 생성한 후 cd 명령으로 해당 디렉토리로 이동합니다.
그리고 본인 깃헙에서 클론할 레포지토리의 https 주소를 복사한 뒤 클론을 진행하면 됩니다.
git clone {복사한 주소}
클론이 끝났으면 프로젝트 디렉토리로 들어가서 코드들이 잘 수행되는지 테스트로 검증합니다
./gradlew test
만약 수정 사항이 생겨 깃헙에 코드를 푸시했다면 아래 명령으로 코드를 풀 받으면 됩니다.
git pull
만약 gradlew 실행 권한이 없다는 메세지가 뜬다면 아래 명령으로 실행 권한을 추가해주면 됩니다.
chmod +x ./gradlew
배포 스크립트 만들기
배포의 과정에는 git clone 및 pull을 통해 새 버전의 프로젝트를 받는 행위, 프로젝트 테스트 및 빌드, EC2 서버에서 프로젝트 (재)실행이 모두 포함됩니다. 하지만 이 모든 과정을 배포할 때마다 명령어로 하나하나 실행하는 것은 매우 번거롭기 때문에 이를 쉘 스크립트로 작성하여 스크립트만 실행하면 앞의 과정이 모두 진행되도록 만들어주는 것이 편리합니다.
우선 아래 명령으로 application-oauth.properties 파일을 생성합니다.
vim /home/{EC2 서버 username}/app/application-oauth.properties
그리고 로컬에 있는 application-oauth.properties 파일의 내용을 복사하여 붙여넣습니다.
다음으로 아래의 명령으로 ~/app/step1/에 deploy.sh 파일을 생성합니다.
vim ~/app/step1/deploy.sh
그리고 다음과 같이 스크립트를 작성합니다.
#!/bin/bash
REPOSITORY=/home/{EC2 서버 username}/app/step1
PROJECT_NAME={본인의 프로젝트 이름}
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
# build의 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동 중인 에플리케이션 pid 확인"
# 현재 수행 중이던 스프링부트 에플리케이션의 process id 값을 찾아 이를 종료
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 파일명을 찾음
# 여러 jar 파일이 생기므로 tail -n으로 가장 나중의 jar 파일을 변수에 저장
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
# 찾은 jar 파일을 nohup으로 실행
# java -jar 명령의 경우 사용자가 터미널 접속을 끊을 때 에플리케이션도 같이 종료되므로 nohup 명령 사용
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/{EC2 서버 username}/app/application-oauth.properties \
$REPOSITORY/$JAR_NAME 2>&1 &
생성한 스크립트에 실행 권한을 추가합니다.
chmod +x ./deploy.sh
이제 ./deploy.sh 명령을 입력하면 스크립크가 잘 동작하는 것을 확인할 수 있습니다.
스프링부트 프로젝트로 RDS 접근하기
● 테이블 생성
H2에서는 자동으로 테이블을 생성해주었지만 MariaDB에서는 직접 쿼리를 이용해 생성해야 합니다.
JPA가 사용될 entity 테이블과 스프링 세션이 사용될 테이블 2 종류를 생성합니다. 이 때 JPA가 사용할 테이블은 테스트 코드 수행 시 로그로 생성되는 쿼리를 사용하면 됩니다. 이를 복사하여 RDS에 반영해줍니다.
스프링세션 테이블의 경우 schema-mysql.sql 파일에서 확인할 수 있습니다. 이 또한 복사하여 RDS에 반영합니다.
● 프로젝트 설정
우선 MariaDB 드라이버를 build.gradle에 등록합니다. 그 후 서버에서 구동될 환경을 하나 구성해야 하므로 src/main/resources에 application-real.properties 파일을 만들고 아래의 내용을 추가합니다
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
그러면 profile=real인 환경이 구성됩니다.
● EC2 설정
데이터베이스의 접속 정보는 보안이 중요합니다. 때문에 EC2 서버 내부에서 접속 정보를 관리하도록 설정하겠습니다.
아래의 명령으로 application-real-db.properties 파일을 생성합니다
vim ~/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 파일의 내용을 아래와 같이 수정해줍니다.
...
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/{EC2 서버 username}/app/application-oauth.properties,/
home/{EC2 서버 username}/app/application-real-db.properties,classpath:/application-real.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
EC2에 소셜 로그인하기
EC2 서버에서도 소셜 로그인이 가능하도록 다음의 설정들을 해줍니다
1. EC2에 스프링부트가 8080 포트로 배포되었으니 해당 포트가 보안 그룹에 열려 있는지 확인합니다.
2. aws ec2 인스턴스의 퍼블릭 DNS를 확인하여 이를 복사해둡니다.
[구글 로그인]
3. GCP에서 본인의 프로젝트로 이동 후 'API 및 서비스' > '사용자 인증 정보' > 'OAuth 동의 화면' 에서 승인된 도메인에 'http://'없이 ec2의 포블릭 DNS를 등록합니다
4. '사용자 인증 정보' 탭에서 본인이 등록한 서비스의 이름을 클릭하고 퍼블릭 DNS 주소에 ':8080/login/oauth2/code/google'주소를 추가하여 승인된 리디렉션 URI에 등록합니다
[네이버 로그인]
3. 네이버 개발자 센터에서 본인의 프로젝트로 접속한 후 'PC 웹'에서 서비스 URL과 콜백 URL 2개를 수정합니다.
'AWS' 카테고리의 다른 글
| AWS SES로 자사 도메인 메일 생성하고 Gmail과 연동하기 (0) | 2023.02.04 |
|---|---|
| AWS EC2, RDS 인스턴스 생성하기 (1) | 2023.02.04 |
| AWS RDS MySQL 생성하기~ (0) | 2023.02.04 |