AWS에 Spring Boot 프로젝트 배포 2 - EC2 세팅&배포

차곡차곡·2024년 8월 19일
0

SpringBoot + React

목록 보기
8/9
post-thumbnail

Spring Boot AWS RDS 연결 및 사용
지난 글에서 AWS RDS를 세팅하고, 데이터베이스를 연동했다!
이제 EC2로 실제 백서버를 구동시키고 계속 구동될 수 있게 설정해보자.

EC2란?
Amazon Web Services(AWS)에서 제공하는 클라우드 컴퓨팅 서비스로 가상 서버를 제공한다.

📱보안그룹 생성

0. EC2 > 보안그룹 > 보안그룹 생성

1. 보안그룹 이름 및 설명 설정

  • 모두 영어로 써줘야 함

인바운드 규칙 설정 및 생성

  • 서버포트에 맞춰서 인바운드 규칙 추가
  • HTTP 연결은 80번 포트로 들어오는데, 4000으로 포트포워딩

인바운드 규칙 (Inbound Rules)
인바운드 규칙은 외부에서 인스턴스로 들어오는 네트워크 트래픽을 제어합니다. 이 규칙은 특정 IP 주소, IP 범위, 포트 번호, 프로토콜 등을 기반으로 설정됩니다. (밖에서 안으로 들어올 때 설정되는 규칙)

  • 이후 보안그룹 생성 완료

🛠️ AWS EC2 생성 및 설정

0. EC2 인스턴스 > 인스턴스 시작


1. 이름 및 서버 설정



2. 인스턴스 유형 및 키페어 설정

  • 인스턴스 유형은 프리티어 사용 가능한 걸로
  • 키페어는 생성 누른 후, 이름과 유형을 선택하고 다운로드 해서 저장 필수 (추후에 인스턴스 연결할 때 계속 사용됨)


3. 네트워크 설정 (보안그룹 설정)

  • 앞서서 만들어둔 보안그룹 설정 선택


4. 스토리지 구성

  • 프리티어 제공 용량에 맞춰 선택

🛠️ AWS EC2 가상 서버 접속

  • 인스턴스 연결창으로 들어가면, 여러가지 연결 방법이 나오는데 SSH 클라이언트를 이용해서 연결해보자!

  • 키페어가 저장된 위치로 가서 터미널 실행

  • 아래에 적힌대로 터미널에 ssh -i "키페어이름" ubuntu@퍼블릭ip주소 입력

  • 이후 접속하겠냐고 물으면 yes 누르고, 기다리면 서버에 접속된다.


🛠️ 배포파일 빌드 및 EC2 접속

배포란 무엇인가?
쉽게 말하자면 빌드 파일을 서버에 올려서 가동 시키는 것!
위에서 EC2로 가상서버를 연결했으니, 아래에선 빌드하고 EC2 설정을 마저하도록 하자.

0. 스프링부트 빌드

vscode

  • 그래들 플러그인 설치 후 bootJar를 누르면 빌드 파일이 생성된다.


intelliJ


오른쪽 구석에 Gradle을 눌러주고(본인 프로젝트는 Gradle로 했음)

build 밑에 톱니바퀴모양 build를 더블클릭해주면 빌드가 시작된다.

  • 빌드파일은 빌드>libs에 저장된다

  • build 밑에 libs를 보면 ~~~.jar 파일이 있다. 이게 빌드된 배포파일이다. EC2에 올려서 실행시키면 서버가 돌아가는 것이다.

다른 개발환경

cmd -> 해당 프로젝트 경로에 가서 gradlew.bat build로 jar 파일 생성 ( Test 폴더에서 Testapplication 있으면 빌드가 안됨 )
실수했다면 gradlew.bat clean으로 밀었다가 다시 시도해보자.


1. 가상서버 (EC2)에 JDK 설치

  • 배포파일을 올리기 전에 생성한 EC2 인스턴스에 자바 프로젝트 구동을 위한 JDK를 설치해주자.
    SSH로 접속한 상태에서 아래와 같이 명령어를 쳐서 설치하면 된다.
  • 프로젝트에서 SpringBoot 3.x를 사용중이기 때문에 자바 17로 설치한다.
sudo apt-get update // 동기화 한번 해주기
sudo apt-get install openjdk-17-jdk // 자바 17 설치
java -version // 버전 확인

다음으로 FileZilla 라는 프로그램을 이용해서 EC2 인스턴스로 배포파일을 전송해보자.


2. 가상서버 (EC2)에 빌드 파일 전달

