다잘하고싶어

[Spring프로젝트]AWS EC2를 사용한 배포 본문

프로젝트회고

[Spring프로젝트]AWS EC2를 사용한 배포

챙영잉 2022. 10. 12. 13:58

배포 관련된 기본 지식은 아래 포스팅 참고하기

2022.10.04 - [프로젝트/배포] - 배포관련 기본 개념 정리

 

배포관련 기본 개념 정리

- AWS, VOC, EC2 https://22chaechae.tistory.com/4 AWS, VOC, EC2 AWS = 아마존의 클라우드 서비스 클라우드 서비스 : 컴퓨터가 가상의 공간에 있다고 가정하고 자유롭게 쓰는 것. AWS는 IaaS(Infrastru..

22chaechae.tistory.com

배포순서

1. AWS 가입 후, 데이터베이스 생성하기

2. 생성한 데이터베이스와 인텔리제이 연결하기(스프링부트 빌드하기)

3. 스프링부트와 mysql 연결하기 (서버키면 가상 컴퓨터와 연결된 db에 우리가 만든 테이블이 생성된다.)

4. 우분투 설치 후 접속해서, 디렉토리 생성하기

5. 배포파일 다운받기(gradle 자동으로 빌드해준 jar 파일다운)

6. Ec2 서버에 자바 설치하기 

7. fileZilla 로 파일 업로드 하기( jar 파일 업로드해주기)

8. 8080 포트와 80 포트 열어주고 포트포워딩해주기

9. SSH 접속이 끊기더라도 계속 사용할 수 있게 해주기

10. 도메인 구입후 붙이기

 


AWS 가입하고 로그인 한다.

아래 링크 접속한다

https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2#

상단의 검색창에 RDS 검색한 후, 데이터베이스 생성으로 이동한다.

표준생성과 MySQL 클릭하고, 템플릿은 프리티어 선택한다.(1년 무료버전)

 

DB 인스턴스 식별자에는 원하는 이름 입력하고,

마스터 사용자 이름정보와 마스터암호를 설정한다. ( 이 이름과 암호는 따로 적어두기! -> DB 접속 시 계속 사용한다)

 

가용영역은 아무거나 선택

데이터베이스가 생성되고 시간이 지나면 상태가 생성중에서

사용 가능으로 바뀐다.

 

여기서 확인할 수 있는 엔드포인트 값도 계속 사용할 것임! 

 

인바운드 규칙에서 규칙 추가 버튼을 클릭한다

포트범위 3306

소스 anywhere IP6, IP4 두개 설정

규칙저장함

3306 포트의 소스 0.0.0.0.0/~~로 보인다.

 

포트를 열어줬다?

: localhost8080 -> 내 컴퓨터에서 8080이라는 방에 서버를 띄웟다는 뜻.

즉, 우리가 aws 라는 컴퓨터의 3306 이라는 방에 우리가 원하는 mysql이 돌아가고 있다는 뜻

이때, 원래 3306포트는 우리만 접근이 가능해야함.

그러나 일단 누구나 접근할 수 있도록 설정해둔다.

 

 

코드스피넷 rds 대시보드 그 안에서 앤드포인트 번호 복사하기

-> 이 주소를 통해서 mysql 접근 가능. 

 

 

스프링 부트 빌드하기

 

그리고 인텔리제이 켜준다. ( 빌드툴은 gradle을 사용했다.)

우측 데이터베이스 탭에서 

 

데이터베이스 탭 -> datasource -> MySQL 선택한다

name : 원하는 이름 입력한다 (안중요함)

host: 복사해온 앤드포인트 번호 입력

user: 설정한 아이디와 비밀번호

testConnection : wiya(원하는 이름)

testConnection 하면 success 뜬다

 

testConnection 안된다면? 데이터베이스 삭제하고 다시 해보기.

기다리면 생성된 wiya 데이터베이스 보인다.

 

여기까지의 과정이 AWS 위에 DB 만들고, 그 DB와 인텔리제이를 연결한 것이다!

 

스프링부트와 mysql 연결하기

application.properties 에

url, username, password 입력하고 (아까 기억해두라고 한 것)

서버키면 가상 컴퓨터와 연결된 db에 우리가 만든 테이블이 생성된다~~!!

짠!

데이터가 잘 들어가는지도 확인해본다.

 

ec2 구매하기

먼저 운영체제를 설치해야한다. (우리는 리눅스의 ubuntu 설치) 

ubuntu 18.04 LTS.. 선택

위의 버전이 안보인다면 더 많은 버전 보기 클릭 후 선택하기 

설치 한 후, AWS 로 돌아와서 우측상단의 인스턴스 시작

생성된 인스턴스 우클릭해서 

 

검토 및 시작 클릭

여기서

키페어 = 아이디랑 비밀번호를 대체하는 나를 증명할 수 있는 키. 를 의미한다.

 

그렇다면 왜 키페어를 사용해야할까?

보안이 철저해야하기 때문이다. 따라서 "파일로 보안을 증명" 하는 것이다. 

