[EC2] RDS와 ElastiCache를 이용해 spring boot 배포하기
EC2 인스턴스는 미리 생성해둔 상태이다.
- AWS EC2 ubuntu 20.04
1. RDS & ElastiCache 인스턴스 생성
RDS 인스턴스 생성
이 블로그를 참고하여 생성했다.
ElastiCache 인스턴스 생성
이 블로그를 참고하여 생성했다.
2. AWS EC2와 연결
EC2와 RDS 연결
보안 그룹 설정
EC2에서 RDS에 연결하기 위해서는 RDS의 보안그룹을 설정해주어야 한다.
- EC2 보안그룹 ID 확인 후 복사
- RDS 인스턴스의 vpc 보안그룹 클릭
- 1번에서 복사한 값을 인바운드 규칙에 추가
- 유형: MySQL/Aurora
- 포트 범위: 3306
- 소스: 사용자 지정
- 값: EC2의 보안그룹 ID (복사한 값)
mysql cli 설치
EC2 인스턴스에 접속한 상태에서 실행한다.
$ sudo apt install mysql-client-core-8.0
mysql 접속
$ mysql -u [마스터 사용자 이름] -p -h [RDS 인스턴스 엔드포인트]
EC2와 ElastiCache 연결
보안 그룹 설정
RDS와 마찬가지로 보안그룹을 설정해준다.
- EC2 보안그룹 ID 확인 후 복사
- ElastiCache 인스턴스의 보안그룹 클릭
- 1번에서 복사한 값을 인바운드 규칙에 추가
- 유형: 사용자 지정 TCP
- 포트 범위: 6379
- 소스: 사용자 지정
- 값: EC2의 보안그룹 ID (복사한 값)
gcc와 make 설치
EC2 인스턴스에 접속한 상태에서 실행한다.
$ sudo apt-get update
$ sudo apt install gcc
$ sudo apt install make
redis cli 설치
# redis-cli 설치 및 make
$ wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make
# redis-cli를 bin에 추가해 어느 위치서든 사용 가능하게 등록
$ sudo cp src/redis-cli /usr/bin
이런식으로 설치가 완료되었다.
redis 접속
$ redis-cli -h [ElastiCache 인스턴스 엔드포인트] -p 6379
이때, [ElastiCache 인스턴스 엔드포인트]는 아래 사진과 같은 형태인데, 맨 마지막의 :6379
부분을 제외하고 입력하면 된다.
3. Spring Boot 프로젝트와 연동
java 11 설치
sudo apt-get install openjdk-11-jdk
+) 혹시 환경변수를 설정해야 한다면 아래를 참고하자
먼저 java 위치를 확인한다.
which java
readlink -f /usr/bin/java
다음 명령어를 실행했을 때, 나의 경우는 /usr/lib/jvm/java-11-openjdk-amd64/bin/java
이렇게 나오는데,
뒤에 /bin/java
만 제거하고 앞부분까지만 복사한다.
복사한 뒤에, 아래 명령으로 환경설정 파일인 profile을 열어준다.
sudo vi /etc/profile
그럼 이런 파일이 나오는데, 위와 같이 맨 아래 3줄을 추가해주면 된다.
해당 작업이 끝난 뒤, 업데이트를 위해 아래 명령어를 입력한다.
source /etc/profile
마지막으로 환경변수가 잘 세팅 되었는지 확인한다.
echo $JAVA_HOME
이 명령어를 쳤을 때, 아까 복사해준 위치가 나타나게 된다면 성공이다.
참고
git clone
나는 develop 브랜치에서 가져올거기 때문에 아래 명령을 실행했다.
$ git clone -b [브랜치 이름] --single-branch [깃헙 주소]
예시: git clone -b develop --single-branch https://github.com/...
환경변수 파일 생성
.env
등 .gitignore
에 등록해둔 환경변수 파일을 따로 생성해준다.
코드 변경
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'redis.clients:jedis:3.3.0'
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${MYSQL_ENDPOINT}:${MYSQL_PORT}/${MYSQL_DATABASE}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: ${MYSQL_MASTER}
password: ${MYSQL_PASSWORD}
redis:
host: ${REDIS_ENDPOINT}
port: ${REDIS_PORT}
참고
https://velog.io/@u-nij/Spring-Boot-AWS-RDS-MySQL-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
프로젝트 빌드
$ ./gradlew build -x test
테스트 코드는 제외하고 빌드한다.
배포
$ cd build/libs // jar 파일 있는 곳으로 이동
$ java -jar server-0.0.1-SNAPSHOT.jar
혹시 application.yml
값을 잘못 입력 했으면 수정해주고 다시 빌드 해주면 된다.
꼭 값을 수정해주고 재빌드 하는 것을 잊지 말자!
4. 배포 스크립트 작성
매번 변경된 코드를 pull -> 빌드 -> 배포 과정이 귀찮으니, 배포 스크립트를 작성해 한번에 해결하자.
디렉터리 생성
mkdir app
cd app
mkdir git
cd git
clone 받은 프로젝트 옮기기
이전에 git clone
받은 프로젝트를 app/git/
안으로 옮긴다.
mv -R [디렉토리명] [목적지 디렉토리위치]
// mv -R naem-server/ app/git/
deploy.sh
생성
~app/git$ vi deploy.sh
아래는 deploy.sh
내용이다.
#!/bin/bash
REPOSITORY=/home/ubuntu/app/git
PROJECT_NAME=naem-server
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull origin develop
echo "> 프로젝트 Build 시작"
./gradlew build -x test
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 $REPOSITORY/$JAR_NAME 2>&1 &
스크립트 실행
$ chmod +x ./deploy.sh // 권한 부여
$ ./deploy.sh
확인
netstat -ntl
8080 포트가 LISTEN 임을 확인할 수 있다.
deploy 스크립트 생성
프로세스를 종료하고 싶다면?
$ ps -ef | grep [jar 파일명].jar // pid 확인
$ kill -9 [pid] // 프로세스 중단
Ref.
- https://kanoos-stu.tistory.com/11 - redis
- https://devlog-wjdrbs96.tistory.com/314 - redis
- https://jihyee.tistory.com/21 - mysql RDS
- https://kshman94.tistory.com/17 - utf8 파라미터 변경
💛 개인 공부 기록용 블로그입니다. 👻