https://filezilla-project.org/download.php?type=client

  • FileZilla 다운 후 가상서버를 연동시킨다.
  • 맨 위 표시된 버튼을 눌르면 사이트관리자가 뜬다.
  • New site를 눌러서 추가한다.

  • 프로토콜은 SFTP로 바꿔주고 호스트에는 EC2 인스턴스의 퍼블릭IP를 넣어준다.
  • 사용자는 위에서 git bash로 SSH 접속할때 @ 앞에붙인 이름을 말한다.(운영체제)
  • 로그온 유형은 키 파일 - EC2 생성할 때의 그 키페어가 맞다.
  • 참고로 퍼블릭 ip주소는 인스턴스에서 확인가능하다.

  • 연결.

  • 화면을 기준으로 왼쪽이 내 로컬 컴퓨터

  • 오른쪽이 EC2 인스턴스 (가상 컴퓨터)이다.

  • 오른쪽 리모트 사이트에 적당한 디렉터리를 하나 만들어주자

그리고 드래그 앤 드랍으로 옮겨준다.


3. 가상서버 (EC2)에서 빌드

  • 다시 터미널로 돌아가서, 가상서버에 들어가고 만들어둔 디렉터리로 들어가서 jar파일을 실행시킨다.
ssh -i 'c:/pair/cine-pair.pem' ubuntu@??.???.???.??? // 해당 주소로 이동하기

~$ cd /home/ubuntu/cine 이동하기

git bash에서 옮긴 파일이 있는 디렉터리로 이동해서 ls 명령어를 쳐보면

다음과 같이 파일이 정상적으로 옮겨진 것을 확인할 수 있다.

그리고 다시 git bash에서

java -jar 파일이름.jar

쳐주면 익숙한 구동화면이 나오게 된다.

  • 스프링부트가 구동되면 빌드는 완료!
  • 이후 퍼블릭ip/포트번호 로 접속해보자. (문제 없으면 완료!)
  • 만일 여기서 접속이 안된다면, EC2 인스턴스에서 보안그룹에서 인바운드 규칙을 잘못했거나 빌드 파일이 손상된 것...

퍼블릭IP:8080 치고 접속을 해보자!
하지만 접속이 안된다..

  • 이유는 8080 포트를 아직 열어주지 않았기 때문이다.
  • EC2 인스턴스에서 8080 포트를 열어주자
  • 근데 80번 포트도 열어줘야한다.
  • 기본 HTTP 연결은 80번 포트로 들어가는데 그 요청을 8080으로 포트포워딩 해줄 것이기 때문이다.

이전 글에서 RDS세팅할 때, 보안그룹을 설정한 것 처럼 보안그룹으로 들어가서 다음과 같이 인바운드 규칙을 편집해주자

그 다음 접속해보면 접속이 되는것을 확인할 수 있다.

여기까지 됐으면 배포가 완료된 것이다. 하지만 문제가 있다.
git bash를 꺼버리면 서버가 다운된다.
그럼 AWS에 배포한 의미가 없지않나??
그리고 주소뒤에 붙은 8080포트도 없애고 싶다.


4. 가상서버 (EC2) 무중단 배포

  • 위에서 서버는 터미널이 닫히면, 서버가 종료된다. 그럼 AWS에 배포한 의미가 없기 때문에 원격 접속이 끊어져도 구동될 수 있도록 만들자.

  • nohup사용

nohup java -jar 빌드파일.jar &로 jar파일을 실행시킨다.

이후 터미널을 종료해도 가상서버는 잘 돌아간다.

물론, 터미널 끌 때는 exit 명령어를 이용해서 셀을 꺼줘야 함!

5. 가상서버 (EC2) 무중단 배포 종료

  • 작동 중인 프로세스 보기
    ps -ef | grep java 로 java가 들어간 프로세스를 확인한다.

  • 서버를 아예 종료시키려면 실행되고 있는 프로세스를 kill 명령으로 죽여주면 된다.

kill -9 19221

6. 포트포워딩

먼저 위에서 설명했듯이 HTTP 기본 연결포트는 80번 포트이다.
즉, 80번 포트로 들어오는 연결을 8080으로 포트포워딩을 해주면
뒤에 8080포트를 적지 않아도 알아서 8080으로 연결된다는 소리다.

git bash에서 다음 명령어를 쳐주자.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

  • 이 명령은 "라우팅 정보를 가지고 있는 테이블이 있는데, 앞으로 80으로 들어오는 포트번호는 8080으로 해석해라" 라고 입력해놓는 것이라고 한다.

서버를 재시작 해주고 8080을 떼주고 접속해보면 잘된다.

profile
계단식 성장

0개의 댓글