프로젝트를 하다보면 초반이건 후반이건 언젠가 배포를 하게된다.
물론 로컬에서만 돌리는 프로젝트도 있긴하지만 배포를 해서 인터넷 상에 내가 만든 프로젝트를 띄우는 것은 꽤나 신기하고 뿌듯한 과정이다.
처음 배포를 할 때 이것저것 시행착오가 많았고 여러 블로그와 다른 조원과 학원 분들과 서로 자료를 공유하며 배포를 성공했을 때는 정말 기분이 좋았고, 이 과정을 글로 남기고자한다 😋
배포 시리즈의 작업과정은 이렇게 진행될 예정이다.
EC2 -> RDS -> 가비아를 통한 도메인 구매 & Route53 -> HTTPS 인증서 발급 -> {배포}
배포는 원하는 과정까지만 진행하고 중간중간 어느단계에서 해도 무관하다.
AWS EC2?
EC2란 AWS에서 제공하는 클라우드 컴퓨팅 시스템이다.
그냥 쉽게 생각해서 로컬이 아닌 아마존이 관리하는 서버 중 하나를 빌려서 나의 프로젝트 파일을 빌드할 수 있는 공간이라고 생각하면 될 것 같다.
(물론 다른 것도 이것저것 할 수 있다)
깊게 들어가면 뭐 많은 내용이 있겠지만 우리의 목표는 서버 배포이니까
바로 본론으로 넘어가자
1. 인스턴스 생성
AWS 가입과정은 생략한다.
아마존이라고 해서 별도의 복잡한 회원가입 절차가 있는 것이아니고 귀찮은 점이라면 아무래도 결제의 요소가 있기 때문에 해외 결제가 가능한 카드를 등록해야 회원가입을 마칠 수 있다.

가입을 마치고 EC2 메뉴에 접속하면 다음과 같은 화면을 볼 수 있다
중요한 주의점은 오른쪽 상단에 서울로 되어있어야 한다.
필요에 따라 다른 리전에 생성해야할 분이 있다면 상관없겠지만 그런 분들이라면 이 글을 안보시지않으려나.. 😛
초기에는 생성되어있는 인스턴스가 없을 것이다. (현재 나는 배포중인 프로젝트가 있어서 생성되어있다)
저기서 한눈에 보이는 주황색 버튼인 인스턴스 시작을 눌러 인스턴스를 생성하자.

시작을 누르면 다음과 같은 인스턴스를 구성할 설정 페이지가 나오게 된다.
이름은 원하는 이름으로 설정하면 된다.
(입력하지 않아도 임의의 값으로 설정된다)

다음으로는 어떤 운영체제의 서버를 생성할지 고르는데 가장 무난한 Ubuntu를 사용하였고 이 글을 쓰는 시점을 기준으로 프리티어에서는 22.04, 20.04 버젼이 사용가능하다.
나는 20.04로 진행하였다.
배포를 처음 시도할 당시에 Ubuntu 버젼에 따라 생각보다 이것저것 많이 달랐다.
이 글에서 설명할 배포방식은 20.04 버젼의 기준에서 무난히 성공했던 버젼으로 같은 버젼을 사용할 것을 권장한다.
아키텍처는 64비트를 사용하였다.

인스턴스 유형에는 프리티어로 사용가능한 t2.micro를 사용한다.

키 페어가 나오는데 매우 중요한 파일이므로 분실하거나 하지 않도록 주의해야한다. 해당 키 파일이 없을 경우 서버에 접속하기 매우 까다로워질 수 있다.

위에서 새 키 페어 생성 버튼을 누르면 다음과 같은 창이 뜨고 키 페어 이름을 정하고 생성을 하면 키 페어 파일을 다운로드 받게된다.

네트워크 설정은 추후에 보안그룹을 따로 생성하여 사용할 예정이다.

스토리지 구성은 기본 값은 8GiB로 되어있으나 프리티어는 최대 30까지 무료이므로 30으로 설정하는 것을 권장한다. (다다익선)
여기까지 설정하고 오른쪽의 인스턴스 시작 버튼을 누르면 인스턴스가 생성된다.
2. 탄력적 IP
인스턴스 서버는 중지했다가 재 시동시 기본 퍼블릭 IP가 변경되어 안정적인 배포를 위해서는 고정된 IP주소를 할당해주어야한다.
주의
탄력적 IP생성 시 인스턴스와 연결되어있지 않거나 연결된 인스턴스가 중지되어있는 경우 과금이 되므로 인스턴스를 사용하지 않을 때는 연결해제, 릴리스를 통해 완전히 제거해주어야 과금되지않는다.
그런데 릴리스를 통해 삭제하게되면 다음에 탄력적 IP를 재생성하더라도 이전과 동일한 주소를 받을 수는 없으므로 상황을 고려하여 판단하도록 하자.

EC2 메뉴에서 아래로 내리면 탄력적 IP 메뉴를 통해 접근이 가능하다.

