스프링부트 프로젝트 EC2에 배포하기(w.과금)

가온·2024년 10월 25일

저번 성장일지에 적었던 스프링부트 프로젝트 코드를 마무리하고 EC2에 배포를 진행했다.

예전 MVP를 배포할 때는 Heroku를 썼다가 과금 되는 걸 보고 호다닥 카드를 취소하고 클라우드타입을 썼었는데, 클라우드 타입은 배포가 간단했다.
물론 한 번에 성공하진 못함.

다만 무료 버전은 매일 서버를 직접 켜줘야하는 불편감이 있었고, 그래서 한동안 아침에 일어나서 가장 먼저하는 일이 클라우드 타입 서버를 키는 거였다.
굉장히 피곤했음.
다행인 건 10명 정도에게 뿌렸고 사용자가 한 명이었다는 거?ㅎ

그래서 이번엔 AWS EC2를 이용해보기로 했다.
백엔드 서버는 보통 EC2에 배포하는 것 같기도 하고, 수동으로 켜줄 필요도 없고, 프리티어는 웬만하면 무료로 이용가능하다고 했다.
그리고 예전에 받아둔 크레딧도 있었다.
근데 이틀만에 10달러가 과금되었다.
3일차엔 12달러로 늘어남;;
하마터먼 베타버전 출시하기도 전에 파산할 뻔했다.
AWS는 정말...무서운 곳이구나...

그래서 이번엔 과금 주의 사항도 적을 겸, 백엔드 서버를 EC2에 처음 배포해보면서 겪은 에러 일지를 작성해보고자 한다.

공식문서와 구글링을 참고하면서 진행했지만, 이해가 안가는 부분은 역시 GPT와 함께 했다.
개발할 때 정말 도움되는 게 GPT지만, 위험한 것도 GPT다.
그러나 무작정 코드 복붙하면서 물어보지 않고, 모르는 부분을 설명해달라고 하면서 진행하면 공부에도 도움이 되었다.
또 개발 진행하면서 가장 어려운 것 중 하나가

빨리 완성하기 VS 머리에 남기면서 진행하기

중에 잘 선택해서 하는건데, 전자로만 진행하다보면 머리에 남는 게 없고 다음에 똑같은 문제를 보고 어? 이거 기출문젠데? 근데 풀이가 기억이 안나 상태가 반복된다. 물론 후자는 너무 오래 걸린다.

적절히 섞어가면서 해야하는데, 이럴 때도 GPT가 도움이 되었다. 마지막에 GPT한테 오늘 내가 질문했던 부분들의 문제원인과 해결책을 정리해달라고 하면 싹 정리해준다.

그래서 이게 그 부분.

EC2 배포 에러 일지

1. EC2 배포 후 MySQL 연결 문제

  • 문제: 로컬에서는 잘 연결되던 MySQL이 EC2에 배포한 후에 "Access denied for user 'testChokko'@'localhost'" 오류가 발생.
  • 해결 방법:
    • MySQL 연결 URL에서 localhost 대신 EC2의 퍼블릭 IP 주소 사용.
    • MySQL 설정 파일에서 바인딩 주소를 0.0.0.0으로 변경하여 외부에서 접근할 수 있도록 설정.
    • MySQL 사용자의 권한 확인 및 퍼블릭 IP에 대한 권한 추가.

