intro : 백엔드 api 서버를 배포하는 방법에 대해서 알아보자.
배포란 무엇인가 ?
배포란, 다른 사용자들이 인터넷을 통하여 우리가 만든 서비스를 이용할수 있게 하는 것을 말한다. 쉽게 이야기하면 내가 만든 웹 사이트나 서버를 다른 사용자가 사용하려면 인터넷 상에 배포가 되어 있어야 한다. 배포를 하게되면 localhost가 아닌, IP(124.87.9.8)나 도메인(www.naver.com)과 같이 고유한 주소를 받게 되고, 다른 컴퓨터에서 그 주소로 접속할수 있게 된다. 이게 바로 배포이다.
EC2란?
EC2는 Elastic Compute Cloud
의 약자로 C가 2번 들어가서 EC2로 명명되었다. 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스 이다. 쉽게 이야기하면 하나의 컴퓨터를 의미한다.
EC2를 왜 사용해야 할까?
서버를 배포하기 위해서는 컴퓨터가 필요하다. 내 노트북을 통해서도 배포할 수 있다. 다만 24시간 내내 컴퓨터를 켜 두어야 하고, 전기세도 많이나갈것이다. 또한 다른 사용자들이 내 컴퓨터에 접속할수 있어야하니 보안적으로도 굉장히 취약할 것이다. 그렇기에 이러한 불편한 점을 해소시켜주는 기능이 제공되는 AWS EC2를 사용하는 것이다. 이외에도 오토스케일, 로드밸런싱 등 다양한 부가 기능을 제공하기도 한다.
프론트 서버도 EC2에 배포하나요?
프론트 서버도 EC2에 배포할 수 있다. 다만 vercel
, netlify
, AWS S3
를 주로 사용한다. EC2는 백엔드 서버를 배포하는데 주로 사용 된다.
EC2 설정하기
가장먼저 다음과 AWS 링크를 이동하여 회원가입을 진행하고, 로그인을 진행한다. 로그인 진행 후 접속하면 다음과 같은 화면을 마주하게 된다.
Step1. EC2 리전(Region) 선택하기
리전(Region) 이란 ?
인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 말한다. 좀 더 쉽게 설명하면 내가 컴퓨터를 빌려서 원격으로 접속할 컴퓨터의 위치 즉 지역을 의미한다.
리전(Region)의 특징
AWS는 전세계적으로 다양한 Region을 보유하고 있다. 각 Resion은 고유한 이름이 있다. (버지니아 북부는 us-east-1, 오하이오는 us-east-2 등 고유한 이름을 보유한다.)
리전(Region)을 선택하는 기준
사람들이 애플리케이션을 사용할 때는 네트워크를 통해 통신하게 된다. 이 때 사용자의 위치와 애플리케이션을 실행시키고 있는 컴퓨터의 위치가 멀면 멀수록 속도가 느려진다.
따라서 애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전을 선택하는게 유리하다.
다음과 같이 리전(Region)을 아시아 태평양(서울)
으로 선택하자. 다른나라로 선택하면 안된다. 그 이유는 아래에서 자세하게 설명한다.
많이 하는 실수 (주의사항)
AWS는 리전마다 EC2가 각각 관리되고 있다, 즉 서울에서 EC2를 만들었는데 리전을 버지니아 북부로 변경하면 나의 EC2가 보이지 않는다는 말이다. 이럴때는 당황하지 말고 AWS 콘솔창에서의 리전 설정값을 잘 확인해보자.
Step2. EC2 셋팅하기 - 기본 설정
AWS 콘솔창의 검색창에서 EC2
로 검색한다. 아래 이미지와 같이 검색 후 클릭하여 이동한다.
그 이후 다음과 같은 화면이 나오는데 여기서 인스턴스 시작 버튼을 클릭한다.
이름 및 태그
그러면 아래와 같이 화면이 나오는데, 가장 먼저 해야할 부분은 이름 및 태그
부분에 EC2 인스턴트 끼리 식별할수 있는 이름을 작성한다. 이름을 신중히 작성하는게 좋은데, 그 이유는 인스턴스는 결국 컴퓨터이고 해당 컴퓨터가 어떤 역할을 하는지 이름으로 식별할 수 있기 때문이다. 만약 개발용으로 사용할 서버와, 실제 배포용으로 사용할 서버가 이름이 같다면 구별하기 힘들지 않겠는가? 그러니 나의 상황에 맞게 이름을 작성한다. 나 같은 경우는 테스트용으로 단순히 api-server
라고 지정하였다.
애플리케이션 및 OS 이미지(Amazon Machine Image)
다음으로는 애플리케이션 및 OS 이미지를 선택한다. Mac os와 Window os가 익숙하겠지만, 서버용으로 사용할 OS는 리눅스가 최적화 되어있다. 그 이유로는 Mac, Window 같은 os는 컴퓨터를 쉽게 사용할 수 있도록 부가적인 기능을 제공하기에 리눅스에 비해 용량도 많이 차지하고 성능적으로 떨어진다. 그렇기에 서버를 배포할때 필요한 기능만 포함되어 있는 os를 선택하는게 유리하기에 Ubuntu
를 쓴다.
인스턴스 유형
다음으로 인스턴스 유형을 선택해야 한다. 인스턴스 유형이 뭔지 알면 해당 값을 설정하는데 있어서 아주 큰 도움이 되는데, 쉽게 설명하면 내가 빌릴 인스턴스 즉 컴퓨터의 사양
을 뜻한다. 즉 좋은 사양의 인스턴스를 빌릴지, 좀 사양적으로 부족한 인스턴스를 빌릴지 이 Step에서 선택하는 것이라고 볼 수 있다. 다만 나는 t2.micro
를 선택하여 프리티어 즉 요금이 부과되지 않는 유형을 선택하였다. 또한 이 유형은 하루 평균 2000명 정도 사용되는 사이트에서도 충분히 운영 가능함이 보장된 유형이기에 첫 서버 배포를 할때 사양을 낮은 단계에서 운용하고, 차후에 상황에 맞에 유형을 높은 버전으로 변경하는 것을 추천한다.
키 페어(로그인)
다음으로 키페어(로그인) 부분에서 새 키 페어 생성
을 눌러준다. 그럼 아래와 같은 이미지처럼 화면이 나오는데, 키 페어 이름을 설정하고 키 페어 생성
버튼을 눌러주면 파일이 다운로드 된다. 다운로드된 파일은 내가 생성한 인스턴스 EC2에 접속할때 필요한 파일이며, 해당 파일을 통해서 SSH 로그인이 가능하다.
네트워크 설정
다음으로 아래의 네트워크 설정에서 편집
버튼을 클릭한다. 편집 창에서 방화벽(보안그룹)
항목이 중요한 부분이니 하기에서 먼저 개념에 대해서 이해하고 편집창에서 어떤식으로 값을 설정하는지 알아보도록 하겠다.
하기 이미지는 편집 버튼을 클릭하면 바뀌는 화면이다.
방화벽(보안그룹) 설정 전 보안그룹의 개념에 대해서 알아보자.
보안그룹이란, AWS 클라우드에서의 네트워크 보안을 의미한다. EC2 인스턴스를 집이라고 생각한다면, 보안 그룹은 집 밖에 쳐져있는 울타리와 대문같은 개념이다. 인터넷에서 일부 사용자가 우리가만든 EC2 인스턴스를 접근한다고 가정해보자. 인스턴스에 방화벽 역할을 할 보안 그룹을 만들고 규칙을 설정하는데 이때 인바운드 규칙(외부에서 EC2로 보내는 트래픽)
과 아웃바운드 규칙(EC2에서 외부로 보내는 트래픽)
을 설정하여, 특정 사용자만 접근할 수 있도록 설정할 수 있다. 이때 만약 내가 인바운드 규칙을 내 PC 아이피에서만 접근할 수 있도록 설정한다면, 일부 사용자는 우리가 만든 EC2 인스턴스에 접근할 수 없다.
보안 그룹을 설정할때는 허용할 아이피(IP)와 포트(PORT)를 설정할 수 있다.
이어서 보안그룹을 설정하는 화면을 다시 보자면, 먼저 보안 그룹 이름을 설정한다, 나는 api-server-security-group
이라고 명명하였다. 아래 이미지를 보면 기본적으로 ssh 접속이 허용되어 있는데, 어느곳에서든 22번 포트로 해당 인스턴스를 접근하는것에 대해 열려있다는 것을 뜻한다. 왜냐하면 SSH를 통해 내가 어디서든지 원격 접속을 하기 위해 허용되어야 한다고 볼 수 있다. 또한 이 server는 불특정 다수에게 접근을 허용해야 하기에, 보안 그룹 규칙 추가
버튼을 클릭하여 HTTP로 접근하고자 하는 사용자들에게 접근을 허용할 수 있도록 추가 해주어 설정을 마무리 한다.
IP의 개념
IP는 특정 컴퓨터의 주소를 뜻한다.
PORT의 개념
한 컴퓨터 내에 실행되고 있는 프로그램을 뜻한다.
스토리지 구성
EBS는 Elastic Block Storage의 약자이다. 인스턴스도 하나의 컴퓨터이다 보니 파일을 저장할 공간이 필요한데, 이 저장공간을 EBS라고 부른다. 즉 EBS란 EC2안에 부착된 하드디스크 라고 생각하면 된다. EBS 보다 더 포괄적인 용어로는 스토리지, 볼륨 이라고 부른다. 기본적으로 아래 이미지의 GB 부분이 8GB
로 설정되어 있는데 30GB
로 변경해주자. 프리티어는 30GB까지 허용해준다, 또한 범용 SSD GP3
로 변경한다.
Step3. EC2 인스턴스 생성
이후 우측의 인스턴스 시작 버튼을 클릭하면. 기본설정에 기반한 인스턴스가 생성되고 AWS 콘솔창에서 내가 생성한 인스턴스를 확인 할 수 있다.
다음으로
다음 글에서는 생성된 EC2에 접속하고 EC2에 다양한 부가적인 설정을 진행하며, 스프링부트를 EC2 환경에 배포하는걸 해보도록 하겠다. (비용나가지 않게 하는 방법도 포함)