RDS 없이 AWS EC2를 통해서 백엔드 api 테스트 서버 배포해보기
프론트엔드에서 테스트를 하려면 서버가 필요할 것 같아서 서버를 배포해보기로 했다.
모종의 이유로 react js, node js로 개발된 사이트를 ec2를 통해 배포한 경험이 있어서 쉽게 될 줄 알았는데 다른 점이 있어서 어려움을 겪었다!
STEP 1. AWS EC2 인스턴스 생성
EC2>인스턴스>인스턴스 시작 버튼을 누르면 된다.
여기서 주황 버튼을 누르면 됩니다!!
ubuntu 선택 > 24.04 혹은 22.04 선택
기존의 키 페어가 있으면 그걸 써도 좋고 (물론 .pem, .ppk 파일이 존재하는 경우이다...) 없으면 새 키 페어 생성!
키 페어 이름 입력
RSA 선택
.pem 선택 > 키페어 생성 해주면 파일이 다운로드 될 것이다.
이거는 잃어버리면 안된다~~
왜냐면 우리는 이걸로 로그인을 할 것이기 때문이다!!
어쨌든 생성된 키 페어 혹은 기존 키페어를 선택한다.
이제 보안그룹 차례인데 상단의 편집을 눌러주어서 편집을 해준다.
다른 건 건들 필요 없이 보안 그룹 생성!!
ssh는 우리가 원격 호스트에 접속하기 위해 사용되는 프로토콜인데, 여기선 우리가 서버를 배포하기 위해서 접속할 때 사용되는 거라고 보면 될 것 같다! 그래서 보안에 신경써야 되는데 웬만해선 소스 유형을 눌렀을 때 보이는 내IP를 선택하는 게 맞지만, 지금 여기저기를 막 다녀야 되는 상황이라서 불가피하게 일단 0.0.0.0/0으로 설정해주었다.
HTTP, HTTPS는 모두 0.0.0.0/0으로 해준다
mysql도 그냥 0.0.0.0/0으로 해주었는데 사실은 보안을 신경쓴다면 이렇게 하면 안된다 ㅠㅠ
난 진짜 다 털려도 어쩔 수 없는 환경설정을 했다

