SpringBoot 프로젝트 EC2 배포하기

jonghyun.log·2022년 10월 22일
40

AWS

목록 보기
1/2
post-thumbnail

이 글에서는 깃헙에 있는 프로젝트를 AWS EC2에 git clone을 통해 내려받아 jar 파일 빌드를 해보겠습니다.

(EC2 인스턴스는 우분투로 진행합니다.
또한 따로 배포 시스템을 구축하지 않고 수동으로 배포하는것만 다뤄볼 예정입니다.)

이 글의 목차는 다음과 같습니다.

  1. AWS 세팅하기
  2. 발급 받은 ssh 키로 Ec2 우분투 콘솔에 접속하기
  3. 우분투 콘솔에서 git ssh 연동후 git clone 하기
  4. 내려받은 파일로 빌드하고 jar 파일 실행시켜 스프링 부트 서버 실행시키기

1. AWS 세팅하기

1-1 AWS Region 설정하기

먼저 AWS 사이트에 접속하고 로그인 한뒤 리전이 서울로 되어있는지 확인합니다.

(다른 리전에 인스턴스를 생성하면 그 지역에 인스턴스가 생성되어 성능도 안좋을 뿐더러 서울 리전에서는 확인이 불가능하니 서울리전으로 맞춰줍시다.)

1-2 인스턴스 생성하기

그 이후 검색창에 EC2 검색후 EC2 대시보드로 들어가 인스턴스 시작을 눌러 인스턴스 생성을 합니다.

우리가 만들 EC2 인스턴스의 이름을 정해주는 항목입니다. 정해주지 않더라도 인스턴스 생성이 가능하나
헷갈리지 않게 이름을 정해주실분들만 해주시면 됩니다.

이제 AMI를 세팅해줄 차례인데 여기서 어떤 종류의 서버로 구성할지 선택합니다.

OS는 원하는것이 있다면 원하는 것으로 해주시면 되고 저는 프리티어가 제공하는 Ubuntu LTS 버전으로 진행하겠습니다.

현재 블로그를 작성하는 시점 기준,

인스턴스 유형은 프리티어를 사용하고 있다면 t2.micro 로 설정해주셔야 합니다.다른 유형으로 설정하면 과금요소가 추가됩니다.

1-3 키 페어 생성하기

키 페어는 EC2 인스턴스에 원격으로 접속하기 위해 필수적으로 필요하기 때문에 생성해줘야 합니다.
또한, 키 페어는 한번 생성하면 두번다시 다운로드 받을 수 없기 때문에 잘 보관하고 있어야 합니다.

키페어 이름을 설정해준 뒤 키 페어 생성을 눌러 생성된 키 페어를 다운받아 주도록 합시다.

(기존에 생성해놓은 키 페어가 있다면 다른 인스턴스에 접근할 키로 사용이 가능하므로 기존에 생성해 놓은 키 페어가 있다면 그것으로 사용하셔도 무방합니다.)

여기서는 방금 생성한 sshKey 로 진행하도록 하겠습니다.

1-4 네트워크 세팅

보안 그룹은 방화벽에 관한 내용인데 이건 추후에 따로 생성해서 세팅해줄 예정이니 넘어가고 기존에 보안 그룹을 생성해두신 분들은 그걸로 하셔도 됩니다.

그리고 보안 그룹 바로 밑에 있는 SSH 트래픽 허용 부분은 EC2 인스턴스를 생성하고 생성한 인스턴스에 저희가 사용하고 있는 노트북이나 데스크톱(로컬 머신) 으로 접속 하기위한 부분이며 이때 SSH 통신을 사용합니다.

SSH 통신을 할때 ip 제한을 어떻게 할것인지에 관한 내용으로 집에서 고정된 ip로만 접근하시는 분들은
내 ip 를 선택해 주시면 되고 저는 노트북으로 카페나 이곳저곳 이동하면서 사용할 일이 많기 때문에
위치무관(0.0.0.0/0)으로 설정해주도록 하겠습니다.

이 설정도 추후에 보안 그룹 탭에서 변경이 가능합니다.

1-5 스토리지 세팅

