September 16, 2020
sudo yum install git
git --version
mkdir ~/app && mkdir ~/app/step1
cd ~/app/ste1
git clone (복사한주소)
clone 끝났으면 클론된 프로젝트로 이동해서 파일들이 잘 복사되었는지 확인
cd 프로젝트명(freelec-springboot2-webservice)
ll
코드들이 잘 수행되었는지 테스트로 검증
git pull
./gradlew test
chmod +x ./gradlew
./gradlew test
작성한 코드를 실제 서버에 반영하는 것을 배포라고 한다. 배포라 함은 다음의 과정을 모두 포괄하는 의미이다
쉘 스크립트
로 작성해 스크립트만 실행하면 앞의 과정이 차례로 진행되도록 하는 것. 참고로 쉘 스브립트와 빔(vim)은 서로 다른 역할을 한다. 쉘 스크립트는 .sh라는 파일 확장자를 가진 파일
이다. 노드 JS가 .js라는 파일을 통해 서버에서 작동하는 것처럼 쉘 스크립트 역시 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류
이다.
빔
은 리눅스 환경과 같이 GUI(윈도우와 같이 마우스를 사용할 수 있는 환경)가 아닌 환경에서 사용할 수 있는 편집 도구
. 리눅스에선 빔 이외에도 이맥스, 나노 등의 도구를 지원한다. 하지만 빔(vim)이 가장 대중적인 도구이므로 빔을 선택!vim ~/app/step1/deploy.sh
deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=freelec-springboot2-webservice
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 $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
REPOSITORY=/home/ec2-user/app/step2
, PROJECT_NAME=freelec-springboot2-webservice
cd $REPOSITORY/$PROJECT_NAME/
./gradlew build
cd ./build/libs/*.jar $REPOSITORY/
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}*.jar)
if ~ else ~ fi
JAR_NAME=$(ls $REPOSITORY/*.jar | tail -n 1)
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
chmod +x ./deploy.sh
ll
./deploy.sh
vim nohup.out
ClientRegistrationRepiostory
를 찾을 수 없다(that could not be found).는 에러가 발생하면 애플리케이션 실행에 실패했다는 것을 알 수 있다. 왜 그럴까?
ClientRegistrationRepiostory
를 생성하려면 clientId
와 clientSecret
가 필수다. 로컬 pc에서 실행할 때는 application-oauth.properties가 있어서 문제가 없었다. 하지만 이 파일은 .gitignore로 git에서 제외 대상이므로 깃허브에 올라가있지 않다.vim /home/ec2-user/app/application-oauth.properties
그리고 로컬에 있는 application-oauth.properties 파일 내용을 그대로 붙여넣기. 해당 파일을 저장하고 종료(:wq). 그리고 방금 생성한 application-oauth.properties을 쓰도록 deploy.sh 파일을 수정한다. vim deploy.sh
로 파일 열기
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties \
$REPOSITORY/$JAR_NAME 2>&1 &
-Dspring.config.location
./deploy.sh
명령어로vim nohup.out
으로 확인RDS는 MariaDB를 사용중이다. 이 MariaDB에서 스프링부트 프로젝트를 실행하기 위해서 몇 가지 작업이 필요하다
JPA가 사용될 엔티티 테이블
과 스프링 세션이 사용될 테이블
2가지 종류를 생성로컬(IDE - intelliJ에서)에서 테스트 코드를 수행하면 로그에 테이블 생성 query(posts, user 테이블 2개)를 볼 수 있다.
스프링 세션 테이블은 schema-mysql.sql 파일에서 확인할 수 있다. File검색(Mac에선 Command+shift+O, 윈도우/리눅스에서는 Ctrl+Shift+N) 으로 찾을 수 있다. 해당 파일에는 SPRING_SESSION
테이블과 SPRING_SESSION_ATTRIBUTES
테이블 생성 쿼리가 있다.
compile("org.mariadb.jdbc:mariadb-java-client")
서버에서 구동될 환경을 하나 구성
spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc
vim ~/app/application-real-db.properties
아래 내용 추가
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds주소:3306/databsae이름
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-nad.mariadb.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
마지막으로 deploy.sh가 real profile을 쓸 수 있도록 다음과 같이 개선 vim ~/app/step1/deploy.sh
명령어 실행
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
Dspring.profiles.active=real
./deploy.sh
명령어로 deploy.sh를 실행. vim nohup.out
명령어로 nohup.out파일을 열어 다음과 같은 로그 확인Tomcat started on port(s): 8080(http) with context path ``
(..생략..)
curl localhost:8080
AWS 보안 그룹 변경
AWS
- 네트워크 및 보안
- Name이 ec2
(나는 springboot2-webservice-ec2), 그룹 이름이 freelec-springboot2-webservice
(나는 launch-wizard-1) 클릭 - 밑에 인바운드 탭에 8080포트가 0.0.0.0/0, ::/0
2가지 열려있는지 확인 - 8080 열려 있다면 OK, 안되어 있다면 편집
버튼을 눌러 추가AWS EC2 도메인으로 접속
인스턴스
메뉴 클릭. 본인이 생성한 EC2 인스턴스를 선택하면 다음과 같이 상세 정보에서 퍼블릭 DNS
를 확인도메인
이다. 인터넷이 되는 장소 어디나 이 주소를 입력하면 우리의 EC2 서버에 접근할 수 있다.:8080
을 붙여 브라우저에 입력우리 서비스가 도메인을 가진 서비스가 되었다
구글에 EC2 주소 등록
API 및 서비스
- 사용자 인증 정보
로 이동OAuth 동의 화면
탭을 선택하고 아래에서 승인된 도메인
에 http://
없이 EC2의 퍼블린 DNS를 등록한다.사용자 인증 정보
탭을 클릭하여 본인이 등록한 서비스의 이름을 클릭한다:8080/login/oauth2/code/google
주소를 추가하여 승인된 리디렉션 URI에 등록한다네이버에 EC2 주소 등록
PC 웹
항목이 있는데, 여기서 서비스 URL
과 Callback URL
2개를 수정서비스 URL
Callback URL
하지만
수동 실행되는 Test
수동 Build -다른 사람이 작성한 브랜치와 본인이 작성한 브랜치가 합쳐졌을 때(Merge) 이상이 없는지는 Build를 수행해해야만 알 수 있다.
참고 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