EC2에 express 배포하기

한상우·2025년 4월 1일
post-thumbnail

EC2에 Express 서버 배포하기: 프론트엔드 개발자를 위한 완벽 가이드

안녕하세요! 이번 포스팅에서는 AWS EC2를 이용해 Express 서버를 배포하는 전체 과정을 처음부터 끝까지 알아보겠습니다.

목차

  1. EC2란?
  2. EC2 인스턴스 생성하기
  3. 보안 그룹 설정하기
  4. 탄력적 IP 설정하기
  5. EC2에 Node.js 설치하기
  6. Express 서버 배포하기
  7. PM2로 서버 관리하기
  8. 배포 자동화하기 (심화)
  9. 비용 나가지 않게 EC2 깔끔하게 종료하기

EC2란?

EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스입니다. 쉽게 말해 클라우드에서 빌려 쓸 수 있는 컴퓨터라고 생각하면 됩니다. 물리적인 서버를 직접 구매하고 관리할 필요 없이, 필요한 만큼의 컴퓨팅 파워를 클라우드에서 빌려 사용할 수 있습니다.

프론트엔드 개발자로서 EC2를 사용하면 다음과 같은 이점이 있습니다:

  • 백엔드 API를 직접 배포해 프론트엔드 개발 환경 구축 가능
  • 간단한 포트폴리오 프로젝트 전체를 배포 가능

EC2 인스턴스 생성하기

인스턴스란 AWS EC2에서 빌리는 컴퓨터 1대를 의미합니다. 인스턴스를 생성하는 과정은 다음과 같습니다

1. 이름 및 태그 설정

  • 인스턴스의 역할을 알 수 있도록 명확하게 작성합니다.
  • 예: portfolio-express-server

2. OS 이미지 선택 (AMI)

  • Ubuntu 22.04 LTS를 선택합니다.
  • 서버용으로는 Windows나 Mac보다 가벼운 Ubuntu가 효율적입니다.

3. 인스턴스 유형 선택

  • 프리 티어에 해당하는 t2.micro를 선택합니다.
  • 소규모 프로젝트에는 이 사양으로도 충분합니다. (하루 방문자 수 2,000명 정도도 무리 없이 처리 가능)

4. 키 페어 설정

  • 키 페어는 EC2에 접근할 때 사용하는 비밀번호입니다.
  • RSA.pem 형식을 선택합니다.
  • 생성된 키 파일(.pem)은 안전한 곳에 보관해야 합니다.

5. 스토리지 구성

  • 용량: 30GiB (프리 티어 최대 용량)
  • 유형: gp3 (가성비가 좋은 범용 SSD)

보안 그룹 설정하기

보안 그룹은 EC2 인스턴스의 방화벽 역할을 합니다. 외부에서 어떤 트래픽을 허용할지, 어떤 트래픽을 차단할지 설정할 수 있습니다.

기본 보안 설정

  1. 인바운드 규칙 (외부에서 EC2로 들어오는 트래픽)

    • SSH (22번 포트): EC2에 원격 접속하기 위한 포트
    • HTTP (80번 포트): 웹 서버를 위한 포트
    • 소스 유형: 위치 무관 (모든 IP에서 접근 가능)
  2. 아웃바운드 규칙 (EC2에서 외부로 나가는 트래픽)

    • 기본값으로 모든 트래픽 허용

: 실제 서비스 운영 시에는 보안을 위해 특정 IP에서만 SSH 접속이 가능하도록 제한하는 것이 좋습니다.

탄력적 IP 설정하기

EC2 인스턴스를 생성하면 기본적으로 임시 IP 주소가 할당됩니다. 하지만 인스턴스를 중지했다가 다시 시작하면 IP 주소가 바뀌게 됩니다. 이를 방지하기 위해 탄력적 IP를 설정합니다.

탄력적 IP 설정 방법

  1. AWS 콘솔에서 EC2 서비스 선택
  2. 왼쪽 메뉴에서 '탄력적 IP' 선택
  3. '탄력적 IP 주소 할당' 클릭
  4. 기본 설정으로 할당 (Network Border Group은 자신의 리전 선택)
  5. 할당된 IP를 선택하고 '작업' > '탄력적 IP 주소 연결' 클릭
  6. 인스턴스 선택 후 '연결' 클릭

주의: 탄력적 IP를 할당받고 EC2 인스턴스에 연결하지 않으면 요금이 발생할 수 있습니다.

EC2에 Node.js 설치하기

Express 서버를 실행하기 위해서는 Node.js가 필요합니다. Ubuntu 환경에 Node.js를 설치하는 방법은 다음과 같습니다:

1. EC2 접속하기

ssh -i 키페어파일.pem ubuntu@탄력적IP주소

2. 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

3. 설치 확인

node -v

Express 서버 배포하기

이제 EC2에 Express 서버를 배포해 보겠습니다.

1. 프로젝트 클론하기

git clone https://github.com/JSCODE-EDU/ec2-express-sample
cd ec2-express-sample
npm i

2. 환경 변수 설정하기

