[AWS] Spring Boot 프로젝트 배포 해보기

이준영·2023년 9월 16일
2

✍🏻 Note

목록 보기
3/5
post-thumbnail

AWS EC2 서버 인스턴스를 하나 구매해서 해당 서버에 간단한 프로젝트를 배포해 보고 그 경험을 정리해 보려고 합니다.

Spring Boot 프로젝트 배포 해보기

그동안은 localhost:8080에 API 요청을 보내 기능을 테스트 해봤다면, 이제는 배포를 해보고 다른 컴퓨터에서도 API요청을 보낼 수 있도록 해 보려고 합니다.

사전 준비 작업

1. AWS 가입하기
2. FileZilla 설치하기 (.jar 파일을 EC2 서버로 옮기는 것을 매우 쉽게 도와줌)
💡 맥 OS 환경에서의 배포 입니다.


RDS 구매하고 MySQL 세팅하기

RDS 생성하기

  • RDS를 검색하고 결과를 클릭합니다.

  • 데이터베이스 생성을 누릅니다.

  • 표준 생성과 원하는 DB의 종류를 선택 합니다.

  • 프리티어를 선택합니다.

❗️ 요금 부과 방지를 위해 꼭 확인해야 합니다.

https://aws.amazon.com/ko/free/faqs/

  • DB 인스턴스 식별자는 이후 DB가 여러개 만들어져있을 때 어떤 db인지 식별헐 수 있도록 도와줍니다. 원하는 이름으로 지정하면 됩니다.

  • 마스터 사용자 이름과 마스터 암호는 local에서 DB 연결하고 테스트 할 때 사용하던 그 사용자 이름과 암호라고 생각하면 됩니다. DB연결시 필요하니 꼭 기억해야 합니다.

  • 간단한 프로젝트를 올릴거라 스토리지의 용량을 넘어 자동 조절될 일은 없겠지만, 조정이 되게 된다면 비용이 추가로 발생하기 때문에 체크를 해제 해 주겠습니다.

  • 퍼블릭 액세스 기능: "예"

    • 이 설정이 되어있어야 컴퓨터에서 AWS RDS의 MySQL과 연결이 가능합니다.
  • 보안 그룹 새로 생성

    • VPC 보안 그룹 이름은 자유롭게 설정 하면 됩니다. (이후 외부 어디서 DB 접근을 허용 할 것인지 인바운드 설정 진행할 예정)

  • 추가설정의 초기 데이터베이스 이름은 자유롭게 지정하면 됩니다.

❗️ 로컬에서 테스트 하던 db이름에 해당하는 부분입니다. 이후 DB URL에 연결할 때 위 이미지에 작성한 초기 데이터베이스 이름을 넣어주어야 합니다.

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
  • 이후 데이터베이스 생성을 눌러 생성 완료 해주시면 됩니다.



RDS Port 열어주기

  • 생성한 db를 클릭합니다.

  • VPC 보안 그룹에 들어갑니다.

  • 보안그룹 ID를 클릭해 들어갑니다.

  • 인바운드 규칙 편집으로 들어갑니다.

❓ 인바운드 규칙이란 ❓
웹 서버로의 HTTP 트래픽을 허용하거나, SSH로의 원격 액세스를 거부하는 등의 작업을 인바운드 규칙을 사용하여 수행할 수 있습니다. 이렇게 아무곳에서나 요청을 보내는것을 막아 줌으로써 서버를 보호할 수 있습니다.

  • 간단한 테스트만 하고 RDS와 EC2는 닫을 것이기에 어디서나 접근 가능하도록 0.0.0.0/0 으로 지정하여 모든 포트에서의 접근을 허용합니다.

❗️ 0.0.0.0/0 또는 ::/0 을 사용해서 모든 포트에서의 접근을 허용하는 것은 매우 간단하지만, 보안에 신경을 써야합니다. 필요한 경우가 아니라면, IP를 지정하여 최소한의 IP에서만 접근 가능하도록 지정하는 것이 좋습니다.