프리티어는 최대 30 GIB 까지 지원해주므로 30으로 설정해줍니다. (옆의 어드밴스드 탭에서 상세 설정이 가능합니다.)

볼륨 유형은 범용 SSD 로 선택하겠습니다.

만약 Provisioned IOPS SSD (프로비저닝된 IOPS SSD) 를 선택한다면 사용하지 않아도 활성화한 기간만큼 계속 비용이 발생하게 되므로 프리티어를 사용하신다면 주의하셔야 합니다.

1-6 인스턴스 최종 생성

요약이 위 화면과 같다면 인스턴스 시작을 누르고 인스턴스를 생성해 줍시다.

인스턴스가 다음과 같이 생성됐습니다.

1-7 보안 그룹 수정하기

이제 생성한 인스턴스의 보안 그룹을 수정해 주도록 하겠습니다.

보안 그룹이란?
AWS 에서 제공하는 방화벽으로 인바운드 규칙, 아웃바운드 규칙이 존재합니다.

  • 인바운드 규칙(inbound) : 외부에서 EC2RDS 등의 내부로 접근할때 사용되는 방화벽 규칙
  • 아웃바운드 규칙(outbound) : EC2RDS 등의 내부에서 외부로 접근할때 사용되는 방화벽 규칙

우리는 EC2에 접속해서 서버를 띄우는것이 목적이기 때문에 인바운드 규칙만 건드려주도록 하겠습니다.

EC2 메뉴의 네트워크 및 보안 탭의 보안 그룹 을 눌러 보안 그룹 세팅 창으로 들어갑니다.

보안 그룹 생성을 눌러 새로운 보안 그룹을 생성해 줍시다.

위 목록에서 보안 그룹의 이름과 설명을 적으시고

아까 설명한 방화벽 설정을 해주도록 하겠습니다.

인바운드 규칙의 규칙추가를 눌러

다음과 같이 세팅해주도록 합시다.(여기서 0.0.0.0/0 은 Anywhere-IPv4 입니다.)

위에서부터 순서대로

  1. 스프링 부트 기반 서버를 열어줄것이기 때문에 사용자 지정으로 8080 포트를 설정해준 뒤 url을 아는 누구나 접속할수있도록 Anywhere-IPv4 로 설정해줍니다.

  2. 원격 EC2 인스턴스에 접속할때 사용되는 ssh 관련 방화벽으로 저는 밖에서도 접속할 때가 있으므로 저희집 고정 ip가 아닌 Anywhere-IPv4 로 설정했습니다. 또한 ssh는 기본 포트 연결로 22번 포트가 사용됩니다.

  3. HTTP 연결시 사용됩니다.

  4. HTTPS 연결시 사용됩니다.

아웃바운드 규칙은 따로 세팅해주지 않고 기본세팅으로 남기고 넘어가도록 하겠습니다.

1-8 보안 그룹 설정하기

이제 만든 보안 그룹을 아까 만든 EC2에 설정해줄 차례입니다.

EC2 콘솔에 들어가 아까 만든 인스턴스를 클릭하고 위쪽의 작업 -> 네트워킹 -> 보안 그룹 변경 을 눌러주고
기존의 기본 보안 그룹은 체크 해제후 방금 만든 보안그룹으로 교체해줍니다.

보안그룹이 잘 변경되었는지 확인하고 인바운드 규칙 보기 를 눌러 인바운드 규칙이 잘 적용 되었나 확인 해주세요.

2. 발급 받은 ssh 키로 Ec2 우분투 콘솔에 접속하기

이제 EC2를 만들었으니 원격으로 EC2에 접속할 시간입니다.
(아까 EC2를 생성할때 다운받은 ssh 키가 필요합니다.)

방금 만든 EC2 인스턴스가 체크되어있는 상태에서 위쪽의 연결 버튼을 눌러줍시다. 그러면

다음과 같은 연결하는 방법이 친절하게 나와있으므로 이것을 차례대로 따라하기만 하면 됩니다.

이 글에서는 독립 실행형 SSH 클라이언트 방식으로 진행하겠습니다.

위에서 다운받은 ssh 키가 있는 디렉토리로 접근후 터미널을 켜줍니다.

그 이후 설명서에 나와있는대로 명령어로 권한을 바꿔줍시다.