오른쪽 상단의 탄력적 IP주소 할당을 통해 생성할 수 있다.

별도의 변경사항 없이할당을 통해 탄력적 IP를 할당받자

할당받은 IP에서 작업을 누르면 탄력적 IP 주소 연결을 통해 아까 생성하여 실행 중인 인스턴스에 연결이 가능하다.

이 페이지에서는 인스턴스와 프라이빗 IP주소가 있는데 해당 입력칸을 클릭하면 아까 생성한 인스턴스가 목록에 존재하고 프라이빗 주소 또한 동일하게 설정해준뒤 연결을 통해 인스턴스에 탄력적 IP를 연결해주면된다.

연결 후 인스턴스에 들어가보면 퍼블릭IPv4주소와 탄력적 IP주소에 아까 발급받은 탄력적 IP주소와 같은 주소가 등록되어있음을 확인할 수 있다.
이제 이 주소를 통해 해당 서버에 접근이 가능해진 것이다.
오른쪽에 연결 버튼을 눌러보자

사진에는 가려진 예: 밑부분에 다음과 같은 명령어가 있을 것이다.
ssh -i "키 페어 명.pem" ubuntu@ec2-{탄력적IP주소}.ap-northeast-2.compute.amazonaws.com
해당 명령어를 복사해주고 터미널을 실행시키자
필자는 Mac환경에서 진행했고 윈도우 환경에서는 WSL, Putty 등으로 접속이 가능한 것으로 알고 있다.
각자의 환경에 알맞는 것으로 접근하면 된다.
아까 발급받은 키 페어 파일이 있는 경로에 접근한뒤 해당 명령어를 실행하고
chmod 400 {키 페어 명}.pem
아까 복사한 명령어를 실행시키면 서버에 접속이 가능하다.

3. 보안 그룹 설정
보안 그룹 설정을 통해 인바운드, 아웃바운드 규칙을 설정해주어야 한다.
이 과정을 생략하게되면 접근을 허용하면 안되는 곳에 접근이 될 수도 있고 접근이 필요한 곳에 접근이 되지 않아 서비스 배포 시 이용에 불편이 있을 수 있다.

EC2 메뉴에서 보안 그룹을 선택해서 보안 그룹 메뉴에 접근하자

아까 인스턴스를 생성했을 때 아마 다음과 같은 보안 그룹이 생성되어 있을 것이다.

여기서 설정을 추가하여 바꿔주어도 좋지만 별도의 이름으로 따로 생성하자.
보안 그룹 생성을 통해 생성 페이지에 접근하자

여기서는 보안 그룹의 이름과 설명을 간단하게 작성하면된다.
밑으로 내려가면

인바운드 규칙과 아웃바운드 규칙이 있다.
이 두 용어의 차이는 다음과 같다.
- 인바운드: 외부 -> EC2 내부로의 접근
- 아웃바운드: EC2 내부 -> 외부 접근

기본적으로 많이 사용하게되는 22, 80, 443 SSH, HTTP, HTTPS 포트를 설정하고 우리는 스프링부트 프로젝트를 배포해야하므로 8080 포트를 추가해준다.
그리고 소스를 통해 접근 가능한 IP를 설정하자.
특정 IP를 제외하거나 아니면 특정 IP만 접근하게 하는 것이아니면 보통 Anywhere-IPv4로 설정한다.
SSH는 서버에 직접 접근이 가능해지므로 주의 깊게 설정하는 것이 좋다.
내가 주로 접속하는 곳의 IP로 설정해주는 것이 좋고 만약 여러 사람과 공동 작업이 필요한 경우 그 사람들의 IP도 등록해주어야 접근이 가능해진다.

아웃바운드 규칙은 보통 모든 트래픽을 허용하게끔 설정한다.
디폴트로 되어있으므로 건들일 필요가 없다.

이제 인스턴스 메뉴로 돌아와서 다음과 같이 작업-보안-보안 그룹 변경으로 들어간다.

보안 그룹 선택을 눌러 아까 만든 보안그룹을 선택하여 설정해주면 우리가 만든 보안 규칙이 인스턴스에 적용되게된다.
그리고 보안 규칙은 여러 개를 적용가능하므로 기존의 보안 그룹을 제거해주자.
여기까지하면 EC2 생성과정이 끝나게된다.
별도의 RDS를 연결하거나 도메인 서버를 등록하는 과정이 불필요한 사람은
여기서 바로 배포를 해도된다.
1. AWS EC2 생성 과정 (1/5)
2. AWS RDS 생성 및 EC2 연동 (2/5)
3. AWS Route53 DNS 연결하기 (3/5)
4. Nginx와 Certbot를 통해 인증서 발급 및 Spring boot 프로젝트 빌드하기 (4/5)
5. iptables를 이용한 포트포워딩 (5/5)
Reference.
https://bcp0109.tistory.com/356
https://goddaehee.tistory.com/179