Intellij 에서 확인하기

  • DB의 엔드포인트를 확인합니다.

  • 배포하려는 SpringBoot 프로젝트를 열고, 우측 Database탭을 클릭합니다.

  • 그리고 위와 같이 MySQL을 추가 해 줍니다.

  • Host 에는 아까 확인한 엔드포인트를 넣어주고, User와 Password에는 db 설정시 지정했던 사용자와 암호를 적어줍니다. 마지막으로 Database 에는 초기 데이터베이스 이름을 적어줍니다.

초기 데이터베이스 이름이 기억나지 않는다면

그림과 같이 DB 상세정보의 구성 탭에 들어가면 DB이름 에서 확인할 수 있습니다.
  • 이후 좌측 하단의 Test Connection 으로 커넥션이 잘 되면 OK 버튼을 눌러 추가해 주면 됩니다.



SpringBoot에 DB 연결하기

application.properties
spring.datasource.url=jdbc:mysql://RDS엔드포인트:3306/DB초기이름
spring.datasource.username=사용자 이름
spring.datasource.password=사용자 암호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
예시

  • DB URL 지정: RDS엔드포인트,포트번호, 초기DB이름 을 넣어주면 됩니다.

  • 지정했던 사용자 암호와 비밀번호를 추가해주고,

  • 등록햇던 DB와 맞는 드라이버와 DB 방언(Dialect) 등을 지정해줍니다.

  • 위와같은 형태로 appliation properties 를 설정하면 됩니다.



EC2 구매하기

EC2 서버 구매하 기

  • EC2에서 인스턴스 시작하기를 누르고 서버 구매를 시작 할 수 있습니다.

  • 위와같이 원하는 이름, OS를 선택해 줍니다 저는 Ubuntudp 22.04 버전으로 선택하였습니다.

  • 프리 티어 무료버전은 인스턴스 유형 우측 상단에서 확인할 수 있습니다. (1년 기한 무료)

  • 서버 접속시에 필요한 key를 생성합니다. 이미 키가 존재한다면 해당 키를 등록해도 됩니다.

  • 키를 생성한다면 key 파일이 다운로드 되는데 이 파일은 서버에 접속할 때 필요하기 때문에 매우 중요합니다.

  • 이후로는 자유롭게 설정하고 인스턴스 시작을 누르면 서버 구매가 완료됩니다.


EC2 서버 접속하기

  • 저희는 다른 물리적 컴퓨터에 존재하는 EC2 서버에 접속하기 위해 SSH(Secure Shell) 로 접속 할 예정입니다. SSH는 접속할 컴퓨터의 22번 포트가 열려있어야 접속 가능합니다.

  • Mac os는 ssh가 있어서 명령어로 바로 접근 가능합니다.

다운로드 한 키 페어의 접근 권한 바꿔주기
sudo chmod 400 생성했던 키페어 저장 경로 
SSH로 접속하기
ssh -i 저장한키페어경로 ubuntu@AWS에적힌내아이피

예)

ssh -i /path/my-key-pair.pem ubuntu@14.123.242.32

EC2 서버 접속 단축하기

  • 내가 구매한 서버에 접속하려면

ssh -i 저장한키페어경로 ubuntu@AWS에적힌내아이피
  • 접속할 때 마다 이러한 명령어를 계속 쳐 줘야합니다. 이 방법은 기억하기도 쉽지 않고 번거롭기 때문에 명령어를 단축해서 서버에 접속해 보려고 합니다.

vi ~/.ssh/config
  • 위 명령어로 ~/.ssh의 위치에 config 파일을

Host myserver 
    HostName AWS에적힌내아이피
    User ubuntu
    IdentityFile ~/Downloads/my-key.pem
  • 이러한 형식으로 접속에 원하는 서버의 아이피와 해당 서버의 키의 경로를 입력후 저장하게 되면

ssh myserver
  • 단순한 명령만으로 EC2서버에 접속할 수 있습니다.

