안녕하세요! 이번 포스팅에서는 AWS EC2를 이용해 Express 서버를 배포하는 전체 과정을 처음부터 끝까지 알아보겠습니다.
EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스입니다. 쉽게 말해 클라우드에서 빌려 쓸 수 있는 컴퓨터라고 생각하면 됩니다. 물리적인 서버를 직접 구매하고 관리할 필요 없이, 필요한 만큼의 컴퓨팅 파워를 클라우드에서 빌려 사용할 수 있습니다.
프론트엔드 개발자로서 EC2를 사용하면 다음과 같은 이점이 있습니다:
인스턴스란 AWS EC2에서 빌리는 컴퓨터 1대를 의미합니다. 인스턴스를 생성하는 과정은 다음과 같습니다
portfolio-express-serverRSA와 .pem 형식을 선택합니다.보안 그룹은 EC2 인스턴스의 방화벽 역할을 합니다. 외부에서 어떤 트래픽을 허용할지, 어떤 트래픽을 차단할지 설정할 수 있습니다.
인바운드 규칙 (외부에서 EC2로 들어오는 트래픽)
아웃바운드 규칙 (EC2에서 외부로 나가는 트래픽)
팁: 실제 서비스 운영 시에는 보안을 위해 특정 IP에서만 SSH 접속이 가능하도록 제한하는 것이 좋습니다.
EC2 인스턴스를 생성하면 기본적으로 임시 IP 주소가 할당됩니다. 하지만 인스턴스를 중지했다가 다시 시작하면 IP 주소가 바뀌게 됩니다. 이를 방지하기 위해 탄력적 IP를 설정합니다.
주의: 탄력적 IP를 할당받고 EC2 인스턴스에 연결하지 않으면 요금이 발생할 수 있습니다.
Express 서버를 실행하기 위해서는 Node.js가 필요합니다. Ubuntu 환경에 Node.js를 설치하는 방법은 다음과 같습니다:
ssh -i 키페어파일.pem ubuntu@탄력적IP주소
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
이제 EC2에 Express 서버를 배포해 보겠습니다.
git clone https://github.com/JSCODE-EDU/ec2-express-sample
cd ec2-express-sample
npm i
.env 파일은 보안상의 이유로 git에 포함되지 않는 경우가 많습니다. 직접 생성해 주어야 합니다.
echo "DATABASE_NAME=my_database" > .env
또는 nano나 vim 에디터를 사용해 파일을 생성할 수 있습니다:
nano .env
# 내용 입력 후 Ctrl+X, Y, Enter로 저장
PM2는 Node.js 애플리케이션을 위한 프로세스 매니저입니다. 서버를 백그라운드에서 실행하고, 자동으로 재시작하며, 로그를 관리해 주는 등 다양한 기능을 제공합니다.
sudo npm i -g pm2
sudo pm2 start app.js
pm2 status
pm2 startup
pm2 save
pm2 logs
프론트엔드 개발자로서 배포 프로세스를 자동화하면 개발 효율이 크게 향상됩니다. 다음은 GitHub Actions를 활용한 자동 배포 방법입니다.
AWS_EC2_SSH_KEY: EC2 접속을 위한 키AWS_EC2_HOST: EC2 인스턴스의 IP 주소AWS_EC2_USERNAME: 일반적으로 'ubuntu'.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 서버에 배포됩니다.
AWS는 사용한 만큼 요금이 청구되는 구조이므로, 개발이 끝나고 더 이상 서버가 필요하지 않을 때는 적절히 종료하는 것이 중요합니다. 프리 티어라도 일부 자원은 한도를 초과하면 비용이 발생할 수 있습니다.
인스턴스를 그냥 '중지(Stop)'하는 것만으로는 EBS 스토리지 비용이 계속 발생합니다. 완전히 해제하려면 '종료(Terminate)'해야 합니다.
주의: 인스턴스를 종료하면 모든 데이터가 삭제되며 이 과정은 취소할 수 없습니다!
인스턴스를 종료해도 탄력적 IP는 계속 할당되어 있으며, 이는 비용이 발생합니다. 반드시 해제해야 합니다.
인스턴스 종료 시 기본 볼륨은 자동 삭제되지만, 추가 볼륨이 있다면 수동으로 삭제해야 합니다.
기본 보안 그룹을 제외한 사용자 정의 보안 그룹은 필요 없다면 삭제합니다.
예상치 못한 비용 발생을 방지하기 위해 청구 알림을 설정하는 것이 좋습니다.
이번 포스팅에서는 AWS EC2에 Express 서버를 배포하는 전체 과정과 함께 비용이 발생하지 않도록 자원을 깔끔하게 정리하는 방법까지 알아보았습니다.