.env 파일은 보안상의 이유로 git에 포함되지 않는 경우가 많습니다. 직접 생성해 주어야 합니다.

echo "DATABASE_NAME=my_database" > .env

또는 nano나 vim 에디터를 사용해 파일을 생성할 수 있습니다:

nano .env
# 내용 입력 후 Ctrl+X, Y, Enter로 저장

PM2로 서버 관리하기

PM2는 Node.js 애플리케이션을 위한 프로세스 매니저입니다. 서버를 백그라운드에서 실행하고, 자동으로 재시작하며, 로그를 관리해 주는 등 다양한 기능을 제공합니다.

1. PM2 설치

sudo npm i -g pm2

2. 서버 실행

sudo pm2 start app.js

3. 서버 상태 확인

pm2 status

4. 시스템 재시작 시 자동 실행 설정

pm2 startup
pm2 save

5. 로그 확인

pm2 logs

배포 자동화하기 (심화)

프론트엔드 개발자로서 배포 프로세스를 자동화하면 개발 효율이 크게 향상됩니다. 다음은 GitHub Actions를 활용한 자동 배포 방법입니다.

1. GitHub Secrets 설정

  • AWS_EC2_SSH_KEY: EC2 접속을 위한 키
  • AWS_EC2_HOST: EC2 인스턴스의 IP 주소
  • AWS_EC2_USERNAME: 일반적으로 'ubuntu'

2. GitHub Actions Workflow 파일 생성

.github/workflows/deploy.yml 파일을 생성하고 다음 내용을 작성합니다:

name: Deploy to EC2

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Deploy to EC2
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.AWS_EC2_HOST }}
        username: ${{ secrets.AWS_EC2_USERNAME }}
        key: ${{ secrets.AWS_EC2_SSH_KEY }}
        script: |
          cd ~/ec2-express-sample
          git pull
          npm install
          pm2 restart app

이 설정으로 main 브랜치에 push할 때마다 자동으로 EC2 서버에 배포됩니다.

비용 나가지 않게 EC2 깔끔하게 종료하기

AWS는 사용한 만큼 요금이 청구되는 구조이므로, 개발이 끝나고 더 이상 서버가 필요하지 않을 때는 적절히 종료하는 것이 중요합니다. 프리 티어라도 일부 자원은 한도를 초과하면 비용이 발생할 수 있습니다.

1. EC2 인스턴스 종료하기

인스턴스를 그냥 '중지(Stop)'하는 것만으로는 EBS 스토리지 비용이 계속 발생합니다. 완전히 해제하려면 '종료(Terminate)'해야 합니다.

  1. AWS 콘솔에서 EC2 서비스 선택
  2. 인스턴스 목록에서 종료할 인스턴스 선택
  3. '인스턴스 상태' > '인스턴스 종료' 클릭
  4. 경고 메시지 확인 후 '종료'버튼 클릭

주의: 인스턴스를 종료하면 모든 데이터가 삭제되며 이 과정은 취소할 수 없습니다!

2. 탄력적 IP 해제하기

인스턴스를 종료해도 탄력적 IP는 계속 할당되어 있으며, 이는 비용이 발생합니다. 반드시 해제해야 합니다.

  1. EC2 콘솔의 왼쪽 메뉴에서 '탄력적 IP' 선택
  2. 해제할 IP 주소 선택
  3. '작업' > '탄력적 IP 주소 연결 해제' 클릭
  4. 연결 해제 후 '작업' > '탄력적 IP 주소 릴리스' 클릭

3. EBS 볼륨 삭제하기

인스턴스 종료 시 기본 볼륨은 자동 삭제되지만, 추가 볼륨이 있다면 수동으로 삭제해야 합니다.

  1. EC2 콘솔의 왼쪽 메뉴에서 '볼륨' 선택
  2. 상태가 'available'인 볼륨 확인 (연결된 인스턴스가 없는 상태)
  3. 해당 볼륨 선택 후 '작업' > '볼륨 삭제' 클릭

4. 보안 그룹 삭제하기

기본 보안 그룹을 제외한 사용자 정의 보안 그룹은 필요 없다면 삭제합니다.

  1. EC2 콘솔의 왼쪽 메뉴에서 '보안 그룹' 선택
  2. 삭제할 보안 그룹 선택
  3. '작업' > '보안 그룹 삭제' 클릭

5. AWS 청구 알림 설정하기

예상치 못한 비용 발생을 방지하기 위해 청구 알림을 설정하는 것이 좋습니다.

  1. AWS 콘솔에서 '결제 대시보드' 선택
  2. '기본 설정' > '결제 알림 받기' 활성화
  3. 'CloudWatch 알림 생성' 클릭하여 특정 금액 초과 시 알림 설정

마무리

이번 포스팅에서는 AWS EC2에 Express 서버를 배포하는 전체 과정과 함께 비용이 발생하지 않도록 자원을 깔끔하게 정리하는 방법까지 알아보았습니다.

참고 자료

profile
안녕하세요

0개의 댓글