TMI 정보
chmod 명령어로 파일에 대한 권한을 바꿔줄 수 있습니다. 세개의 수는 각각 다른 의미를 가집니다.
첫번째 수는 파일 소유 사용자의 권한
두번째 수는 소유 그룹의 권한
세번째 수는 그 외 사용자의 권한 을 의미합니다.
4는 읽기 2는 쓰기 1은 실행 권한을 의미합니다
6은 4 + 2 로 읽기 + 쓰기 권한을 의미합니다.
위의 400 은 파일 사용자에게 읽기 권한을 부여하는것을 의미 합니다


EC2 에 jar 파일 옮기고 배포하기

배포 파일 빌드하기

  • 우측 탭에서 Gradle을 클릭 한 후 Tasks > build >build를 실행시켜 .jar 파일을 생성합니다.

  • 빌드가 완료되고 나면 좌측 상단 build > libs 폴더에 .jar 파일이 생성된것을 확인 가능합니다.

  • 이제 이 파일을 EC2 서버에서 실행시키면 배포가 완료됩니다.


EC2 서버에 JDK 설치하기

  • 이번 간단한 프로젝트는 자바 17v으로 만들었기 때문에 서버에도 17버전을 설치 해 주도록 하겠습니다.

sudo apt-get update
sudo apt-get install openjdk-17-jdk
java -version

Filezilla를 이용해서 배포파일 업로드 하기

  • Filezilla 좌측 상단 컴퓨터 3대의 아이콘을 클릭하고, 새 사이트를 추가해 오른쪽에 Host IP주소, 포트 (22), 사용자 이름과 key파일을 지정해 주고 연결 합니다.

  • 연결된 EC2 서버로 .jar 파일을 드래그 합니다.

  • 이렇게 파일이 옮겨진 것을 확인 할 수 있습니다.


EC2 에서 스프링 부트 작동시키기

java -jar JAR파일이름.jar
  • EC2(내 가상의 컴퓨터) 에서 해당 명령어를 입력해 스프링 부트를 실행시킬 수 있습니다.

  • 이렇게 EC2 에서 스프링 부트가 작동하는 것을 확인 가능합니다.


AWS 에서 보안그룹 추가하기

  • 좌측 탭의 네트워크 및 보안 > 보안 그룹 으로 들어가 새로운 보안그룹을 생성하고, 인바운드 규칙을 위와 같이 설정해 줍니다.

  • 8080은 SpringBoot의 포트가 8080이기에 열어두고, SSH, HTTP, HTTPS 등의 포트들을 열어줍니다.

  • 이후 서버의 보안 그룹을 기존의 것을 삭제하고, 새로 생성한 보안 그룹으로 교체 해 줍니다.



포트 포워딩 & nohub 적용하기

포트번호 없애기

  • HTTP는 기본이 80포트로 굳이 :80을 붙이지 않아도 자동으로 연결이 됩니다.

  • 포트번호를 명시하지 않아도 자동으로 연결되게 하기 위해서 포트 포워딩(port forwarding)을 사용하겠습니다.


포트 번호 없애기 - 리눅스 자체 포트포워딩을 작동시키기

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
  • EC2 서버에서 명령어 실행 후 다시 서비스를 시작합니다.


SSH 접속을 끊어도 서버가 계속 돌게 하기

  • 로컬에서 SSH의 연결을 끊으면, 즉 맥의 터미널을 종료하면 EC2서버의 스프링도 같이 종료됩니다.

  • 백그라운드에서 서버를 실행시키면 원격 접속이 끊어 지더라도 서버가 계속 돌아가게 됩니다.

# 아래 명령어로 실행하면 됩니다.
nohup java -jar JAR파일명.jar &
  • 이렇게 nohup으로 실행하게 된다면 nohup.out파일이 생성되는데 이 파일에 서버의 모든 로그가 기록되게 됩니다.

# 아래 명령어로 로그 확인 가능
cat nohup.out


서버 강제종료 방법

  • 백그라운드에서 실행되기 때문에 ctrl + c 로도 종료할 수 없기에 pid를 확인해서 종료시켜야 합니다.

# pid 확인하기
ps -ef | grep java

# pid 종료하기
kill -9 [확인한pid값]





참고
profile
작은 걸음이라도 꾸준히

0개의 댓글