[게시판 만들기] AWS를 이용한 배포

수박참외메론·2022년 6월 18일
0
post-thumbnail

[스프링 부트] 게시판 무작정 따라하기

위의 링크 한코딩님의 유튜브를 그대로 따라한 프로젝트다.
유튜브 강의를 무작정 따라하면서 하나하나 왜 사용했는지, 다른 방법과의 비교를 하며 소화시킬 예정이다.


개인적인 생각정리

위의 강의에서는 다루지 않았지만 개인적으로 yolo 모델 학습할 때 나름 AWS ec2 instance를 사용해봤으므로 배포까지 해보고 싶다.

전에 인턴했을 때는 윈도우 클라이언트 프로그램을 개발했었는데 당시엔 지점마다 DB와 서버를 두고 클라이언트 프로그램이 돌아가도록 했었다. (서버도 MSSQL)
그렇게 하면 사실 지점이 아무리 크더라도 컴퓨터 100대를 넘기는 힘들었으므로 서버 단에서 동시성 제어라던지 이런 저런 문제가 발생하지 않았어서 사실상 백엔드 개발자는 없었다고 볼 수 있을 것 같다.
그래서 내가 당시에는 클라이언트(웹으로 따지면 프론트?) 를 다뤘었고 주변 팀원들도 다 프론트 기능 개발을 했었던것 같다.

그런데 이런 B2C 같은 무작위의 유저가 들어오는 상황이라면 많은 트래픽도 고민해봐야 하고... 유저가 많다는 이유 하나만으로 발생할 수 있을 문제가 많을 것 같다.
어쨌든 웹 서비스 배포까지 해보자.

로그인을 하고 들어가 본 첫 페이지이다.

EC2 Instance 생성

일단 가상 서버를 생성하기 전에 AWS root 계정을 사용하지 말고 EC2 전용 IAM 계정을 만들어서 진행하는 것이 보안상 좋다고 한다.
뭐 예를들어 AWS root계정을 통해 가상 서버를 개설했을 때 해커가 접근 키를 해킹하면 내 AWS계정 전체를 송두리째 컨트롤 할 수 있다는 말인것 같다.
근데 만들어봤는데 IAM 계정으로 다시 접속해야되는건가? 나중에 더 알아보기로 하고 그냥 root 계정으로 인스턴스 만들기로 해보자.

instance 를 시작하는 화면이다. 인스턴스 명부터 설정해주자.

그다음 인스턴스의 OS image 를 골라준다. 나는 Ubuntu 18.04 가 익숙해서(뭐 명령어 치는것부터 해서 mariaDB설정 등 하던대로 하면 될 것 같아서?) 해당 이미지를 선택했다. 나중엔 아마존 이미지도 시도해봐야지.

인스턴스 유형도 프리티어인걸로 골라주고
여기서 중요한 '새 키 페어 생성' 을 해줘서 pem 파일을 로컬 컴퓨터에 가지고 있어야 한다.
로컬컴퓨터에서 ssh 연결할 때 필요하므로 만들어서 로컬에 잘 보관해주자.

그다음 웹 서버로 만들거기 때문에 네트워크 설정에서 http https 트래픽 허용에 체크를 해준다.
근데 사실 나는 spring boot 프로젝트에서 8000 포트로 연결할 거라고 명시했는데 안 필요할 수도 있을 듯

인스턴스가 생성 완료되었다는걸 aws ec2 탭에서 확인할 수 있다.

ssh -i [pem 파일 경로] ubuntu@[ec2 instance public ip]

위의 명령어로 ssh로 pem 파일을 활용하여 public ip로 연결시도 완료.

ec2에 서버 키기

이제 ec2 instance를 키는걸 해냈으니 거기서 서버를 돌리는 작업을 해야한다.
이 작업을 하려면
1. 사용할 DB 및 기타 환경설정
2. 서버코드(나의 경우 spring boot) 를 빌드하여 실행파일을 ec2 환경에 옮긴다
3. aws ec2 환경설정에서 통신할 port 를 열어주고 port forwarding까지 진행

그럼 일단 내 프로젝트에서 사용한 mariaDB 설치를 해주자.

1. MariaDB 설치

sudo apt-get install mariadb-server

apt-get install 명령어로 mariaDB Server을 설치해준다.

처음에 마리아 데이터베이스 클라이언트에 접근하려면 sudo 키워드를 붙여서 접근해야된다. 안그러면 그냥 permission denied 뜨면서 접근이 안됨.

use mysql 을 한 다음 user 테이블을 확인해본다.
root 계정에 비밀번호 설정과 plugin 을 변경해야지 root 계정으로 mariaDB에 접근할 때 내가 설정해둔 비밀번호로 접근이 가능하다.


update user set password=password('1234') where user='root';
update user set plugin='mysql_native_password' where user='root';
flush privileges;

위의 명령어들을 통해 비밀번호와 plugin을 바꿔준다.

그리고 나와서 sudo 를 붙이지 않고도 접근이 가능하다는 걸 확인이 가능하다.

이후에 mariaDB안에서 사용할 DB와 테이블을 미리 만들어줬다.
나는 GUI 클라이언트로 테이블 생성이나 쿼리문 작성하는게 편해서 mysql workbench에서 테이블 생성하는 코드를 복붙하여 원격서버에 테이블을 생성해줬다.

2. 실행파일 옮기기

나는 java spring boot 로 gradle 프로젝트를 진행해서

gradlew build

명령어로 빌드를 해서 jar 파일을 만들어줬다.

이 파일을 scp 명령어를 통해 instance안으로 이동시켜줬다.

scp -i [pem파일 경로] [실행파일 경로] ubuntu@[인스턴스 ip]:[인스턴스 목적지] 

3. AWS port 설정 및 port forwarding

AWS ec2 instance 의 port를 열어둬야 브라우저에서 해당 서버에 접근이 가능하다.
spring 서버에서 설정해둔 8000번 서버를 열어주도록 하자.

aws 사이트에서 인스턴스의 보안탭으로 가주자.

인바운드 규칙을 편집해야 한다.

규칙추가를 누르고 포트 범위를 8000으로 설정

아까 이동시켜준 jar 파일을 실행시킨다.

서버의 ip:port번호로 로컬 컴퓨터의 브라우저에서 접근이 가능한 것을 확인할 수 있다.

포트포워딩

우리는 보통 브라우저 주소창에 도메인을 칠 때 포트번호까지는 안친다.(사실 도메인 네임을 치니 ip 도 숫자로 치지는 않지만 ㅎㅎ)
이게 포트번호를 안치고도 접속이 가능한 이유는 사실 http 로 접속하면 80번 포트로, https 로 접속하면 443번 포트로 따로 포트번호를 입력하지 않더라도 자동적으로 접속하기 때문에 가능하다.

하지만 프로젝트를 진행하다보면 해당 서버의 포트를 80번, 443번으로 매번 설정을 못하는 상황이 있을 수도 있으니, 다른 포트를 여는 경우가 많다.(예제에서는 다들 8080 포트로 열더라..)
그래서 80번 (443번) 포트로 접속하더라도 (포트번호를 입력하지 않더라도) 자동적으로 서버에서 열어놓은 포트로 접속할 수 있도록 하는 기술이 port forwarding이다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port [내가 설정한 포트번호]

위의 명령어로 나의 경우는 80번 포트로 들어왔더라도 REDIRECT to port 8000 이 되는 것이다.

포트번호를 설정하지 않더라도 접속이 완료되는 모습이다.

profile
하루하루는 성실하게 인생전체는 되는대로

0개의 댓글