AWS Structure (API 서버 구성도)

Route53 > WAF > ALB > AutoScalingGroup > EC2 > Nginx > Django

Route53

DNS (Domain Name System)

www.도메인.com과 같이 도메인을 통해 컴퓨터 간 연결에 사용되는 숫자 IP 주소와 연결하줍니다.

WAF

WAF (Web Application Firewall)
방화벽 ELB에 요청을 보내기 전 비상적 요청에 대한 사항을 차단합니다.

ALB(ELB)

ALB (Application LoadBalancer)

API 통신만 허용하기 때문에 Load Balancer 중 http/https만 허용하는 ALB를 사용합니다.

AutoScaling Group

ALB에서 오는 요청들을 처리하는 EC2의 갯수를 관리합니다.
CPU 사용량에 따라 트래픽이 증가하면 AutoScaling 규칙에 따라 EC2를 새로 증설하고 트래픽이 감소하면 규칙에 따라 자동적으로 감소하는 역할을 수행합니다.

  • cf1) 통상적으로 Cpu Utilization이 50%가 넘는다
    면 증가 20%이하면 감소 하는 규칙을 구성했습니다.

기존 유지하는 ec2에 개수에 따라 달라질 수 있습니다.

  • cf2) 서버의 cpu 사용량은 40~60퍼로 유지하는것이 안정적입니다.

  • cf3) AutoScaling된 EC2의 DOCKER 서버 초기화 및 재기동이 필요하다면 인스턴스 세부 정보 구성에 이르면 사용자 데이터(User data) 필드에 아래의 명령어를 기입한다.

1
2
3
#!/bin/bash
docker-compose build
docker-compose up -d

EC2

EC2의 보안규칙은 같은 VPC에 존재하는 로드밸런서에서 오는 요청만 처리하게 구성하고 iptables로 리눅스 자체의 방화벽을 강화해 DDoS요청을 방지합니다.

Nginx

Http_REFERER, USER_AGENT, GEO_IP 등 인가된 사용자가 아니면 해당 요청을 수행하지 못하게 구성합니다.

Django

jwt token을 통해서 로그인을 관리하고
Api_key를 통해 해당 API를 실행할 때 Authorization 부분에 해당되는 key가 존재하지 않는다면 API 접근 에러를 발생하게 구성합니다.
또한 CORS 설정을 통해 WHITE_LIST를 관리해 해당되는 사이트가 아니면 CORS POLICY를 위반해 접근 불가능하게 구성합니다.

Docker

nginx / Django(Gunicorn) / Celery / RabbitMQ 모두 Docker로 구동됩니다.

WAF 설정

AWS WAF는 CloudFront(CDN)/ALB/API Gateway 3가지 서비스에 연동가능하며 저는 위에 구성되어 있는 alb와 연동했습니다.

WAF 는 ACL 과 Rule로 구성되어 있고 ACLRule들의 집합이라고 생각하면 편합니다.

HTTP_REFERER / User-Agent / GEO_IP에 대해서는 내부서버(EC2)에서 처리하므로 초반 비정상적 트래픽을 관리하기 위해 Rule Based 규칙에 있는 5분동안 Source IP(IP주소)에서 N번의 요청을 보낼 시 차단하는 방화벽을 구성합니다.