새 키페어 생성을 클릭한 후,  키페어 이름을 설정한 후(이름은 그냥 파일이름이니까 안중요하다)

키페어 다운로드를 하면 (설정한이름.pem)으로 된 파일 다운로드 된다. 

저장위치를 잘 기억하기. 앞으로 보안증명할 때 사용해야한다.

 

 

인스턴트를 중지하고 싶다면 오른쪽 마우스 누르고 인스턴스 중지(없애고 싶으면 인스턴스 종료=삭제) 하면 된다.

프리티어 1년만 무료이므로, 사용 후에는 중지나 종료를 꼭 해주기!

아니면 본인도 모르는 사이 계속 과금될 수 있다. 

 

여기서 알아두고 갈 정보

SSH 란?

: SSH(secure shell protocol) 다른 컴퓨터에 접속할 때 쓰는 프로그램.

다른 것보다 보안이 상대적으로 뛰어나다. 

보안탭 -> 보안그룹 -> 인바운드규칙 -> 포트번호 22번이 열려있는 것을 확인할 수 있다.

접속할 컴퓨터의 22번 포트가 열려있어야 접속가능하다.

그런데 aws ec2의 경우에는 이미 22번포트가 열려있으므로 따로 설정할 필요가 없다.

 

우분투 접속하기

이제 우분투에 접속해보자!.

맥 : 터미널 열어서  아래 명령어를 입력한다.

sudo chmod 400 /--.pem. (아까 다운받은 키페어 파일을 드래그해서 넣어준다)

그리고나서 비밀번호 입력한다.

그리고 나서  

 ssh -i --.pem(파일 드래그 하기) (스페이스:한칸띄우고 )ubuntu@(IP) 입력
 
 ssh -i --.pem ddd.pem ubuntu@12.3.4

이때 ip는 aws의 인스턴스 화면에서 오른쪽으로 쭉 가면 퍼블릭 ipv4dns 에 주소가 있다 복사해서 붙여넣기

엔터누르고,  are you sure?? 나오면

yes 입력하기

 

사진의 맨 아래와 같이 접속한 후 ubuntu@ip~~ 초록색 글자 있으면 접속 성공한 것 이다.


(+) 간단한 리눅스 명령어

clear -> 깨끗하게 하기 

mkdir wiya(파일명) -> 파일 만들기

ls -> 파일 확인

cd -> change directory(디렉토리 이동)

명령어를 어느정도 치고나서 tab키 누르면 자동완성됨

한번 세팅을 하고나면 위로가기 방향키 누르면 이전에 입력한 명령어를 다시 사용할 수 있다.


 


배포파일 빌드하기

 

우측의 gradle 클릭 -> task -> build 더블클릭 하면 아래 창이 꿈틀꿈틀거린다 == 그래들이 자동으로 빌드해주고 있는 것.

gradle의 좋은점

1. 라이브러리를 잘 갖다 쓸수 있도록 해준다.

2. 빌드 자동으로 해줌

 

빌드가 끝나고 왼쪽에 build 클릭하고 lib 클릭해보면 snapshot.jar 파일이 생성된 것을 확인할 수 있다.

 

만약 plain.jar 와 그냥 jar 파일이 2개가 생겼다면?  

plain.jar는 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고

소스코드와 클래스 파일과 리소스 파일만 포함한 파일이다.

우리가 사용할 것은 그냥 jar 파일이다!

 

다시 

ssh -i (pem) ubuntu@EC2IP 입력(퍼블릭 아이피주소)

입력하고

 

ec2 서버에  자바를 설치하는 과정! ( openJDK )

터미널로 와서 

sudo apt-get update

입력해준다

 

(+)

 sudo == superuser do 라는 뜻

 apt == 우리가 여러가지를 받아올 수 있는 저장소

 -get update == apt를 받아오기 전에 업데이트 해주기

sudo apt-get install openjdk-11-jdk

(자바 깔고 있는 과정)

java -version

입력 했을 때 OpenJDK1.8.0 이런 게 나왔으면 끝이다!

 

 

filaZilla 로 파일 업로드하기

filezilla 킨다. (없으면 다운로드 하기)

왼쪽상단에 컴퓨터 세계 연결되어있는 것.

거기서 new site  클릭하면 사이트가 새로 생성된다.

새롭게 생긴 사이트의 이름을 원하는 대로 바꿔주기

 

일반 탭 -> SFTP 선택, host 사용한 IP 입력( 나갈땐 exit 입력하면 1.3.~~ 뜬다) 이게 바로 ec2 퍼블릭 아이피

로그온 유형 : 키파일 (찾아보기 해서 다운받은 pem 파일 클릭 후 열기) 하고 연결

사용자는 ubuntu

연결하기 해서 알 수 없는 호스트 뜨면, 확인 누르면 된다.

 

하고나면 왼쪽이 로컬, 오른쪽이 ec2 이다.

로컬(왼쪽)에서 

사용자 아래에  .jar 파일 찾는다 (IdeaProject -user - wiya clone - 찾아들어가기)

그 파일을 드래그해서 오른쪽(ec2) 빈 공간에 넣는다.

