티스토리 뷰

반응형

AWS + Cloudflare 기반 NestJS 운영환경 구축

(HTTPS, CDN, 로드밸런서까지 연결하는 실전 인프라 편)


드디어 여기까지 왔다.
이전 글까지는 NestJS + Docker + GitHub Actions + Blue-Green + PM2 + Prisma
완전한 백엔드 자동배포 체인을 만들었다.

이번 편은 그 위에 “운영 인프라”를 올린다.
즉, AWS + Cloudflare 조합으로 HTTPS, CDN, 로드밸런서, 도메인 관리까지 통합하는 단계다.

이 편은 단순히 서버를 띄우는 게 아니라
“실제 서비스처럼 전 세계 사용자에게 빠르고 안전하게 제공하는 방법”을 다룬다.


🧭 이번 목표

구성 요소 역할

AWS EC2 (Ubuntu) Docker 기반 NestJS 서버 호스팅
AWS Load Balancer (ALB) 다중 인스턴스 트래픽 분산
Cloudflare DNS + CDN 전 세계 엣지 캐싱 + HTTPS SSL
Route53 (선택) 도메인 DNS 관리
CloudWatch 서버 상태 모니터링, 로그 알림
Slack Webhook 배포/장애 알림 연동

1️⃣ AWS EC2 인스턴스 설정

  1. EC2 생성
    • Amazon Linux 2023 or Ubuntu 22.04 선택
    • 보안 그룹 포트:
      • 22 (SSH)
      • 80 (HTTP)
      • 443 (HTTPS)
      • 3001, 3002 (Blue-Green 포트)
    • 키페어 다운로드 (.pem)
  2. 기본 세팅
  3. sudo apt update && sudo apt install docker docker-compose nginx -y sudo systemctl enable docker sudo usermod -aG docker ubuntu
  4. 프로젝트 배포
  5. git clone https://github.com/.git cd nest-app docker compose up -d

2️⃣ Nginx HTTPS 설정 (Let’s Encrypt)

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d api.yourdomain.com

자동으로 SSL 인증서가 /etc/letsencrypt/live/... 경로에 생성된다.
Nginx 설정 파일을 열면 아래처럼 HTTPS 구성이 포함되어 있다.

반응형
server {
    listen 80;
    server_name api.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name api.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

3️⃣ AWS Load Balancer (ALB) 구성

여러 EC2 인스턴스가 있다면 ALB → Target Group → EC2 구조로 연결한다.

  1. Target Group 생성
    • Target type: Instance
    • Port: 80 (Nginx가 받는 포트)
    • Health check: /healthz
  2. ALB 생성
    • Scheme: Internet-facing
    • Listener: HTTP(80), HTTPS(443)
    • HTTPS는 ACM에서 SSL 인증서 등록 후 선택
    • Target Group 연결
  3. Auto Scaling Group (선택)
    • 인스턴스가 2개 이상일 때 자동 확장
    • Launch Template에 docker compose up -d를 User Data로 추가

4️⃣ Cloudflare 설정 (DNS + CDN + HTTPS Edge)

  1. Cloudflare 등록
    • yourdomain.com 추가
    • 네임서버를 Cloudflare가 제공한 것으로 교체
  2. DNS 레코드 추가
  3. Type: A Name: api IPv4: [ALB Public IP or EC2 IP] Proxy status: Proxied (Cloudflare CDN 활성)
  4. SSL/TLS 모드
    • “Full (strict)” 선택
    • Cloudflare가 인증서 관리, EC2 내부에서는 Let’s Encrypt 유지 가능
  5. Caching Rule
    • /docs → Cache Everything (Swagger 문서 캐시)
    • /api/* → Bypass (API 응답 캐시 안 함)

5️⃣ CloudWatch + Slack 연동

CloudWatch Agent 설치

sudo apt install amazon-cloudwatch-agent -y
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

로그 파일(/root/.pm2/logs/*.log) 경로 지정 후 CloudWatch에 업로드하도록 설정.

Slack 알림 연동

  • CloudWatch Alarm → SNS Topic 생성
  • SNS Topic → Slack Webhook (via AWS Chatbot)

예:

🚨 [NestJS] CPU Usage > 80%
Server: api.yourdomain.com
Time: 2025-11-17 14:22


6️⃣ 실제 트래픽 구조

[User Browser]
     │
     ▼
[ Cloudflare Edge CDN ]
     │  (SSL/TLS 1.3)
     ▼
[ AWS Load Balancer ]
     │
 ┌─────────────┬─────────────┐
 │ EC2 (Blue)  │ EC2 (Green) │
 │ Docker + PM2│ Docker + PM2│
 │ 3001        │ 3002        │
 └─────────────┴─────────────┘
     │
     ▼
 [MySQL RDS] + [Redis ElastiCache]

Cloudflare에서 전 세계 엣지 캐시를 제공하고,
ALB가 트래픽을 자동으로 분산,
각각의 인스턴스는 Blue/Green 구조로 무중단 교체된다.


7️⃣ 배포 시점 전체 자동화 시퀀스

단계 동작

git push origin main
GitHub Actions → SSH 연결
Docker build & compose up
Prisma migrate
Health check OK
Nginx reload & proxy switch
Cloudflare → ALB → EC2 자동 반영
Slack “배포 완료” 메시지 전송

8️⃣ 트러블슈팅

문제 원인/해결

Cloudflare 502 Origin SSL 인증서 만료 → certbot renew 필요
ALB unhealthy /healthz 응답 오류 → Prisma/Redis 연결 확인
Blue/Green 혼선 포트 중복 → Nginx upstream 고정 확인
Docker volume 깨짐 db_data 볼륨 손상 → docker volume rm 후 재마이그레이션
IP 제한 이슈 Cloudflare IP만 허용 중이면 ALB 헬스체크 실패 주의

✅ 이번 편 정리

항목 상태

EC2 + Docker 환경
Nginx HTTPS (Let’s Encrypt)
ALB 트래픽 분산
Cloudflare CDN/SSL
Slack + CloudWatch 알림
Blue-Green 유지

🔮 다음 편 예고

이제 “백엔드 인프라”는 완전히 구축됐다.
다음 시리즈에서는 프론트엔드(Next.js) + NestJS + Cloudflare Pages + R2 + CDN 통합 운영 편으로 넘어간다.

즉,
👉 프론트+백엔드 완전 통합 운영 아키텍처 (Full Infra as Code)
편으로 이어진다.
코드 한 줄로 전 세계 엣지에서 서비스되는 완전한 SaaS 구조를 만든다.


 

NestJS, AWS, Cloudflare, Docker, EC2, LoadBalancer, HTTPS, CDN, DevOps, 배포자동화, 백엔드운영

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
반응형