AWS 배포 하기 - 1 (EC2)

지원·2024년 3월 26일
0

백엔드 API 서버 배포 (EC2)

배포는 다른 사용자들이 인터넷을 통해 사용할 수 있게 만드는 것을 의미한다.

  • 혼자서 개발을 할 때는 localhost 라는 주소로 테스트도 하고 개발을 하는데, 이 localhost 는 다른 컴퓨터에서 접근이 불가능한 주소이다.
  • 배포를 하게 되면 IP 나 도메인과 같이 고유의 주소를 부여 받게 되고 다른 컴퓨터에서도 그 주소로 접속할 수 있다.
  • 그것을 해주는 것이 배포라는 것!

EC2 란?

  • Elastic Compute Cloud (EC2)
  • 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스
  • 서버를 배포하기 위해서는 컴퓨터가 필요한데, 내 컴퓨터로 배포하게 되면 24시간 내 컴퓨터를 계속 켜놔야한다.
  • 그렇게 되면 보안적으로도 위험할 수 있기 때문에 AWS EC2 라는 컴퓨터를 빌려서 사용하면 된다.

현업에서도 실제 서버를 배포할 때 EC2 를 아주 많이 사용하며, 백엔드 서버를 배포해야 할 때면 EC2 에 서버를 배포해서 사용한다.

하지만 프론트엔드 웹 페이지를 배포할 떄는 EC2 를 사용하지 않는다.

  • 프론트엔드 웹 페이지를 배포할 때는 Vercel , Netlify , AWS S3를 사용해서 주로 배포한다.

리전(Region) 선택하기

  • Region 은 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 의미한다.
  • EC2 를 통해 빌려서 쓸 수 있는 컴퓨터들이 전 세계적으로 다양하게 분포해있는데, 컴퓨터들이 위치한 위치를 보고 AWS 에서는 Region 이라고 한다.
  • Region 은 애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 Region 을 사용하면 된다.
  • 즉 한국 유저들이 주로 사용하는 서비스는 한국의 Region 으로 선택하면 된다.

EC2 Setting

  1. OS 선택
  • Window / MAc 은 생각보다 용량도 많이 차지하고 성능도 많이 잡아 먹기 떄문에 서버를 배포할 때는 가볍고 성능도 좋은 Ubuntu 를 사용
  1. 인스턴스 유형
  • 인스턴스 : EC2 를 통해서 빌린 컴퓨터 1대를 의미
  • 인스턴스 유형은 컴퓨터 사양을 의미한다고 생각하면 된다.
  • t2.micro 는 프리티어 이지만 서비스를 운영하는데 큰 문제가 없는 경우가 많다.
  1. 키 페어(로그인)
  • EC2 에 접근할 때 사용하는 비밀번호
  1. 네트워크 설정
  • 네트워크 설정에서 보안그룹이 중요하기 때문에 보안 그룹에 대해서 알아보자.

보안 그룹

  • 보안그룹이란 AWS 클라우드에서의 네트워크 보안을 의미한다.
  • EC2 인스턴스를 집이라고 생각하면, 보안 그룹은 집 바깥 쪽에 쳐져있는 울타리와 대문이라고 생각하면 된다.
  • 즉 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 보안 요원이 검사를 하는 것과 비슷하다.
  • EC2 인스턴스 주위에 방화벽 역할을 할 보안 그룹을 만들고 보안 그룹에 규칙을 지정한다.
  1. 인바운드 트래픽 : 외부에서 EC2 인스턴스로 보내는 트래픽으로 어떤 트래픽만 허용할지 설정할 수 있다.
  2. 아웃바운드 트래픽 : EC2 인스턴스에서 외부로 나가는 트래픽으로 어떤 트래픽만 서용할 지 설정할 수 있다.

보안 그룹을 설정할 때는 허용할 IP 범위와 포트를 설정할 수 있다.

  • 외부에서 EC2 로 접근할 포트는 22번 포트(SSH)와 80번 포트(HTTP)라고 생각해서 이 2가지에 대해 인바운드 보안 그룹을 추가를 한다.
  • 그 이유는 22번 포트는 우리가 EC2 에 원격 접속할 때 사용하는 포트이고, 80번 포트에는 백엔드 서버를 띄우기 때문에 어떤 IP 에서든 전부 접근할 수 있게 만들기 위해 소스 유형은 위치 무관으로 설정한다.

IP 와 Port 란?

IP 란?

  • 네트워크 상에서의 컴퓨터를 가리키는 주소

Port 란?

  • 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소
  • 한 컴퓨터 내에서도 카톡 , 인텔리제이 , 디스코드등 여러가지 프로그램이 동시에 실행되고 있는것 처럼 실제 서버를 운영하는 컴퓨터도 동일하다.
  • 만약 Spring Boot 와 서버에 통신을 하고 싶을때 외부에서 IP 주소만 알아서는 실행되고 있는 여러 프로그램 중 어떤 프로그램과 통신을 해야할 지 알수가 없다.
  • 그래서 특정 서버와 통신을 할 떄 IP 주소와 서버가 실행되고 있는 포트 번호까지 알고 있어야 한다.

브라우저 창에 포트 번호를 입력하지 않는 이유?

  • 분명히 IP 주소와 Port 를 같이 적어줘야 한다고 했는데, 도메인 주소를 보면 IP 주소 뿐이다.
  • 포트 번호를 입력해주지 않았는데도 어떻게 정상적으로 통신을 하는 걸까?
  • 주소창에 도메인 주소를 입력해서 엔터를 누르면 브라우저(크롬 , 사파리)는 기본적으로 80번 포트로 통신을 보내게 섲렁되어 있다.
  • 그래서 포트 번호를 입력해주지 않아도 정상적으로 통신이 됐던것인데, 만약 80번 포트가 아닌 다른 포트 번호로 통신하고 싶다면 직접 입력해주면 된다.

잘 알려진 포트(well-known port)

  • 포트 번호는 0~65,533번까지 사용할 수 있는데, 그 중에서 0 ~ 1023번까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져있다.
  • 이렇게 규약을 통해 역할이 정해져있는 포트 번호를 보고 well-known port 라고 한다.
  • 22번 (SSH , Secure Shell Protocol) : 원격 접속을 위한 포트 번호
  • 80 (HTTP) : HTTP 로 통신을 할 때 사용
  • 443 (HTTPS) : HTTPS 로 통신을 할 때 사용

위에서 정해놓은 규약을 꼭 지키지 않아도 되며, 규약으로 정해져 있는 포트 번호와 다르게 사용해도 된다.

EC2 Setting 2

  1. 스토리지 구성
  • 우리가 쓰고 있는 노트북이나 컴퓨터에도 하드디스크를 가지고, 그 하드디스크는 컴퓨터에서 파일을 저장하는 공간이다.
  • EC2 도 하나의 컴퓨터이기 때문에 여러 파일들을 저장할 저장 공간이 필요하고, 그 공간을 EBS 라고 한다.
  • EBS(Elastic Block Storage) 는 EC2 안에 부착되어 있는 일종의 하드디스크라고 ㅅ애각하면 된다.
  • 좀 더 포괄적인 의미로 스토리지 , 볼륨이라고 부른다.
  • 프리티어인 경우 30GiB 까지 무료이며, 종류는 gp3 가 가성비가 좋기 때문에 gp3 를 선택한다.

EC2 접속하기

  • 우선 만들어진 EC2 인스턴스의 세부정보에서 퍼블릭 IPv4 주소가 있는데 이 주소가 바로 IP 주소이기 때문에 EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 된다.
  • 보안에 들어가보면 위에서 설정한 보안 그룹에서 인바운드 규칙과 아웃바운드 규칙에 대한 정보도 나온다.
  • EC2 에 접속하기 위해서는 AWS 에서 바로 접속할 수 있는 방법도 있고 SSH 클라이언트를 이용해서도 접속할 수 있는데 편한 방법으로 접속하면 된다.

탄력적 IP 연결하기

  • EC2 인스턴스를 생성하면 IP 를 할당받지만, 이렇게 할당받은 IP 는 임시적인 IP 이다.
  • EC2 인스턴스를 잠깐 중지시켰다가 다시 실행시켜보면 IP가 바뀌어 있다.
  • EC2 인스턴스를 중지시켰다가 다시 실행시킬 때마다 IP가 바뀌면 굉장히 불편하기 때문에 중지 시켰다가 다시 실행시켜도 바뀌지 않은 고정 IP 를 할당받아야 한다.
  • 그게 바로 탄력적 IP 이다.
  • 탄력적(Elastic) 의 큰 의미는 없고, 유연하게 사용할 수 있다라는 의미로 붙힌것으로 생각하면 된다.
  • 인터넷이 너무 많아지면서 IP 개수가 모자른 경우가 생기기 떄문에 IP 주소를 임시적으로 발급하고 안 쓰는 경우에는 다른 사람에게 다시 발급하는 형식으로 하기 위해서 이런식으로 한다.

설정하는 방법은 왼쪽 메뉴에 탄력적 IP 에 들어가고 탄력적 IP 주소 할당에 들어가서 사용할 인스턴스를 지정하고 만들어주면 된다.

  • 직관적이게 이름을 설정해주면 더 좋다.

Express 서버를 EC2 에 배포하기

  • Ubuntu 환경에서 Express 서버를 실행시키려면 Node.js 가 필요하기 떄문에 설치를 해야한다.
  1. EC2 에 접속후 Node.js 설치
$ sudo su
$ apt-get update && /
apt-get install -y ca-certificates curl gnupg && /
mkdir -p /etc/apt/keyrings && /
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && /
NODE_MAJOR=20 && /
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && /
apt-get update && /
apt-get install nodejs -y
  1. Github 로부터 프로젝트 clone
  2. .env 와 같은 민감한 파일은 git 에 올리지 않기 때문에 .env 파일은 별도로 EC2 인스턴스에 올려줘야 한다.
  • .env 파일을 EC2 인스턴스에 올리는 작업보다는 .env 파일을 직접 만드는게 훨씬 간단하다.
  • vi .env 로 만들고 여기에 값을 입력해주면 된다.
  1. pm2 설치해서 서버 실행
  • Node 기반의 서버는 pm2 를 활용해서 많이 실행한다.
  • 설치한 후 sudo pm2 start app.js 로 실행

그런후에 탄력적 IP 주소로 실행해 보면 정상적으로 배포가 된 것을 확인할 수 있다.

Spring Boot 서버를 EC2에 배포하기

  1. Ubuntu 환경에서 JDK 설치 (17버전 이상)
sudo apt update && /
sudo apt install openjdk-17-jdk -y
  1. Github 로부터 Spring Boot 프로젝트 Clone 하기
  2. application.yml 파일 직접 만들기
  • vi application.yml 에다가 필요한 정보 넣기
  1. 서버 실행시키기
./gradlew clean build # 기존 빌드된 파일을 삭제하고 새롭게 JAR로 빌드
cd ~/ec2-spring-boot-sample/build/libs
sudo java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar

# 백그라운드에서 Spring Boot 실행시키는 명령어
sudo nohup java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar &
  • 우선 ./gradlew clean build 로 JAR 파일 생성하고 java -jar 명령어로 그 JAR 파일을 생성해서 서버를 실행시킨다.
profile
덕업일치

0개의 댓글