그러면 좌측 아래에 올라가는 걸 볼 수 있다.

 

다시한번 터미널에서 

ssh -i (pem) ubuntu@EC2IP 입력(퍼블릭 아이피주소)

입력하고, ls 적으면

옮긴 jar 파일을 확인할 수 있다.

그걸 자바로 실행시켜봐야함(=서버키기)

 java -jar wiya(파일이름)

하면 시작한다.

 

자 이렇게하고나면

크롬에서 ip주소:8080 하면 접속돼야한다.

근데 안된다.

 

왜?

8080이랑 80이 막혀있기 때문이다.

이때, 80도 함께 열어줘야하는 이유는 80이 기본포드이기 때문에,

나중에 ip주소가 아닌 다른 도메인 주소를 입력해서 들어가기 위해서는 80도 함께 열어줘야한다.

다시 aws 가서 ec2

보안탭에서 보안그룹 클릭 -> 인바운드 규칙 ->여기서 80이랑 8080 열어준다. (아래사진처럼)

인바운드규칙 편집 -> 이때 유형은  http(s 없는거) 선택, 나머지는 사진참고.

그러면 규칙이 수정되었습니다 뜸.

그 다음에 ip 입력해서 들어가보면??? 

 

접속이 된다!!!! 

(2022년 10월10일 오후 8시 첫 배포한 날^0^)

 

포트포워딩

이제 8080을 떼고 url을 입력하더라도 원하는 페이지로 이동할 수 있도록 포트를 바꿔주어야 한다 = 포트포워딩

우리는 리눅스에서 제공하는 포트포워딩 기능을 사용할 예정이다.

 

먼저 스프링부트 terminate 종료 (ctrl +c) 해준다.

 

그리고 아래의 명령어를 입력한다.

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

 우리는 로컬에서 포트를 8090으로 설정해두었기 때문에 일단 8090으로 해줬다. 

그리고 java -jar wiya~~.jar

(앞서 말했지만 어느정도 쓰고 tab 누르면 자동완성 된다)

포트포워딩 안되는 문제 발생?

이때, 우리는 포트포워딩이 안됐다.( 8080을 떼고 입력하면 원하는 페이지 안열림)

이유는? 80으로 연결되는 포트가 여러개로 설정되어있을 때, 포트포워딩 안될 수 있다. 

 

포트포워딩 관련 명령어

sudo iptables -t nat -L 

현재 포워딩한 포트를 확인한다 ( 이때, 여러개이면 잘못된 것 == 포트포워딩 안되는 이유)
sudo iptables -D PREROUTING -t nat -i eth0 -p tcp —dport 80 -j REDIRECT —to-port 5000
80포트에서 5000으로 리다이렉트 것을 제거하는 명령어이다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 80 -j REDIRECT —to-port 8080
80포드로 접속시 8080으로 리다이렉트 하게 만들어 주는 명령어이다.

자세한 내용은 아래의 두 블로그 참고하면 된다.

확인해보니 여러개의 포트가 연결되어 있었다. 

그런데 앞에 설명한 명령어로는 포트포워딩 설정이 삭제되지않아서, 설정된 순서번호?로 삭제했다.

명령어는 위의 사진 참고하기. (자세한 설명은 출처 블로그를 참고하면 된다)

 

포트포워딩 오류를 해결하니 제대로 연결됐다!!

 

이제는 ssh 접속이 끊어지더라도 계속 사용이 가능하도록 해야한다.

 

명령어는 

$ nohup java -jar(자르파일) &

 

입력하고 엔터 2번을 치면 된다.

이제 ssh 끊어져도 연결이 계속 된다

 

만약 원격컴퓨터의 서버를 종료하고 싶다면?

다시 접속한 후, 아래의 명령어를 입력하면, 현재 돌아가고 있는 파일이 보인다.

ps -ef |  grep java

 

ubuntu 옆에 뜬 숫자(그때그때 다르다) 그걸 없애주면 된다

kill -9 (뜬 숫자)  입력

다시 ps -ef |  grep java  쳐보면 접속안됨.

 

다시 시작하기 위해서는?

$ nohup java -jar 파일 이름 &

하면 된다.

 

도메인 붙이기 

이제 거의 다했다.

나는 가비아 라는 사이트에서 도메인을 구매했다.

 

dns 주소 도메인 연결

설정 -> 레코드 수정 

추가할 ip 입력

타입 : A

호스트이름 : @

아이피 : (퍼블릭 아이피 복사)

확인 누른다

 

 

이렇게 배포를 마쳤다. 짝짝짝!!

 

 


REFERENCE

https://seongbindb.tistory.com/128 [SeongbinDB:티스토리]

 

https://steady-snail.tistory.com/314 

 

[iptables] 등록되어있는 정책 제거 (feat. --line-numbers)

웹 서버를 구성할 때 포트포워딩(예를들어 8080 포트로 접근 시 80포트로 이동시키는) 방법에는 지금 내 수준에서는 아래 2가지다. 1. 정적 리소스를 담당하는 웹 서버를 앞에 두고 뒤에 WAS를 따로

steady-snail.tistory.com