2. Swagger 버전 문제

  • 문제: SpringDoc과 Swagger 관련 버전 충돌로 인해 빌드가 실패.
  • 해결 방법:
    • springdoc-openapi-ui 버전을 2.x대로 업데이트 (implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0').
    • 필요 없는 중복 의존성 제거 (springdoc-openapi-ui:1.6.9 삭제).

3. JPA 연결 문제

  • 문제: "Unable to open JDBC Connection for DDL execution" 오류가 발생하여 JPA 연결 실패.
  • 해결 방법:
    • MySQL 사용자 권한을 확인하고 적절히 설정.
    • JDBC URL에서 localhost를 퍼블릭 IP로 변경.

4. 로그 파일 찾기

  • 문제: tail -f app.log 명령어로 로그 파일을 찾을 수 없었음.
  • 해결 방법:
    • 실제로 로그는 nohup.out에 기록되고 있어서 tail -f nohup.out으로 확인.

5. Gradle 빌드 권한 문제

  • 문제: ./gradlew: Permission denied 오류 발생.
  • 해결 방법:
    • chmod +x ./gradlew 명령어로 실행 권한 부여.

6. Whitelabel Error Page

  • 문제: 배포 후 접속 시 404 오류 발생.
  • 해결 방법:
    • 정상적으로 애플리케이션이 실행되었으며, API 경로가 지정되지 않았을 때 보여주는 기본 오류 페이지임.
    • Swagger나 API 주소를 사용하여 정상적인 엔드포인트 확인.

7. MySQL 멈춤 문제

  • 문제: EC2 인스턴스에서 MySQL이 자주 멈추는 문제.
  • 해결 방법:
    • 가상 메모리(Swap)를 추가하여 메모리 부족 문제 해결.
    • sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 명령어로 1GB 크기의 swap 파일 생성.
    • sudo mkswap /swapfilesudo swapon /swapfile으로 swap 활성화.

아 근데 MySQL 다운받다가 계속 멈추는 문제를 해결하다가 프리티어에서 이틀만에 10달러가 과금되는 문제를 발생시켰다!

사용자는 나랑 팀원 둘 뿐인데!

이틀에 10달러면... 하루에 5달러고...
한 달이면 150달러인데...

안돼
백수는 돈이 없다.

부랴부랴 구글링을 했고 문제 원인은

8. IOPS, 처리량 프리티어 최대로 설정

이것 때문이었다.
다운이 안되길래 그냥 프리티어 한도 내에서 최대로 늘린 것 뿐인데...
프리티어는 프리티어가 아니었다.
프리의 뜻이 나 모르게 바뀌었나?
자유롭게 나의 돈을 가져가겠다는 뜻이었던걸까?
AWS는 이런 식으로 돈을 벌고 있었구나
너무 무서워요

다시 기본으로 줄였더니 다음날 아침에 12달러로 늘긴했지만, 그건 늦게 반영된 부분이었던 것 같고
그 이후로는 과금이 되지 않고 있다. 제발

물론 우분투 서버가 계속 멈추는 일도 이젠 일어나지 않고 있다. 당연함. 저게 문제가 아니었음.

휴...
그리고
12달러 내고 배운 EC2 서버 배포 방식

EC2 서버 배포 방법

  • EC2 접속
cd /c/Users/admin/.ssh
chmod 400 "pem키"
ssh -i "pem키" ubuntu@~~
  • 보안그룹 설정 - 인바운드 규칙 - SSH/HTTP/HTTPS/사용자지정TCP/MYSQL

  • git clone, 빌드 및 실행
#  git 설치
sudo apt-get install git
git --version
# SSH KEY 생성
cd ~/.ssh
ssh-keygen -t rsa -C "깃 이메일"
# github -> setting -> SSH and GPG Keys -> new SSH key
cat id_rsa.pub
git clone "ssh 코드 복사한 값" # yes 입력
  • 빌드 파일 생성
# JDK 23 설치(오라클에서)
wget https://download.oracle.com/java/23/latest/jdk-23_linux-x64_bin.tar.gz
# 압축 해제
sudo tar -xvzf jdk-23_linux-x64_bin.tar.gz -C /opt/
# 환경 변수 설정
sudo nano ~/.bashrc
export JAVA_HOME=/opt/jdk-23
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bashrc
java -version
  • 빌드
./gradlew build -x test # text 제외
cd build/libs
ls
nohup java -jar '파일명'-0.0.1-SNAPSHOT.jar &
# 로그 파일 출력
cat nohup.out
  • MySQL 설치
# MySQL 패키지 설치
sudo apt update
sudo apt install mysql-server
# MySQL 보안 설정
sudo mysql_secure_installation
# 실행 확인
sudo service mysql status
# MySQL 접속
sudo mysql -u root -p
  • 가상 메모리(Swap) 추가 방법
# 빈 스왑 파일 생성(1GB)
sudo fallocate -l 1G /swapfile
# 스왑 파일 권한 설정
sudo chmod 600 /swapfile
# 스왑 파일로 저장
sudo mkswap /swapfile
# 스왑 활성화
sudo swapon /swapfile
# 스왑 파일 영구 적용
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

여기까지가 현재 진행상황이다.
내가 java로 백엔드까지 만들고 있을 줄이야.
내가 개발을 하고 있을 줄이야.
일단 백엔드는 배포까지 끝났지만, 프론트와 협업하는 과정에서 수정할 부분이 꽤 있었다.
근데 프론트와 협업할 때 백엔드 로그를 계속 백엔드 개발자가 따로 보내주는건가?
협업하는 방식도 공부해야겠는데... 어디서 해야할까

사실 이번주에 프론트까지 배포를 하려고 했으나, 생각보다 에러가 발목을 잡아서 조금 미뤄지게 되었다.
그리고 이제 내가 프론트를 공부해서 프론트에 합류할 예정이다!
창업을 준비하다 풀스택 개발자로...?
라고 말하기엔 실력이 부족하다.

지난 MVP는 빠르게 내는 것에 집중하다보니 너무 기능이 없어서 사용자에게 주는 차별성이 없었고,
이번 베타버전은 기능을 최소한으로 넣되 필수적인 건 꼭 동작하게 하려고 하다보니 시간이 길어지고 있다.

그 사이의 적정선을 찾는 게 정말 어려운 일인 것 같다.
근데 또 개발은 나름 재밌는 듯.
이러고 다음주에 컴퓨터에 대고 내가 너한테 대체 뭘 잘못했냐고 고해성사하고 있을지도 모르지만...

0개의 댓글