[내일배움캠프 Spring 심화] 2024.07.31 TIL

박상훈·2024년 7월 31일

[내일배움캠프] TIL

목록 보기
2/20

어제 완성했던 My Select Shop 프로젝트를 AWS의 EC2, RDS를 활용해 배포하는 과정을 거쳤다. EC2와 RDS를 이용하면 손쉽게 서버 컴퓨터, 데이터베이스를 대여할 수 있다.

과정

AWS 계정 생성

이메일, 비밀번호, 결제 수단을 등록하고 가입 시 프리 티어 계정이 생성된다. 1년간 프리 티어 사양의 EC2, RDS 서비스를 무료로 사용할 수 있다.

프리 티어 FAQ(클릭)


Amazon EC2 Linux 또는 RHEL 또는 SLES t2.micro 인스턴스 750시간 사용(1GiB 메모리, 32비트 및 64비트 플랫폼 지원) – 매월 지속적으로 실행하기에 충분한 시간
Amazon EC2 Microsoft Windows Server† t2.micro 인스턴스 750시간 사용(1GiB 메모리, 32비트 및 64비트 플랫폼 지원) – 매월 지속적으로 실행하기에 충분한 시간

Amazon RDS 단일 AZ 마이크로 DB 인스턴스 750시간 무료 사용(MySQL, MariaDB, PostgreSQL, Oracle BYOL 또는 SQL Server Express Edition 실행) – 매월 지속적으로 DB 인스턴스를 실행하기에 충분한 시간. 또한, 20GB의 데이터베이스 스토리지와 20GB의 백업 스토리지를 제공.


위와 같이 프리 티어 서비스를 제공하고 있기 때문에 하나의 프리 티어 사양 인스턴스를 기준으로 한 달 내내 켜두어도 1년간은 비용이 청구되지 않는다.


RDS 생성

RDS 서비스를 이용해 데이터베이스를 생성한다. 프로젝트에서 사용했던 mysql을 사용하며, 아래와 같이 템플릿 설정에서 프리 티어를 선택한다.

그 외에 퍼블릭 액세스 기능, VPC 보안 그룹, 새 VPC 보안 그룹 이름, 가용 영역 설정을 마치고 초기 데이터베이스 이름 설정 후 데이터베이스를 생성한다.

데이터베이스가 생성되었다면, RDS 포트를 열어주는 작업을 수행해야 한다. 생성된 데이터베이스를 클릭하고 연결 & 보안 > 보안 > VPC 보안 그룹의 링크를 클릭한 후 보안 그룹 ID를 클릭, 인바운그 규칙 편집을 클릭한다.

아래와 같이 규칙을 생성하고 "규칙 저장"을 클릭한다.


RDS 연결

스프링 부트 설정을 바꾸기 위해 application.properties에 아래의 내용을 추가한다.

spring.datasource.url=jdbc:mysql://나의엔드포인트:3306/shop
spring.datasource.username=나의USERNAME
spring.datasource.password=나의패스워드
spring.jpa.hibernate.ddl-auto=update

패스워드는 노출되면 안되므로 github와 같이 공개된 사이트에 업로드 할 때에는 .gitIgnore 설정을 통해 업로드를 제한해두는것도 잊지 말자.


EC2 생성

Quick Start 항목에서 원하는 OS를 생성한다. 나는 Ubuntu 24버전을 사용했다. 사양은 프리 티어 사양으로 설정하였다.

생성 과정에서 키 페어를 발급받고, 내 컴퓨터 내에 저장해둔다. 서버 접속 시 매우 중요한 항목이니 따로 백업해두도록 하자.


EC2 접속

윈도우의 경우 gitbash를 실행하고, 아래를 입력하면 EC2에 원격으로 접속할 수 있다.

ssh -i 받은키페어를끌어다놓기 ubuntu@AWS에적힌내아이피

git bash를 종료할 때는 exit 명령어를 입력하여 ssh 접속을 먼저 끊어주도록 하자.


배포하기

intellij에서 작성한 Spring boot 코드를 빌드하면 아래와 같이 .jar 파일이 생성된다.

해당 파일을 Filezilla를 이용해 EC2 컴퓨터에 업로드한다. Filezilla를 이용해 내 컴퓨터에서 EC2 컴퓨터의 파일을 제어하기 위해 키 페어 파일이 필요할 수 있다. EC2 생성 과정에서 발급받은 키 페어 파일을 사용한다.

EC2에서도 RDS와 마찬가지로 인바운드 규칙 편집을 진행해야 한다. 아래와 같이 진행한다.

이후 아래의 url로 접속 시 접속이 잘 되는것을 확인할 수 있다.

http://내 public 아이피:8080

포트포워딩

지금은 8080 포트에서 웹 서비스가 실행되고 있어서 매번 뒤에 :8080이라고 붙여줘야 한다. 포트 번호를 없애기 위해 어떻게 해야할까?

HTTP 요청에서는 80포트가 기본이기때문에, 굳이 :80을 붙이지 않아도 자동으로 연결이 된다. 포트 번호를 입력하지 않아도 자동으로 접속되기 위해 80포트로 오는 요청을 8080 포트로 전달하게 하는 포트포워딩을 사용한다.

아래의 포트포워딩 룰을 입력하여 리눅스 자체 포트포워딩을 작동시킨다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

이후 다시 서비스를 시작하면 포트 번호를 떼고 접속할 수 있다.


ISSUE 발생

EC2를 생성할 때 운영체제를 Ubuntu 24.xx버전을 사용하였다. 그래서 아래와 같이 포트포워딩을 하였음에도 불구하고 포트를 제거한 url로는 접속이 되지 않았다.

왜 그런것인지 이유를 찾다가 24.xx버전은 ip 설정과 관련하여 이슈가 있다는 튜터님의 말에 22.xx 버전으로 EC2 인스턴스를 재생성 후 배포 과정을 진행해보았다. 그랬더니 포트 번호 없이도 접속이 잘 되는것을 확인할 수 있었다.

24.xx 버전에서는 기본 명령어가 nftables로 변경된 듯 하다. 참고 자료(클릭)


백그라운드 실행 적용

돌아 와서, SSH 접속을 끊어도 서버가 돌게 하도록 하기 위해 아래의 명령어를 실행한다.

nohup java -jar JAR파일명.jar &

서버를 강제로 종료하는 방법은 아래와 같다.

# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다
ps -ef | grep java

# 아래 명령어로 특정 프로세스를 죽인다
kill -9 [pid값]

배포 과정에서 약간의 문제가 발생했지만 튜터님의 지도를 받아 문제를 잘 해결할 수 있었다. 그리 어렵지 않은 과정에도 크고 작은 문제는 발생 한다. 혼자서 해결되지 않을 때는 외부의 도움을 받는것도 좋은 것 같다.

profile
안녕하세요

0개의 댓글