본문 바로가기
카테고리 없음

제로부터 DevOps까지 6편 - AWS에 배포

by 타임 플레그 2025. 5. 28.
반응형

AWS EC2로 실전 배포하기 - 퍼블릭과 프라이빗 망 구성부터 Nginx까지

“이제 진짜 만든 걸 세상에 보여줄 시간입니다.”
우리가 만들어 온 미니 프로젝트와 기능들, 이제는 실제 서버에 올려 ‘진짜 서비스’로 만드는 과정을 시작합니다.


🚀 왜 배포가 필요할까?

개발이란 결국 무언가를 만든다는 것이고, 배포란 그것을 누군가가 쓸 수 있게 만든다는 의미입니다.
아무리 멋진 기능을 만들어도, 로컬에서만 동작한다면 그것은 나만을 위한 프로그램일 뿐입니다.
배포는 곧 현실화입니다.
우리는 이번 편에서 AWS EC2를 통해 자신이 만든 서비스를 전 세계 누구나 접근할 수 있는 ‘인터넷상의 진짜 제품’으로 바꿔보게 됩니다.


☁️ EC2란?

**EC2(Amazon Elastic Compute Cloud)**는 AWS에서 제공하는 가상 서버입니다.
쉽게 말해, 인터넷에서 언제든 접근 가능한 내 컴퓨터 한 대를 임대한 셈입니다.

기본 개념 정리:

  • 퍼블릭 VPC: 외부에서 접근 가능한 망 (ex. 웹서버, Nginx)
  • 프라이빗 VPC: 외부와 차단된 내부 망 (ex. Node.js 서버)
  • 보안 그룹: 방화벽 역할을 하며 포트 허용/제어

🛠️ 인프라 구성 시나리오

구성 요소 설명 위치

Nginx 서버프록시/로딩 담당퍼블릭 VPC
Node.js 앱실제 비즈니스 로직 실행프라이빗 VPC
PM2Node 앱 프로세스 관리 툴프라이빗 VPC
EC2각 서버가 설치될 가상 컴퓨터AWS 내부

🧪 실습: EC2로 직접 배포해 보기

1. EC2 인스턴스 생성 (퍼블릭/프라이빗 나눔)

  • Amazon Linux 2 / Ubuntu 선택
  • 보안 그룹 설정: 22(SSH), 80/443(HTTP), 3000(Node) 허용 여부 조정

2. Node.js 앱 준비 (프라이빗 망 EC2)

  • git clone으로 프로젝트 내려받기
  • Node.js 설치: nvm, npm install
  • PM2 설치: npm install pm2 -g
  • 앱 실행: pm2 start app.js

3. Nginx 설치 및 리버스 프락시 설정 (퍼블릭 망 EC2)

1) Nginx 설치:

sudo apt update
sudo apt install nginx -y

설치 후 다음 명령어로 상태 확인:

sudo systemctl status nginx

2) 기본 포트 열기 (보안 그룹에서):

  • 인바운드 규칙: 80 (HTTP), 443 (HTTPS) 허용

3) 리버스 프락시 설정:
Nginx는 Node.js 서버 앞에서 요청을 받아 프락시처럼 전달해 주는 역할을 합니다.
설정 파일 편집:

sudo nano /etc/nginx/sites-available/default

기본 server 블록 수정 예시:

server {
  listen 80;
  server_name 퍼블릭IP 또는 도메인명;

  location / {
    proxy_pass http://프라이빗EC2-IP:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

설정 반영:

sudo nginx -t    # 설정 오류 체크
sudo systemctl reload nginx

4) 결과 확인:
브라우저에서 퍼블릭 EC2의 공인 IP를 입력하고, Node.js 앱이 잘 뜨는지 확인합니다.


🧩 중간 개념: PM2란?

PM2는 Node.js 서버를 끊기지 않고 계속 실행되게 해주는 프로세스 관리자입니다.

  • 서버가 죽으면 자동 재시작
  • 로그 기록 가능
  • 여러 개 앱 동시 실행 가능

예시:

npm install pm2 -g
pm run build
pm start
pm2 start app.js --name "my-app"

pm2 list, pm2 logs, pm2 restart [name] 등으로 제어가 가능합니다.


❗ 실전 트러블슈팅 사례

문제 원인 해결 방법

Nginx 502 Bad Gateway프라이빗 EC2에 접근 불가보안 그룹 포트 3000 허용 확인
Node.js가 종료됨SSH 종료로 프로세스도 같이 종료PM2 사용하여 백그라운드 실행
EC2 접속 불가키페어(.pem) 파일 문제권한 400 설정 및 경로 재확인

✅ 배포 후 확인 리스트

  • Nginx 로그 확인: /var/log/nginx/error.log
  • Node.js 앱 정상 동작 여부
  • 퍼블릭 IP 접근 시 UI가 정상 출력되는지
  • 리소스 사용량: top, htop 등으로 모니터링

🗂️ 실습 결과 정리 팁

  • 프로젝트 구조 + 배포 방식 시각화 다이어그램 만들기
  • EC2 설정, Nginx 설정, PM2 명령어 등 스크린숏 + 설명 정리
  • 문제 해결 경험 블로그에 정리 → 강한 포트폴리오 항목 생성

🧭 마무리 회고

이제 우리는 진짜 인터넷에 “나의 서비스”를 띄워보았습니다.
단순히 코드를 짜는 걸 넘어서, 그것을 작동하게 만들고 세상과 연결한 것입니다.
배포는 어렵고 귀찮아 보일 수 있지만, 해보면 생각보다 단순합니다.
무엇보다도 “세상에 나왔다”는 성취감은 그 어떤 기능 구현보다 짜릿합니다.


🔮 다음 편 예고

이제 서비스를 올렸다면, 다음은 CI/CD를 통한 자동화 배포입니다.

  • GitHub에 Push 하면, 자동으로 EC2에 배포되는 흐름
  • Docker, GitHub Actions 등 실전 도구들을 배우게 됩니다.

🌍 여러분의 서비스가 이제 진짜 세상과 연결되었습니다.
다음은 자동화라는 날개를 달아볼 차례입니다.

반응형