이 글에서는 스프링부트 프로젝트를 EC2에 git clone하여 배포를 진행하는 과정을 작성합니다. (EC2는 우분투로 진행하며, AWS 가입과 putty설치는 되어 있다고 가정하여 생략합니다.)
먼저 AWS 사이트에 접속하고 로그인 한뒤 리전이 서울로 되어있는지 확인합니다.
리전에 따라서 인스턴스 위치가 결정되기 때문에 외국으로 하면 속도가 낮을 수도 있습니다.
만약 대한민국이 아닌 다른 나라에 서비스 하려면 그 도시를 선택해도 됩니다.
인스턴스 메뉴로 들어가 인스턴스 시작 버튼을 클릭합니다.
이름은 프로젝트에 맞게 지어도 되고, 생략해도 됩니다.
AMI 는 어떤 서버로 구성할지 선택하는 겁니다.
여러 종류가 있어서 원하는 걸 선택하면 되고, 저는 프리 티어에 Ubuntu LTS 버전을 선택했습니다.
인스턴스는 프리티어 내에 지원하는 것을 선택하시면 됩니다.
키 페어는 EC2 서버에 SSH 접속을 하기 위해 필수라서 생성해야 합니다.
"새 키 페어 생성" 을 눌러 원하는 이름을 적고 생성합니다.
또한, 키 페어는 한번 생성하면 두번다시 다운로드 받을 수 없기 때문에 잘 보관하고 있어야 합니다.
보안 그룹은 방화벽에 관한 내용인데 이건 추후에 따로 생성해서 세팅해줄 예정이니 넘어가고 기존에 보안 그룹을 생성해두신 분들은 그걸로 하셔도 됩니다.
그리고 보안 그룹 바로 밑에 있는 SSH 트래픽 허용 부분은 EC2 인스턴스를 생성하고 생성한 인스턴스에 저희가 사용하고 있는 노트북이나 데스크톱(로컬 머신) 으로 접속 하기위한 부분이며 이때 SSH 통신을 사용합니다.
SSH 통신을 할때 ip 제한을 어떻게 할것인지에 관한 내용으로 집에서 고정된 ip로만 접근하시는 분들은
내 ip 를 선택해 주시면 되고 저는 노트북으로 카페나 이곳저곳 이동하면서 사용할 일이 많기 때문에
위치무관(0.0.0.0/0)으로 설정해주도록 하겠습니다.
이 설정도 추후에 보안 그룹 탭에서 변경이 가능합니다.
프리티어는 최대 30 GIB 까지 지원해주므로 30으로 설정해줍니다. (옆의 어드밴스드 탭에서 상세 설정이 가능합니다.)
볼륨 유형은 범용 SSD 로 선택하겠습니다.
만약 Provisioned IOPS SSD (프로비저닝된 IOPS SSD) 를 선택한다면 사용하지 않아도 활성화한 기간만큼 계속 비용이 발생하게 되므로 프리티어를 사용하신다면 주의하셔야 합니다.
위의 과정을 모두 끝냈다면 하단에 인스턴스 생성을 클릭하면 됩니다.
이제 생성한 인스턴스의 보안 그룹을 수정해 주도록 하겠습니다.
보안 그룹이란?
AWS 에서 제공하는 방화벽으로 인바운드 규칙, 아웃바운드 규칙이 존재합니다.
- 인바운드 규칙(inbound) : 외부에서 EC2나 RDS 등의 내부로 접근할때 사용되는 방화벽 규칙
- 아웃바운드 규칙(outbound) : EC2나 RDS 등의 내부에서 외부로 접근할때 사용되는 방화벽 규칙
우리는 EC2에 접속해서 서버를 띄우는것이 목적이기 때문에 인바운드 규칙만 건드려주도록 하겠습니다.
EC2 메뉴의 네트워크 및 보안 탭의 보안 그룹 을 눌러 보안 그룹 세팅 창으로 들어갑니다.
보안 그룹 생성을 눌러 새로운 보안 그룹을 생성해 줍시다.
위 목록에서 보안 그룹의 이름과 설명을 적으시고
아까 설명한 방화벽 설정을 해주도록 하겠습니다.
인바운드 규칙의 규칙추가를 눌러
다음과 같이 세팅해주도록 합시다.(여기서 0.0.0.0/0 은 Anywhere-IPv4 입니다.)
위에서부터 순서대로
스프링 부트 기반 서버를 열어줄것이기 때문에 사용자 지정으로 8080 포트를 설정해준 뒤 url을 아는 누구나 접속할수있도록 Anywhere-IPv4 로 설정해줍니다.
원격 EC2 인스턴스에 접속할때 사용되는 ssh 관련 방화벽으로 저는 밖에서도 접속할 때가 있으므로 저희집 고정 ip가 아닌 Anywhere-IPv4 로 설정했습니다. 또한 ssh는 기본 포트 연결로 22번 포트가 사용됩니다.
HTTP 연결시 사용됩니다.
HTTPS 연결시 사용됩니다.
아웃바운드 규칙은 따로 세팅해주지 않고 기본세팅으로 남기고 넘어가도록 하겠습니다.
다시 인스턴스로 돌아와서 "보안 그룹 변경" 버튼을 눌러줍니다.
방금 생성한 보안그룹을 추가해줍니다.
다시 인스턴스 설정을 보면 보안 그룹이 적용된 것을 볼 수 있습니다.
만약 제대로 보이지 않는다면 새로고침을 한번 해주세요.
AWS EC2 인스턴스는 서버를 중지하고 다시 실행시키면 퍼블릭 IP 가 변경되기 때문에 클라이언트가 사용할 수 있는 변하지 않는 IP 가 필요합니다.
탄력적 IP (Elastic IP) 란 외부에서 인스턴스에 접근 가능한 고정 IP 입니다.
탄력적 IP 는 만들어놓고 사용하지 않더라도 과금이 되기 때문에 필요한 만큼만 생성하는 것이 중요합니다.
메뉴에서 탄력적 IP 를 찾아서 들어갑니다.
아직 아무것도 할당받은 게 없기 때문에 새로운 IP 를 추가합니다.
딱히 변경할 건 없고 바로 할당을 선택해서 만들어줍시다.
방금 생성한 탄력적 IP 를 선택해서 연결을 시도합니다.
설정 화면에 들어가면 현재 내 인스턴스 목록을 선택할 수 있고 연결된 프라이빗 IP 까지 선택 가능합니다.
탄력적 IP 를 연결하고 다시 인스턴스 정보를 확인해보면 IP 가 할당된 것을 볼 수 있습니다.
퍼블릭 IP 주소도 기존 값에서 탄력적 IP 주소로 자동으로 변경되었습니다.
다른 배포 블로그를 살펴보면 putty를 사용하여 서버에 접속하는 설명은 잘 못보았습니다.
다음과 같이 쉽게 설명이 나와 있기 때문에 따라하면 되지만 저는 학부시절에 리눅스 수업시간에 활용해보았던 putty를 이용하여 ssh 클라이언트로 서버에 접속하겠습니다.
만약 putty 설치가 되어 있지 않다면 다음 블로그를 참고해서 설치하면 좋을 것 같습니다.
puttygen이란 프로그램을 실행시키면 밑의 창이 뜹니다.
기본 값으로 두고, Load를 눌러서 ec2 인스턴스를 생성할 때 다운로드하여두었던 PEM키를 불러옵니다.
만약 제대로 불러왔다면 다음과 같이 Save private key가 활성화 되었을 것이고, 버튼을 눌러 저장해줍니다.
Private key file for authentication에 Browse를 눌러서 서버 SSH 접속을 위한 .ppk를 입력 후 아까 생성한 .ppk 파일을 로드합니다.
그리고 다시 옆 메뉴 중 제일 상단 Session을 눌러서 화면으로 돌아옵니다.
입력되어 있는 값들을 매번 서버에 접속할 때마다 불러오기 귀찮으므로 Saved Session 밑의 빈칸에 이름을 정해주고 옆에 Save를 눌러줍니다.
그리고 제일 밑의 Open을 눌러서 서버에 접속합니다.
해당 인스턴스에 따라 다르지만, 우분투를 사용하는 경우 ubuntu를 입력하면 로그인에 성공합니다.
위의 과정까지 완료했다면 현재 EC2 인스턴스가 생성되고 ssh 접속까지 완료된 상태입니다.
서버를 배포하는 가장 간단한 방법은 2가지 입니다.
저의 경우는 2번으로 진행하였으므로 혹시나 1번으로 진행하실 분은 다른 블로그를 참조하면 좋을 것 같습니다.
기본 EC2에는 자바가 설치되어있지 않으므로
sudo apt install openjdk-11-jdk
으로 자바를 설치해줍니다.
java -version
명령어로 설치 여부를 확인할 수 있습니다.
git clone 깃허브주소
다음 명령어로 깃허브에 있는 파일을 불러옵니다.
git clone에 성공했다면, 해당 파일로 이동 후 빌드를 진행합니다.
cd 프로젝트이름
으로 파일 이동 후
./gradlew build
빌드에 성공했다면 build->libs 디렉토리가 생성 됩니다.
cd build/libs
로 이동 후 파일을 살펴보게 되면 다음과 같이 jar파일이 생성되어 있을 것입니다.
nohup java -jar server-0.0.1-SNAPSHOT.jar &
명령어로 빌드파일을 실행하면 됩니다. (여기서 파일이름은 생성된 파일 이름으로 수정하시면 됩니다.)
nohup 명령어 뒤에 &를 붙이면 벡그라운드에서 실행한다는 의미로 저희가 EC2 콘솔 접속을 끊더라도 실행파일을 계속 실행하라는 명령어입니다.
명령어를 실행시켜도 스프링 부트가 실행되고 있다는 로그가 나오지 않아 실행되는지 잘 모르겠다면
cat nohup.out
명령어를 통하여 로그를 확인할 수 있습니다.
(로그를 nohup.out 파일에 저장해놓기 때문에 저렇게 따로 출력해서 확인해줘야 합니다.)
또한 작업중인 jar파일을 알고 싶다면 다음 명령어를 사용하시면 됩니다.
ps -ef | grep jar
다음 명령어를 통해 작업중인 jar파일 목록을 알 수 있습니다.
만약 실행을 취소시키고 싶다면
kill -15 PID
를 통해 취소 시킬 수 있습니다. (-15는 정상종료, -9는 강제종료 입니다.)
https 적용은 로드밸런서, ACM등 작업할 것이 많아 글이 길어 질것이므로 추후 작성하도록 하겠습니다.