먼저 AWS를 하나의 회사 건물이라고 생각해보자.
회사 건물 (VPC)
┌────────────────────────────────────┐
│ │
│ 사무실(Private) │
│ │
│ 서버실(Private) │
│ │
│ 안내데스크(Public) │
│ │
└────────────────────────────────────┘
인터넷 사람들은
절대로
서버실
로 들어가면 안 된다.
반드시
안내데스크
를 거쳐야 한다.
AWS에서는
안내데스크가
ALB(Application Load Balancer)
이다.
VPC란?
VPC는
내 회사만 사용하는 네트워크
이다.
쉽게 말하면
AWS 안에 내 전용 IDC
를 하나 만드는 것이다.
예를 들어
VPC
10.0.0.0/16
을 만들면
이 안에는
10.0.x.x
만 존재한다.
인터넷에서는
절대로
10.0.1.25
같은 주소를 볼 수 없다.
Subnet은?
VPC를
건물이라고 하면
Subnet은
방이다.
예를 들어
VPC
┌────────────────────────────┐
Public
Private
Database
└────────────────────────────┘
처럼 나눈다.
왜 Public과 Private를 나누나?
예를 들어
ERP 서버가
인터넷에
직접 노출되어 있다고 생각해보자.
Internet
↓
Backend
↓
Database
이러면
해커가
바로
8000 포트
를 공격할 수 있다.
이건 매우 위험하다.
그래서
실제로는
Internet
↓
ALB
↓
Backend
↓
Database
구조를 만든다.
Backend는
인터넷에서 보이지 않는다.
Public Subnet
Public Subnet은
인터넷이 보이는 방이다.
여기에는
보통
ALB
NAT Gateway
Bastion Host
만 넣는다.
즉
외부 사람들이
접속 가능한 것만 둔다.
Private App Subnet
여기가
실제 서비스가 실행되는 곳이다.
React
Django
Node
NestJS
FastAPI
Spring
전부
여기에 있다.
여기에는
Public IP
가 없다.
즉
인터넷에서는
접속이 안 된다.
Private Data Subnet
여기는
데이터만 있다.
PostgreSQL
Redis
EFS
등이다.
심지어
Backend도
허가를 받아야 들어간다.
전체 그림
Internet
│
▼
ALB (Public)
│
──────────────────────────────────────
Private App Subnet
Frontend
│
▼
Backend
│
──────────────────────────────────────
Private Data Subnet
PostgreSQL
EFS
이게
가장 많이 쓰는 구조다.
왜 ALB만 인터넷을 보게 하나?
예를 들어
ERP에는
/login
/api
/files
가 있다.
사용자는
erp.company.com
으로 접속한다.
DNS는
ALB를 가리킨다.
erp.company.com
↓
ALB
↓
Backend
Backend는
세상에 존재하는지조차
모른다.
Security Group이란?
이게
AWS 방화벽이다.
예를 들어
ALB에는
443 허용
만 한다.
Internet
↓
443
ALB
끝이다.
Backend는
8000
을 열어야 한다.
하지만
누구에게?
인터넷이 아니라
ALB에게만.
ALB SG
↓
Backend SG
8000
즉
ALB만
Backend를 볼 수 있다.
Database는?
PostgreSQL은
5432
를 쓴다.
하지만
절대로
Internet
↓
5432
를 열면 안 된다.
대신
Backend SG
↓
5432
RDS SG
만 허용한다.
그러면
Backend만
DB를 본다.
EFS도 마찬가지
EFS는
NFS 프로토콜을 쓴다.
포트는
2049
이다.
하지만
역시
Backend SG
↓
2049
EFS
만 허용한다.
왜 Public IP를 안 주는가?
이게 정말 중요하다.
예를 들어
Backend가
3.39.xxx.xxx
라는 Public IP를 가지면
전 세계 누구나
접속을 시도할 수 있다.
즉
http://3.39.xxx.xxx:8000
를
누군가 계속 때릴 수 있다.
하지만
Private IP만 있다면
10.0.2.15
같은 주소다.
이건
AWS 내부에서만 보인다.
인터넷에서는
아예 접근할 수 없다.
그런데 Private 서버는 인터넷을 어떻게 쓰나?
Backend도
패키지를 설치하고
AWS API도 호출해야 한다.
그래서
Private
↓
NAT Gateway
↓
Internet
를 사용한다.
즉
밖으로는 나갈 수 있지만
밖에서 안으로는 못 들어온다.
이걸
Outbound Only
라고 생각하면 된다.
가용 영역(AZ)을 두 개 쓰는 이유
서울 리전에는 여러 AZ가 있다.
예를 들어
AZ-A
AZ-C
를 사용한다고 하자.
그러면
ALB
/ \
ECS(A) ECS(C)
│ │
RDS Multi-AZ
│
EFS
만약
AZ-A
전체가 장애가 나더라도
AZ-C
가 계속 서비스를 제공한다.
이게 AWS에서 말하는 고가용성(High Availability) 이다.
나의 서비스 ERP 프로젝트에 적용하면
내가 구축하려는 ERP는 이 네트워크 구조가 가장 적합하다.
Internet
│
Route53
│
ACM (HTTPS)
│
ALB (Public Subnet)
│
────────────────────────────────────
Private App Subnet
│
├── React + Nginx (ECS)
└── Django (ECS)
│
────────────────────────────────────
Private Data Subnet
├── RDS PostgreSQL
├── EFS
└── Secrets Manager(연동)
이 구조의 핵심은 인터넷에서는 ALB만 보이고, 애플리케이션과 데이터베이스는 모두 사설 네트워크 안에서만 통신한다는 점이다.
다음 단계에서는 이 구조를 바탕으로 VPC를 실제로 어떻게 생성하고, Subnet, Route Table, Internet Gateway, NAT Gateway가 서로 어떻게 연결되는지를 그림과 함께 설명하면 AWS 네트워크의 전체 흐름이 훨씬 명확해질 것이다.