RDS 설정 & EC2 배포

박찬미·2022년 5월 30일
0

Spring Boot

목록 보기
15/17

1. ec2 접속

오랜만에 접속하려고 했는데 자꾸 operation time out이 떴다.
⇒ 해결
내가 이전에 보안그룹을 만들 때 22 포트(ssh 접속)하는 아이피를 프라이빗으로 지정해뒀기 때문에 연결이 불가했던 것
보안그룹 규칙을 변경해 22 연결을 전체로 열어두었다.

보안상 좋지 않지만, 일단 개발은 해야 되잖뉘..

2. AWS RDS 설정

잡담
전에 어디까지 했나 했더니, ec2 만들고 기본 세팅까지 했던 것 같다. 어쩐지 암것도 없더라 파일 클론도 안되어있고 하..

모니터링, 알람, 백업, HA 구성 등을 모두 지원하는 관리형 서비스인 AWS에서 지원하는 클라우드 기반 관계형 데이터베이스

하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같이 잦은 운영 작업 자동화(조정 가능한 용량도 지원 - 추가 비용)

  • RDS 인스턴스 생성

    대체로 MySQL, MariaDB, PostgreSQL 중에 고르는 게 좋다. 난 MariaDB 선택

    MariaDB 장점
    - 가격
    - Amazon Aurora 교체 용이성
    오로라는 AWS에서 MySQL과 PostgreSQL을 클라우드 기반에 맞게 재구성한 데이터베이스
    - 동일 하드웨어 사양으로 MySQL보다 향상된 성능
    - 활성화된 커뮤니티
    - 다양한 기능
    - 다양한 스토리지 엔진



나머지는 그대로 해주면 될 것 같다.

  • RDS 운영환경에 맞는 파라미터 설정

    세부 정보 위쪽에 DB 엔진을 선택하는 항목이 있는데, 생성한 MariaDB와 같은 버전으로 맞춰야 한다. 10.6으로 맞추면 된다.


    다음으로 변경 사항 저장 버튼을 클릭한다.

  • 생성된 파라미터 그룹 데이터베이스에 연결

    원래는 파라미터 그룹이 default로 되어있었는데 생성한 파라미터 그룹으로 변경한다.

    즉시 적용을 하지 않으면 새벽 시간대에 진행하게 된다. 이 수정사항이 반영되는 동안 데이터베이스가 작동하지 않을 수 있으므로 예약 시간을 걸어두는 기능이지만, 지금은 오픈되지 않았으므로 즉시 적용한다.

3. 내 PC에서 RDS 접속

로컬 PC에서 RDS로 접근하기 위해 RDS 보안 그룹에 내 PC의 IP를 추가한다.

여기서 내가 실수한게 있는데 보안그룹을 default로 해놨는데, 알고보니 rds용으로 따로 만들었어야 했다..
그래서 새로 만들었음

이렇게 만든 후 ec2 보안그룹의 아이디를 복사한다.


이후 데이터베이스 보안그룹을 생성한 걸로 바꿔준다.

저렇게 인바운드 규칙을 설정하면 RDS와 개인 PC, EC2 간의 연동 설정이 된다.(EC2의 경우 이후 2대 3대가 될 수 있는데, 매번 IP를 등록할 수 없으니 보편적으로 이렇게 보안 그룹 간 연동을 한다.)

4. Database 플러그인 설치 & RDS 연결과 설정

로컬에서 원격 데이터베이스로 붙을 때 GUI 클라이언트를 많이 사용한다.(ex : Workbench, SQLyog, Seoul Pro, DataGrip…)

나는 인텔리제이의 Database 플러그인 사용

  • RDS 정보에서 엔드포인트 확인


    자 원래 저렇게 하면 제대로 연결되는게 맞다.
    그런데 안되더라…dbeaver에서 연결해보니 잘 된다. ⇒ 아마 드라이버 문제인 것 같다.

드라이버 설정하는 부분을 찾았을 때 없어보이고, 구글링 했을 때 어떤 사람은 타임존이 안 맞아서라고 했지만, 설정하는 과정이 좀 귀찮아 보였다..ㅎ