나머지는 신경 쓰지 않고 인스턴스 생성을 누르면 끝!!
STEP 2. PuTTy로 mysql 설치와 DB 설정
사실 원래는 RDS로 데이터베이스를 배포하려고 했는데 내 뜻대로 잘 되지 않았다...
그래서 EC2 안에 mysql을 깔아서 그 안에 데이터베이스를 만드는 방식으로 하기로 했다!!
그리고 RDS의 경우, 프리티어, 즉 무료로 사용하려면 꼭 public access를 허용해서는 안된다!! ㅠㅠ
그러면 Ipv4 주소를 해당 데이터베이스에 할당하게 되는데 이거는 프리티어에 해당하지 않기 때문이다!!
그래서 rds를 사용하려면 무조건 EC2에 연결하고 EC2로의 접근만 허용하게끔 설정해주어야 한다...
마음 아프게도 나는 이걸 잘 몰랐다!! 그래서 $0.21을 AWS에게 주어야 한다...ㅠㅠ
왜냐면, 옛날 블로그에서는 퍼플릭 액세스 허용을 했었고 그 때는 이게 무료였기 때문이다... 그리고 지금은 유료고요 ㅠㅠ
그때는 맞고 지금은 틀리다 어쩌구...
어쨌든 멀 어떻게 해도 RDS를 접근할 수 없어서 방안을 찾기로 했다.
그래서 GPT에게 물어보았다
🏆 추천 방법 정리
배포 방법 장점 단점 추천 용도
EC2에 직접 설치 | 완전 무료, AWS 내에서 사용 가능 | 직접 관리해야 함 | AWS 내에서 직접 운영할 경우 |
PlanetScale | 무료 플랜 지원, 빠른 배포 | 트래픽 제한 | 손쉬운 MySQL 사용 |
Google Cloud SQL | 관리가 쉬움 | 무료 크레딧 소진 후 유료 | 초기 테스트 |
Railway.app | 무료 데이터베이스 제공 | 트래픽 제한 | 간단한 프로젝트 |
✅ EC2에 MySQL을 직접 설치하면 완전 무료로 운영 가능
✅ PlanetScale, Railway는 무료 플랜이 있어 빠르게 배포 가능
PlanetScale을 사용해보려고 했는데 작년부터 hobby plan이 사라지면서 무료 사용이 불가하다는 걸 알게 되어서 그냥 EC2에 직접 설치하게 되었다 ~
어차피 테스트 용이어서 별로 데이터 양도 별로 없기 때문에 ㄱㅊ을듯
일단 우리는 .pem 파일을 다운로드 받은 상태인데 맥북에서는 그냥 이걸로 바로 가능이지만
나는 PuTTy에서 작업을 해주어야 해서 .ppk로 바꾸는 작업이 필요하다
그래서 일단 PuTTygen 프로그램을 연다
Load를 눌러서 해당 pem을 선택 후 Save public key를 누르면 이제 .ppk 파일을 받을 수 있다.
나는 관리의 편의를 위해서 pem과 ppk의 파일명을 동일하게 설정했다.
이제 PuTTy를 열어준다.
Host Name에는 AWS EC2 인스턴스 중 지금 사용하는 얘를 누르면 아래와 같은 화면에서 퍼플릭 IPv4 주소가 나오는데 이거를 적어주시면 된다!
그리고 PuTTy에서 SSH> Auth > Credentials에서 Private key file for authentication: 여기 하단의 Browse..를 눌러서
우리가 다운로드한 .ppk 파일을 선택하신 후 Open한다!
초기 접속 시 머라머라 창이 뜨는데 accept를 누르면 된다.
그리고
login as라고 나오는데 여기에 ubuntu라고 치고 엔터하시면 된다!
이제 데이터베이스 설정을 해봅시다!!
사실 여기서부터는 완전 챗지피티에게 조종당한 인간처럼 행동했습니다...
✅ MySQL 서버 설치
sudo apt update -y
sudo apt install -y mysql-server
걍 코드 복붙하면 된다...! 근데 여기서 붙여넣기 ctrl+v해도 안되네.. 할 수 있는데 PuTTy 기본 설정으로 마우스 오른쪽 누르면 자동으로 붙여넣기가 가능하닷~~
✅ MySQL 시작 / 자동 실행 설정
sudo systemctl start mysql
sudo systemctl enable mysql
✅ MySQL 보안 설정
sudo mysql_secure_installation
root 비밀번호 설정을 해주고 나머지는 다 Y를 누르면 된다!
✅ 데이터베이스 및 사용자 생성
sudo mysql -u root -p
이걸 치면 이제
Enter Password...: 가 나올텐데 여기서는 이전에 만들어준 root 비밀번호를 입력해준다.
CREATE DATABASE 데이터베이스이름;
CREATE USER '사용자이름'@'%' IDENTIFIED BY '데이터베이스비밀번호';
GRANT ALL PRIVILEGES ON 데이터베이스.* TO '사용자이름'@'%';
FLUSH PRIVILEGES;
EXIT;
데이터베이스이름, 사용자이름, 데이터베이스비밀번호는 기억하고 있기!!
✅ MySQL 원격 접속 허용
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
이 파일에서 bind-address = 127.0.0.1이라고 되어있을 텐데 이거를 bind-address = 0.0.0.0 로 변경해준다!
그리고는 나는 개인적으로 vi 편집기보다 nano가 더 편해서 sudo nano ~이하 동일로 작업해주었다.
vi는 입력할 때는 i , 저장 등을 위해서는 esc를 눌러야 하는데 뭔가 번거롭다고 느껴졌다...
nano는 그냥 입력하면 되고 저장을 위해서는 ctrl + o, 나가려면 ctrl+x를 하면 된다!
파일 변경 저장 후에서는
sudo systemctl restart mysql
이렇게 재시작을 해준다.
mysql -h 지금인스턴스의publicIpv4주소 -P 3306 -u 아까설정한유저네임 -p
이렇게 했을 때 MySQL이 잘 되면 완료된것이다!!
그리고 여기서 포트번호(3306) 앞의 P를 꼭 대문자로 써야 에러가 나지 않는다~
STEP 3. Spring Boot 프로젝트 배포
✅ EC2에서 JDK 설치
sudo apt install -y openjdk-17-jdk
여기서도 자바를 깔아주어야 한다!! 해당 프로젝트에 맞는 버전으로 깔아주면 된다~
✅ EC2에서 Github project clone
github 레포에서 해당 스프링부트를 가져올 것이므로 git을 깔아야 한다.
sudo apt update -y
sudo apt install -y git
그리고 이제 클론!!
git clone https://github.com/your-username/your-spring-boot-repo.git
cd your-spring-boot-repo
당연히 위를 바로 복붙하면 안되구 해당 프로젝트의 git 주소와 repository 이름으로 폴더에 접근해야 한다.
나 같은 경우에는 develop 브랜치에 있는 프로젝트로 테스트를 진행해야하는 상황이라
checkout develop을 해주었다
그리고 application.properties도 수정해서 아까만든 database와 연결해주는 작업도 진행했다.
✅ Gradle 으로 빌드
cd your-spring-boot-repo를 통해 해당 레포안에 있는 상황에서 빌드를 해준다.
근데 빌드 이전에 해주면 좋은 거는
AWS EC2 ./gradlew build시 멈춤 현상
작업 환경IDE: IntelliJSpring Boot: 3.2.3Java: 20EC2 Linux: UbuntuEC2에서 Spring 프로젝트를 Build 할 경우 어느 순간부터 진행률이 멈추고 가만히 있는다.이는 EC2 인스턴스의 메모리 부족으로 인해 발생하는 문
velog.io
이 블로그를 참고해서 스왑 메모리 기능을 통해 RAM 부족 현상을 해결하는 것이다.
처음에 나는 이걸 안해서 빌드 과정에서 계속 멈춰서 진짜 너무 힘들었다...
꼭 하는 걸 추천!! 그러면 완전 빌드가 빠르게 끝난다!!!!!
어쨌든 이걸 해주고 아래의 명령어를 입력한다.
./gradlew build
근데 나는 실행권한이 없는 상태라 안되었는데 이 경우에는
chmod +x ./gradlew로 실행권한을 부여해주면 된다.
빌드가 완료가 되면 build/libs/ 폴더에 .jar 파일이 생성된다. cd와 ls를 통해 해당 .jar 파일의 이름을 알고 있어야 한다.
✅ Spring Boot 실행
nohup java -jar build/libs/your-spring-boot-app.jar --server.port=8080 > app.log 2>&1 &
아까 cd ls로 알아낸 .jar파일의 이름을 넣고 백그라운드 실행을 해준다.
만약에 이후에 업데이트된 사항이 있다면,
cd your-spring-boot-repo
git pull origin main # 나는 develop
./gradlew build
nohup java -jar build/libs/your-spring-boot-app.jar --server.port=8080 > app.log 2>&1 &
위와 같이 동일한 방식으로 진행해주면 된다.
STEP 4. Nginx로 Reverse Proxy 설정 (80번 포트 사용)
✅ Nginx 설치
sudo apt install -y nginx
✅ Nginx 설정 변경
sudo vi /etc/nginx/sites-available/default
server {
listen 80;
server_name your-ec2-public-ip;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server 부분에서 이러한 부분을 추가 혹은 수정해준다.
your-ec2-public-ip 대신 _를 사용하면 더 간편하다...
✅ Nginx 재시작
sudo systemctl restart nginx
sudo systemctl enable nginx
이제 http를 통해 접근이 가능한 상태가 되는데 일부 api의 경우에는 https 인증을 필수적으로 해야한다.
근데 나는 도메인을 아직 구입하지 않은 상태라 자체 인증서를 발급받았는데 조만간 도메인을 구입해서 인증을 해야 할것 같다
배포 완료하고 정리하니 간단한데 하는 중에는 너무 힘들었다... 물어볼 사람도 없고 ㅠㅠ
그래서 혹시라도 나 같은 사람이 있다면 도움 받았으면 좋겠어서 간단하게라도 기록을 남게 보았다.
더 좋은 방법도 있겠지만.... 일단 해두고 나중에 이사를 가야겠다 ㅠㅠ