티스토리 뷰
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 인스턴스 설정
- EC2 생성
- Amazon Linux 2023 or Ubuntu 22.04 선택
- 보안 그룹 포트:
- 22 (SSH)
- 80 (HTTP)
- 443 (HTTPS)
- 3001, 3002 (Blue-Green 포트)
- 키페어 다운로드 (.pem)
- 기본 세팅
- sudo apt update && sudo apt install docker docker-compose nginx -y sudo systemctl enable docker sudo usermod -aG docker ubuntu
- 프로젝트 배포
- 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 구조로 연결한다.
- Target Group 생성
- Target type: Instance
- Port: 80 (Nginx가 받는 포트)
- Health check: /healthz
- ALB 생성
- Scheme: Internet-facing
- Listener: HTTP(80), HTTPS(443)
- HTTPS는 ACM에서 SSL 인증서 등록 후 선택
- Target Group 연결
- Auto Scaling Group (선택)
- 인스턴스가 2개 이상일 때 자동 확장
- Launch Template에 docker compose up -d를 User Data로 추가
4️⃣ Cloudflare 설정 (DNS + CDN + HTTPS Edge)
- Cloudflare 등록
- yourdomain.com 추가
- 네임서버를 Cloudflare가 제공한 것으로 교체
- DNS 레코드 추가
- Type: A Name: api IPv4: [ALB Public IP or EC2 IP] Proxy status: Proxied (Cloudflare CDN 활성)
- SSL/TLS 모드
- “Full (strict)” 선택
- Cloudflare가 인증서 관리, EC2 내부에서는 Let’s Encrypt 유지 가능
- 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, 배포자동화, 백엔드운영
'study > 백엔드' 카테고리의 다른 글
| Terraform + GitOps(ArgoCD)로 “전체 인프라를 코드로 관리”하기 (0) | 2025.11.25 |
|---|---|
| Next.js + NestJS + Cloudflare 완전 통합 운영 아키텍처 구축 (0) | 2025.11.21 |
| GitHub Actions로 완전 자동화된 NestJS 배포 파이프라인 구축하기 (0) | 2025.11.17 |
| NestJS + Prisma + Redis + PM2 운영환경 완성편 (0) | 2025.11.04 |
| NestJS Swagger + Docker 배포 환경 구축 (Prisma까지 한 번에) (0) | 2025.11.03 |
- Total
- Today
- Yesterday
- Prisma
- NestJS
- REACT
- Redis
- Next.js
- 웹개발
- SEO최적화
- kotlin
- PostgreSQL
- 쿠버네티스
- node.js
- DevOps
- 압박면접
- rag
- ai철학
- nextJS
- Docker
- 백엔드개발
- 개발블로그
- JWT
- fastapi
- llm
- Express
- 딥러닝
- 프론트엔드개발
- seo 최적화 10개
- JAX
- Python
- CI/CD
- flax
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |

