AWS EC2에 서버 배포해보기
배포란?
다른 사용자들이 인터넷을 통해서 사용할 수 있게 만드는 걸 의미한다.
EC2란? / EC2를 왜 배울까? / 현업에서 EC2는 주로 언제 쓸까?
--> 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스
-- EC2(Elastic Compute Cloud)를 왜 배울까?
서버를 배포하기 위해서는 컴퓨터가 필요하다. 내가 가진 컴퓨터에서 서버를 배포해 다른 사용자들이 인터넷을 통해 접근할 수 있게 만들 수도 있다. 하지만 내 컴퓨터로 서버를 배포하면 24시간 동안 컴퓨터를 켜놔야 한다. 그리고 인터넷을 통해 내 컴퓨터에 접근할 수 있게 만들다보니 보안적으로도 위험할 수도 있다.
이러한 불편함 때문에 내가 가지고 있는 컴퓨터를 사용하지 않고, AWS EC2라는 컴퓨터를 빌려서 사용하는 것이다. 이 외에도 AWS EC2는 여러 부가기능들(로깅, 오토스케일링, 로드밸런싱 등)을 많이 가지고 있다.
-- 현업에서는?
현업에서도 실제 서버를 배포할 때 AWS EC2를 아주 많이 사용한다. 백엔드 서버를 배포해야 할 때면 EC2에 서버를 배포해서 사용한다.
[실습] 1. 리전(Region) 선택하기
AWS EC2를 시작하기 위해서는 우선적으로 리전(Region)을 먼저 선택해야 한다.
-- 리전(Region)이란?
리전(Region)이란 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 의미한다.
우린 EC2가 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스라는 걸 알고 있다. 여기서 EC2를 통해 빌려서 쓸 수 있는 컴퓨터들이 전 세계적으로 다양하게 분포해있다. 이렇게 컴퓨터들이 위치한 위치를 보고 AWS에서는 리전(Region)이라고 한다.
애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전(Region)을 선택하는 것이 유리
[실습] 2. EC2 셋팅하기 - 기본 설정
이름 및 태그
EC2의 이름을 설정하는 곳이다. 이름을 지을 때는 이 컴퓨터가 어떤 역할을 하는 지 알아볼 수 있게 작성한다.
Application and OS Images (Amazon Machine Image)
Ubuntu 22.04 LTS 선택
OS를 선택하는 단계이다. OS(운영체제)란 Mac, Windows 7, Windows 10, Windows 11 같은 것들이 OS이다. 하지만 Windows나 Mac OS는 생각보다 용량도 많이 차지하고 성능도 많이 잡아먹는다. 그래서 서버를 배포할 컴퓨터의 OS는 훨씬 가벼운 Ubuntu를 많이 사용한다.
인스턴스 유형
인스턴스란, AWS EC2에서 빌리는 컴퓨터 1대를 의미한다.
그럼 인스턴스 유형은 무슨 뜻일까? 컴퓨터 사양을 의미한다. 컴퓨터 사양이 좋으면 좋을수록 많은 수의 요청을 처리할 수 있고, 무거운 서버나 프로그램을 돌릴 수 있다.
프리 티어에 해당하는 t2.micro를 사용
키 페어(로그인)
키 페어(Key Pair)는 무슨 뜻일까?
EC2 컴퓨터에 접근할 때 사용하는 비밀번호라고 생각하면 된다. 말 그대로 열쇠(Key, 키)의 역할을 한다.
[실습] 3. EC2 셋팅하기 - 보안그룹 설정
네트워크 설정
네트워크 설정 칸을 보면 VPC와 Security Groups(보안 그룹)가 보인다. 여기서 VPC라는 개념은 AWS를 입문하는 입장에서는 크게 중요하지 않으니 넘어가자. 나중에 AWS에 어느 정도 익숙해졌을 때 VPC를 학습하도록 하자. VPC를 몰라도 서버를 배포하는 데 아무 문제가 없다.
하지만 Security Groups(보안 그룹)은 서버를 배포할 때 중요한 개념이므로 자세히 알아보자.
보안 그룹(Security Group)이란?
보안 그룹(Security Group)이란 AWS 클라우드에서의 네트워크 보안을 의미한다.
EC2 인스턴스를 집이라고 생각한다면, 보안 그룹은 집 바깥 쪽에 쳐져있는 울타리와 대문이라고 생각하면 된다. 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 보안 요원이 검사를 하는 것과 비슷하다.
EC2 인스턴스 주위에 방화벽 역할을 할 보안 그룹(Security Group)을 만들고 보안 그룹에 규칙을 지정한다. 이 보안 규칙에는 인바운드 트래픽(즉, 외부에서 EC2 인스턴스로 보내는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있고, 아웃바운드 트래픽(즉, EC2 인스턴스에서 외부로 나가는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있다.
보안 그룹을 설정할 때는 허용할 IP 범위와 포트(port)를 설정할 수 있다.
보안 그룹 설정
외부에서 EC2로 접근할 포트는 22번 포트와 80번 포트라고 생각해서 이 2가지에 대해 인바운드 보안 그룹 규칙을 추가했다. 왜냐하면 22번 포트는 우리가 EC2에 원격 접속할 때 사용하는 포트이고, 80번 포트에는 백엔드 서버를 띄울 예정이기 때문이다. 그리고 어떤 IP에서든 전부 접근할 수 있게 만들기 위해 소스 유형은 위치 무관으로 설정했다.
[실습] 4. EC2 셋팅하기 - 스토리지 구성
EC2도 하나의 컴퓨터이다보니 여러 파일들을 저장할 저장 공간이 필요하다. 이 저장 공간을 보고 EBS(Elastic Block Storage)라고 부른다. 즉, EBS란 EC2 안에 부착되어 있는 일종의 하드디스크라고 생각하면 된다. EBS와 같은 저장 공간을 조금 더 포괄적인 용어로 스토리지(Storage), 볼륨(Volume)이라고 부른다.
가성비가 좋은 gp3를 선택해주자. 용량을 30GiB를 설정한 이유는 프리 티어에서 30GiB까지 무료로 제공해주기 때문이다. 이 스토리지의 크기는 추후에 늘릴 수도 있으므로 처음 설정할 때 너무 큰 고민을 할 필요는 없다.
[실습] 5. EC2 접속하기
생성된 인스턴스 정보 해석하기
세부 정보에서 눈여겨 봐야 할 부분은 2가지 밖에 없다. 퍼블릭 IPv4 주소와 인스턴스 상태이다.
퍼블릭 IPv4 주소는 EC2 인스턴스가 생성되면서 부여받은 IP 주소이다. EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 된다.
인스턴스 상태는 말그대로 EC2 인스턴스가 실행 중이라는 뜻은 컴퓨터가 켜져있다는 뜻이다.
EC2 인스턴스를 중지, 재부팅, 종료도 할 수 있다. 우리가 쓰는 컴퓨터와 아주 유사하다. 재부팅은 말그대로 컴퓨터를 재시작시키는 걸 의미하고, 중지는 컴퓨터를 잠시 꺼놓는 걸 의미한다. 종료는 컴퓨터를 아예 삭제시킨다는 걸 의미한다.
EC2 인스턴스를 한 번 종료하면 도중에 취소할 수 없으니 조심해야 한다.
보안(보안 그룹)
인스턴스 생성 시 설정한 보안 그룹에 대한 정보가 나온다.
네트워크
퍼블릭 IPv4 주소는 생성한 EC2 인스턴스의 IP 주소를 뜻한다.
스토리지
인스턴스 생성 시 설정한 스토리지에 대한 정보가 나온다.
모니터링
EC2 인스턴스에 관련한 여러가지 정보를 볼 수 있는 창이다. AWS를 처음 입문할 때는 자주 볼 일이 없는 창이지만, 나중에 실제 서버를 운영할 때는 자주 보게되는 창이다. EC2 인스턴스가 정상적으로 작동하고 있는 지, EC2 인스턴스의 성능을 향상시켜주어야 하는 건 아닌 지 아래 지표를 통해 파악할 수 있다.
[실습] 6. 탄력적 IP 연결하기
EC2 인스턴스를 생성하면 IP를 할당받는다. 하지만 이렇게 할당받은 IP는 임시적인 IP이다. EC2 인스턴스를 잠깐 중지시켰다가 다시 실행시켜보면 IP가 바뀌어있다. EC2 인스턴스를 중지시켰다가 다시 실행시킬 때마다 IP가 바뀌면 굉장히 불편하다. 그래서 중지시켰다가 다시 실행시켜도 바뀌지 않는 고정 IP를 할당받아야 한다.
현업에서도 EC2 인스턴스를 생성하면 탄력적 IP를 대부분 필수적으로 설정한다.
[실습] 7. Express 서버를 EC2에 배포하기
Ubuntu 환경에서 Node.js 설치하는 법
Ubuntu 환경에서 Express 서버를 실행시키려면 Node.js가 설치되어 있어야 한다. 그래서 Ubuntu에 우선 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
잘 설치됬는지 확인
node -v
github로 Express 프로젝트 clone하기
git clone https://github.com/JSCODE-EDU/ec2-express-sample
cd ec2-express-sample
npm i
.env파일 직접 만들기
.env
와 같은 민감한 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서 .env 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 .env 파일을 EC2 인스턴스에 올리는 작업보다는, .env 파일을 직접 만드는 게 훨씬 간단하다.
.env
DATABASE_NAME=my_database
pm2 설치해서 서버 실행시키기
Node 기반의 서버는 pm2를 활용해서 많이 실행시킨다. 서비스를 운영하는 데 있어서 유용한 기능들을 pm2가 많이 가지고 있기 때문이다.
sudo npm i -g pm2
sudo pm2 start app.js
잘 작동되는지 확인
pm2 정지하기
# pm2로 실행중인 프로젝트에 대한 앱 이름 확인
sudo pm2 list
# sudo pm2 stop [앱 이름]
sudo pm2 stop app
Spring Boot 서버를 EC2에 배포하기
Ubuntu 환경에서 JDK 설치하는 법
sudo apt update && /
sudo apt install openjdk-17-jdk -y
잘 설치 됬는지 확인
java -version
Github로부터 Spring Boot 프로젝트 clone 하기
git clone https://github.com/JSCODE-EDU/ec2-spring-boot-sample.git
cd ec2-spring-boot-sample
application.yml 파일 직접 만들기
application.yml와 같은 민감한 정보가 포함된 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서 application.yml 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 application.yml 파일을 EC2 인스턴스에 올리는 작업보다는, application.yml 파일을 직접 만드는 게 훨씬 간단하다.
src/main/resources/application.yml
server:
port: 80
서버 실행하기
./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 &
잘 작동되는 지 확인.
비용 나가지 않게 EC2 깔끔하게 종료하기
EC2 인스턴스 종료하기
탄력적 IP 릴리스하기
댓글을 작성해보세요.