오랜만에 접속하려고 했는데 자꾸 operation time out이 떴다.
⇒ 해결
내가 이전에 보안그룹을 만들 때 22 포트(ssh 접속)하는 아이피를 프라이빗으로 지정해뒀기 때문에 연결이 불가했던 것
보안그룹 규칙을 변경해 22 연결을 전체로 열어두었다.
보안상 좋지 않지만, 일단 개발은 해야 되잖뉘..
잡담
전에 어디까지 했나 했더니, ec2 만들고 기본 세팅까지 했던 것 같다. 어쩐지 암것도 없더라 파일 클론도 안되어있고 하..
모니터링, 알람, 백업, HA 구성 등을 모두 지원하는 관리형 서비스인 AWS에서 지원하는 클라우드 기반 관계형 데이터베이스
하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같이 잦은 운영 작업 자동화(조정 가능한 용량도 지원 - 추가 비용)
MariaDB 장점
- 가격
- Amazon Aurora 교체 용이성
오로라는 AWS에서 MySQL과 PostgreSQL을 클라우드 기반에 맞게 재구성한 데이터베이스
- 동일 하드웨어 사양으로 MySQL보다 향상된 성능
- 활성화된 커뮤니티
- 다양한 기능
- 다양한 스토리지 엔진
나머지는 그대로 해주면 될 것 같다.
RDS 운영환경에 맞는 파라미터 설정
세부 정보 위쪽에 DB 엔진을 선택하는 항목이 있는데, 생성한 MariaDB와 같은 버전으로 맞춰야 한다. 10.6으로 맞추면 된다.
다음으로 변경 사항 저장 버튼을 클릭한다.
생성된 파라미터 그룹 데이터베이스에 연결
원래는 파라미터 그룹이 default로 되어있었는데 생성한 파라미터 그룹으로 변경한다.
즉시 적용을 하지 않으면 새벽 시간대에 진행하게 된다. 이 수정사항이 반영되는 동안 데이터베이스가 작동하지 않을 수 있으므로 예약 시간을 걸어두는 기능이지만, 지금은 오픈되지 않았으므로 즉시 적용한다.
로컬 PC에서 RDS로 접근하기 위해 RDS 보안 그룹에 내 PC의 IP를 추가한다.
여기서 내가 실수한게 있는데 보안그룹을 default로 해놨는데, 알고보니 rds용으로 따로 만들었어야 했다..
그래서 새로 만들었음
이렇게 만든 후 ec2 보안그룹의 아이디를 복사한다.
이후 데이터베이스 보안그룹을 생성한 걸로 바꿔준다.
저렇게 인바운드 규칙을 설정하면 RDS와 개인 PC, EC2 간의 연동 설정이 된다.(EC2의 경우 이후 2대 3대가 될 수 있는데, 매번 IP를 등록할 수 없으니 보편적으로 이렇게 보안 그룹 간 연동을 한다.)
로컬에서 원격 데이터베이스로 붙을 때 GUI 클라이언트를 많이 사용한다.(ex : Workbench, SQLyog, Seoul Pro, DataGrip…)
나는 인텔리제이의 Database 플러그인 사용
드라이버 설정하는 부분을 찾았을 때 없어보이고, 구글링 했을 때 어떤 사람은 타임존이 안 맞아서라고 했지만, 설정하는 과정이 좀 귀찮아 보였다..ㅎ
그래서 intellij database 탭을 열어서 연결해보면 잘 된다.
드라이버는 추천 해주길래 바꿔줬고, database 부분을 실제 이름과 맞춰줬더니 잘 된다.
위와 같이 하면 콘솔창이 뜬다.
오른쪽 맨 위보면 스키마 연결해주고
각 쿼리에 입력 위치 댄 다음에 초록색 실행 버튼을 클릭하면 쿼리가 실행된다.
오른쪽 맨 위보면 스키마 연결해주고
각 쿼리에 입력 위치 댄 다음에 초록색 실행 버튼을 클릭하면 쿼리가 실행된다.
한글명이 잘 들어가는지 insert 쿼리를 실행해 확인해본다.
RDS에 대한 모든 설정이 끝났다.
ec2 접속
mysql cli 설치
RDS 접속
만약에 테스트가 실패해서 수정하고 다시 깃허브에 푸시했다면(로컬에서~)
푸시한 내용을 다시 ec2로 받아야 하므로
git pull
위 배포 과정을 배포할 때마다 반복하는 것은 불편하다.
그래서 이를 쉘 스크립트로 작성해서 스크립트만 실행하도록 만들어보겠다.
#!/bin/bash
# 변수 선언(자주 쓰고 길어서), 실제 디렉토리 이름을 넣어야 함
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=SpringBoot-Project
# project 디렉토리로 이동
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> setp1 디렉토리로 이동"
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
# 종료했으니 새로 실행할 jar 파일 찾기, 여러 개가 생기므로 tail -n을 통해 마지막에
생긴 애를 찾음
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
# 찾은 jar 파일을 nohub으로 실행 => 터미널이 종료되어도 애플리케이션 구동됨
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
스프링부트의 장점으로 외장 톰캣을 설치하지 않아도 된다. 내장 톰캣을 사용해 jar 파일만 존재하면 바로 웹 애플리케이션 서버를 실행할 수 있다.
chmod +x ./deploy.sh
생성한 스크립트에 실행 권한 추가
./deploy.sh
실행은 잘 된다만,,nohub 명령어를 못 찾아서 nohup 찾을 수 있도록 경로 바꿔주고 했다. 아래는 참고한 사이트다.
https://cdmana.com/2021/07/20210724080443293o.html
다시 실행하니 제대로 새 애플리케이션이 배포되었다고 뜬게 보인다.
vim nohup.out
을 통해 파일을 살펴보면 애플리케이션에서 출력되는 모든 내용을 볼 수 있다.
위 로그 아래를 보면
security oauth 관련해서 뭐라뭐라 나온다.
ClientRegistrationRepostiory를 찾을 수 없다고 하는데 이는 clientId와 clientSecret이 없기 때문이다.
시큐리티 oauth2의 ClientRegistrationRepository를 생성하려면 clientId와 clientSecret이 필수다.
로컬에서는 application-auth.properties가 있어서 문제가 없었다. 하지만 gitignore에 이 파일이 포함되어서 github에서는 없다.
⇒ 공개된 저장소에 ClientId와 ClientSecret을 올리면 안되기 때문,,
위의 문제로 인해 서버에서 직접 이 설정들을 가지고 있도록 하겠다.
아 근데 이거 로컬에 있던 프로퍼티스 내용 복사해야 하는데, 노트북을 바꾸면서 나도 깃헙에서 클론한거라 원래 노트북에 있는 프로퍼티스 내용을 가져와야 한다…ㅎ하하!
찾아서 걍 여기서 다시 만들어줬다.
그 후 생성한 프로퍼티스 파일을 쓰도록 deploy.sh 파일을 수정한다.
소스 설명
- -Dspring.config.location
1. 스프링 설정 파일 위치 지정
2. classpath가 붙으면 jar 안에 있는 resources 디렉토리를 경로 생성
3. application-outh 파일은 외부에 있기 때문에 절대경로 사용
수정 후 다시 실행한다.
RDS(Maria DB)에서 스프링부트 프로젝트를 실행하기 위해서는 사전 작업이 필요하다.
로컬에서 어플리케이션을 실행하면 아래 사진과 같은 로그가 발생한다. 로그를 복사해 RDS에 반영한다.
필요한 모든 테이블을 생성했다.
프로젝트 설정
위 설정 완료 후 푸시한다.
application-real-db.properties(RDS 설정 파일 생성)
## application-real-db.properties
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
oauth 와 마찬가지로 중요 정보이기 때문에 바깥에 파일을 생성한다.
jpa로 테이블이 자동 생성되는 옵션을 none으로 한 이유는 실제 운영 db기 때문에 스프링 부트에서 새로 만들지 않아야 한다.(필수)
코드 설명
-Dspring.profiles.active=real
application.real.properties 활성화(그 안에 real-db도)
이제 deploy.sh를 다시 실행
EC2에 서비스가 잘 배포된 것을 확인했다.
브라우저에서 확인해보기 전에 사전작업 필요하다.
AWS 보안 그룹 변경
8080으로 배포되었으니, 보안그룹에서 8080 포트가 열려 있는지 확인
AWS EC2 도메인으로 접속
제대로 접속이 된다!
여기서 작업을 하나 더 해줘야 한다.
바로 해당 서비스에 EC2의 도메인을 등록해줘야 한다.(안해주면 구글과 네이버 로그인이 작동하지 않음, 전에 로컬도 등록해줬음)
그런데 이 방식은 몇 가지 문제가 있다.
Test와 Build, Deploy를 자동화시키는 작업을 해야 한다.
데이터베이스 연결 삽질 참고
https://wadekang.tistory.com/35
hibernate
https://livenow14.tistory.com/70