chmod 400 sshKey.pem

권한을 바꿔줬다면 설명서에 나와있는 ssh 명령어로 EC2 인스턴스에 접속해보도록 합시다.

ssh -i "sshKey.pem" ubuntu@ec2-13-125-18-214.ap-northeast-2.compute.amazonaws.com

(여기 나와있는 주소는 제 EC2 인스턴스의 주소이므로 AWS 콘솔 설명서에 나와있는 것을 복사해서 붙여넣기 하시기 바랍니다.)

다음과 같은 창이 나왔다면 EC2 ubuntu 콘솔 접속에 성공한것입니다.

다음에 우분투 콘솔에 접속할때에도 같은 방법으로 접속하면 됩니다. (ssh 명령어 사용)

위 ssh 연결 명령어에 -v 옵션을 주면 ssh 연결 로그도 볼수있습니다.

(혹시나 다시 접속했는데 timeout 에러가 나오시는 분들은 다음 블로그를 참고하시기 바랍니다.
https://devgraphy.tistory.com/entry/EC2%EC%97%90-SSH-%EC%A0%91%EC%86%8D-%EC%A7%80%EC%97%B0-%EC%9D%B4%EC%8A%88)

3. 우분투 콘솔에서 git ssh 연동후 git clone 하기

정적 파일 배포는 방식이 두 가지가 있는데

  1. EC2에서 프로젝트 git clone 후 실행하기
  2. 로컬 머신에서 jar 파일하여 EC2에 복사 후 실행

이 글에서는 1안으로 진행하도록 하겠습니다.

EC2 git clone 하기 구글 검색시 명령어로 yum을 사용하라는 블로그 글이 많이 나오는데
이 글에서는 ubuntu로 진행을 하기 때문에 apt를 사용하셔야 합니다.
yumLinux 명령어로 보통 리눅스로 많이 EC2를 사용해서 그런 블로그 글이 많은 것 같습니다.
필자도 이 내용 때문에 애를 굉장히 먹었기 때문에 이 글을 보시는 분들은 참고하시기 바랍니다.

3-1 깃 설치하기

sudo apt-get install git

위 명령어로 git 설치를 해줍시다.

git --version

설치를 해줬다면 위 명령어로 설치가 되었나 확인이 가능합니다.

깃헙에서 SSH KEY 생성하기

cd ~/.ssh
ssh-keygen -t rsa -C github계정 메일(example@github.com)

위 명령어를 통해 .ssh 디렉토리에서 키페어를 생성하게 되고 id_res.pub 파일이 생성됩니다.

cat id_rsa.pub

cat 명령어로 id_rsa.pub 파일을 출력후 이것을 깃헙 ssh에 저장을 해주어야 합니다.

github -> setting -> SSH and GPG keys 탭으로 이동후 new SSH key 버튼을 클릭

타이틀에는 임의로 정해주시면 되고 key 부분에 복사한 위에서 출력한 id_rsa.pub 값을 넣어주면 됩니다.

git clone 하기

이제 git clone을 하기 위한 준비가 끝났습니다.

깃헙 레포지토리로 이동후 code 버튼 -> ssh 탭을 누르고 나온 주소를 복사해줍시다.

이 복사한 값을 EC2에 접속한 터미널에서 git clone할 디렉토리로 이동후

git clone 복사한 값

이후 yes/no를 선택하라는 탭이 나오는데 yes를 입력해줍니다.

클론이 성공적으로 끝났습니다.

4. 내려받은 파일로 빌드하고 jar 파일 실행시켜 스프링 부트 서버 실행시키기

4-1 빌드파일 생성

이제 클론한 디렉토리로 한번 이동해서 빌드를 실행해 보도록 하겠습니다.

클론한 디렉토리에서 gradlew 파일을 실행시켜 jar 빌드파일을 생성해야합니다.

그전에 기본 EC2에는 자바가 설치되어있지 않으므로

sudo apt install openjdk-11-jdk

으로 자바를 설치해준뒤

./gradlew build

빌드가 성공적으로 끝났다면 build -> libs 디렉토리가 새롭게 생기고

cd build
cd libs

를 통해 해당 디렉토리로 이동해줍니다.

이동했다면 해당 디렉토리에서 ls 명령어로 jar 파일이 생성된 것을 확인해줍시다.

4-2 빌드파일 실행

nohup java -jar manymanyUsers-0.0.1-SNAPSHOT.jar &

다음 명령어로 생성된 jar 파일을 실행해 줍니다. 여기서 파일이름은 생성된 파일 이름으로 수정하시면 됩니다.

nohub 명령어 뒤에 &를 붙이면 벡그라운드에서 실행한다는 의미로 저희가 EC2 콘솔 접속을 끊더라도 실행파일을 계속 실행하라는 명령어입니다.

명령어를 실행시켜도 스프링 부트가 실행되고 있다는 로그가 나오지 않아 실행되는지 잘 모르겠다면

다음의 명령어를 따라하시면 됩니다.

우선 ls 명령어로 libs 디렉토리에 nohub.out 파일이 생성됐는지 확인하고

cat nohup.out

위 명령어로 nohup.out 파일을 출력하면 로그가 나오는것을 확인할 수 있습니다.

(로그를 nohup.out 파일에 저장해놓기 때문에 저렇게 따로 출력해서 확인해줘야 합니다.)

  • 현재 실행된 jar 파일을 끄고 싶다면

jobs

위 명령어로 현재 백그라운드에서 돌아가고 있는 파일을 확인한뒤

(위 사진에서는 인덱스 1번에서 돌아가고 있습니다.)

fg %(인덱스)

위 명령어로 벡그라운드에 돌아가고 있는 프로그램을 가져올 수 있습니다.

현재 1번에서 돌아가고 있으므로 1번을 붙여서 가져왔습니다.

이제 가져온 프로그램을 control + c 로 꺼주시면 됩니다.

꺼준 프로그램을 다시 실행하고 싶으면 위의 과정을 다시 실행해주시면 되겠습니다.

4-3 브라우저 URL로 접속하기

드디어 대망의 마지막 과정입니다. 다시 AWS 콘솔 창으로 이동한 뒤

퍼블릭 DNS 혹은 IP 주소로 된 값 중 아무것이나 복사후 뒤에 :8080을 붙여서 브라우저로 접속해봅시다.

드디어 서버 배포가 완료됐습니다.

마무리

이렇게 AWS EC2 세팅부터 간단하게 git clone을 통한 서버 배포까지 다뤄봤습니다.

위에서 배포한 서버는 https 를 열어주지 않았기 때문에 http 통신만 가능하며
https는 따로 설정을 해주셔야 합니다.
https 를 열어주시려는 분들은 로드밸런서, ACM을 검색해서 설정해주시기 바랍니다.

또한, 서버 ip가 고정 ip가 아닌 유동적 ip 이기 때문에
고정적 ip를 사용하시려는 분들은 탄력적 ip 주소를 검색해서 사용하시기 바랍니다.
탄력적 ip 주소 는 ip값이 청구되기 때문에 위 포스팅에서는 다루지 않았습니다.

7개의 댓글

comment-user-thumbnail
2022년 10월 22일

프론트 배포도 알려주세요~

답글 달기
comment-user-thumbnail
2023년 4월 17일

이분께 최고인듯요 감사합니다

답글 달기
comment-user-thumbnail
2023년 8월 27일

안녕하세요 제 프로젝트로 따라해보다가 gradlew 실행하는 부분에서 permission denied 라는 오류가 발생해서 sudo로도 build명령어를 실행했지만 command not found 라는 오류로 실행이 안되네요 ㅠㅠ 어떻게하면 실행할 수 있을까요?

1개의 답글
comment-user-thumbnail
2023년 10월 17일

감사합니다

답글 달기
comment-user-thumbnail
2023년 12월 5일

덕분에 첫 배포 성공하였습니다! 감사합니다

답글 달기
comment-user-thumbnail
2024년 4월 14일

감사합니다 현재 aws rds 인스턴스를 생성하기 전에 ContextTest()에서 JDBC connection 타임아웃 문제로 빌드가 실패했는데, 생성한 다음에 다시 적용해보겠습니다 꿀팁 공유 감사합니다 :)

답글 달기