그래서 intellij database 탭을 열어서 연결해보면 잘 된다.

드라이버는 추천 해주길래 바꿔줬고, database 부분을 실제 이름과 맞춰줬더니 잘 된다.


위와 같이 하면 콘솔창이 뜬다.

오른쪽 맨 위보면 스키마 연결해주고
각 쿼리에 입력 위치 댄 다음에 초록색 실행 버튼을 클릭하면 쿼리가 실행된다.

오른쪽 맨 위보면 스키마 연결해주고
각 쿼리에 입력 위치 댄 다음에 초록색 실행 버튼을 클릭하면 쿼리가 실행된다.

한글명이 잘 들어가는지 insert 쿼리를 실행해 확인해본다.

RDS에 대한 모든 설정이 끝났다.

5. EC2에서 RDS 접속 확인

  • ec2 접속

  • mysql cli 설치

  • RDS 접속

6-1. EC2 에 프로젝트 배포 - Clone, shell script 생성

  • EC2 에 프로젝트 clone

만약에 테스트가 실패해서 수정하고 다시 깃허브에 푸시했다면(로컬에서~)
푸시한 내용을 다시 ec2로 받아야 하므로

git pull

  • 배포 스크립트 만들기
  • 원래 배포 과정
    1. git clone 또는 git pull로 새 프로젝트 받음
    2. Gradle 또는 Maven으로 프로젝트 테스트와 빌드
    3. EC2 서버에서 해당 프로젝트 실행 및 재실행

위 배포 과정을 배포할 때마다 반복하는 것은 불편하다.
그래서 이를 쉘 스크립트로 작성해서 스크립트만 실행하도록 만들어보겠다.

#!/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 파일은 외부에 있기 때문에 절대경로 사용

수정 후 다시 실행한다.

6-2. EC2 에 프로젝트 배포 - 스프링 부트 프로젝트로 RDS 접근

RDS(Maria DB)에서 스프링부트 프로젝트를 실행하기 위해서는 사전 작업이 필요하다.

  • RDS 테이블 생성

로컬에서 어플리케이션을 실행하면 아래 사진과 같은 로그가 발생한다. 로그를 복사해 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기 때문에 스프링 부트에서 새로 만들지 않아야 한다.(필수)

  • deploy.sh가 real profile 쓰도록 개선

    코드 설명

    -Dspring.profiles.active=real
    application.real.properties 활성화(그 안에 real-db도)

이제 deploy.sh를 다시 실행


EC2에 서비스가 잘 배포된 것을 확인했다.

7. EC2 소셜 로그인

브라우저에서 확인해보기 전에 사전작업 필요하다.

  • AWS 보안 그룹 변경

    8080으로 배포되었으니, 보안그룹에서 8080 포트가 열려 있는지 확인

  • AWS EC2 도메인으로 접속

    제대로 접속이 된다!

여기서 작업을 하나 더 해줘야 한다.
바로 해당 서비스에 EC2의 도메인을 등록해줘야 한다.(안해주면 구글과 네이버 로그인이 작동하지 않음, 전에 로컬도 등록해줬음)

  • 구글 서비스에 도메인 등록




    이제 로그인하면 잘 나온다!

그런데 이 방식은 몇 가지 문제가 있다.

  1. 수동으로 실행되는 Test
    내가 짠 코드가 다른 개발자의 코드에 영향을 끼치지 않는지 전체 테스트를 수행해야만 한다.
    현재는 개발자가 작업할 때마다 수동으로 수행
  2. 수동 Build
    나와 다른 사람이 작성한 브랜치가 머지될 때 이상이 없는지 Build를 수행해야만 알 수 있다.
    매번 개발자가 직접 실행해봐야 한다.

Test와 Build, Deploy를 자동화시키는 작업을 해야 한다.


데이터베이스 연결 삽질 참고
https://wadekang.tistory.com/35

hibernate
https://livenow14.tistory.com/70

0개의 댓글