
[network] VPC와 서브넷
내 서버를 어디에 두고 무엇을 열어줄지, 클라우드 네트워크의 밑그림은 여기서 시작됩니다.
One-Line Summary
VPC는 AWS 클라우드 안에 만드는 논리적으로 격리된 나만의 가상 네트워크 공간이고, Subnet은 그 VPC의 IP 범위를 더 작게 쪼갠 구획이다. VPC는 리전 전체에 걸치고, 서브넷은 하나의 AZ(가용 영역)에 묶인다. 서브넷을 인터넷에 연결하느냐 마느냐로 public / private을 나누는 것이 네트워크 설계의 출발점이다.
Why It Exists
여러 애플리케이션·서버를 한 네트워크에 아무 통제 없이 두면, 외부에 노출되면 안 되는 DB까지 인터넷에 열리거나 서로 간섭한다. 온프레미스에서 방화벽·서브넷·라우터로 망을 나누던 것을 클라우드에서도 그대로 하고 싶다.
VPC와 Subnet은 이 문제를 해결한다.
통제 없는 단일 네트워크
-> 웹 서버도 DB도 다 같은 공간, 외부 노출/간섭 위험
VPC + Subnet
-> VPC로 격리된 사설 공간을 만들고(내 IP 대역 지정)
-> Subnet으로 "인터넷에 열 곳(public)"과 "숨길 곳(private)"을 분리
-> 라우팅/방화벽으로 흐름을 세밀하게 통제
시험 감각:
"격리된 사설 네트워크" = VPC. "그 안을 용도/AZ별로 나눈 구획" = Subnet. "웹은 열고 DB는 숨긴다" = public/private subnet 분리.
Abbreviations
| 약어 | 풀네임 | 의미 |
|---|---|---|
VPC | Virtual Private Cloud | AWS 안의 격리된 가상 사설 네트워크 |
Subnet | Subnetwork | VPC IP 범위를 나눈 하위 구획, 하나의 AZ에 속함 |
CIDR | Classless Inter-Domain Routing | IP 주소 범위를 10.0.0.0/16처럼 표기하는 방식 |
AZ | Availability Zone | 리전 안의 물리적으로 분리된 데이터센터 묶음 |
IGW | Internet Gateway | VPC를 인터넷에 연결하는 관문 |
NAT | Network Address Translation | 사설 IP를 공인 IP로 바꿔 아웃바운드를 대신 내보내는 장치 |
Route Table | Route Table | 트래픽이 어디로 갈지 정하는 경로 규칙표 |
ENI | Elastic Network Interface | 인스턴스에 붙는 가상 네트워크 카드(사설 IP를 가짐) |
RFC 1918 | RFC 1918 | 인터넷에 라우팅되지 않는 사설 IP 대역 표준 |
VPC란 무엇인가 (상세)
VPC는 AWS 리전 안에 만드는 논리적으로 격리된 가상 네트워크다. 물리 장비는 AWS가 공유·관리하지만, 논리적으로는 내 계정 전용 네트워크처럼 완전히 분리되어 있다.
| 항목 | 내용 |
|---|---|
| 범위 | 리전(Region) 단위 — 하나의 VPC는 그 리전의 여러 AZ에 걸칠 수 있다 |
| IP 대역 | 만들 때 CIDR 블록을 직접 지정 (예: 10.0.0.0/16 → 약 65,536개 IP) |
| 권장 대역 | RFC 1918 사설 대역: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
| CIDR 크기 | /16(최대, 65,536개) ~ /28(최소, 16개) |
| 격리 | 기본적으로 완전히 격리 — 인터넷·다른 VPC와 연결하려면 내가 명시적으로 구성 |
| 담기는 것 | 서브넷, 라우트 테이블, IGW, NAT, 보안 그룹, NACL, 엔드포인트 등 |
| 기본 VPC | 계정/리전마다 AWS가 미리 만들어 둔 Default VPC 존재(바로 쓸 수 있게 public 구성) |
참고: 주 CIDR은 생성 후 변경 불가하지만, 나중에 보조(secondary) CIDR을 추가해 확장할 수 있다. 그래서 처음에 IP 대역을 넉넉하고 신중하게 잡는 것이 중요하다(피어링/VPN 시 대역이 겹치면 안 됨).
Subnet이란 무엇인가 (상세)
Subnet은 VPC의 큰 IP 대역을 더 작게 나눈 구획이다. 실제 EC2·RDS 같은 리소스는 VPC가 아니라 특정 서브넷 안에 배치된다.
| 항목 | 내용 |
|---|---|
| 범위 | 하나의 AZ에 종속 — 서브넷은 여러 AZ에 걸칠 수 없다 |
| IP 대역 | VPC CIDR의 부분집합 (예: VPC 10.0.0.0/16 안에 10.0.1.0/24) |
| 배치 대상 | EC2, RDS, Lambda(VPC 연결) 등 리소스가 서브넷에 놓임 |
| public/private | 연결된 라우트 테이블이 IGW로 가는 경로를 갖느냐로 결정 |
| 예약 IP | 각 서브넷에서 5개 IP는 AWS가 예약(맨 앞 4개 + 맨 뒤 1개), 사용자는 못 씀 |
예약되는 5개 IP (예: 10.0.1.0/24):
10.0.1.0 네트워크 주소
10.0.1.1 VPC 라우터
10.0.1.2 AWS DNS
10.0.1.3 향후 사용을 위해 예약
10.0.1.255 브로드캐스트 주소(관례상 예약)
그래서
/24(256개)라도 실제 사용 가능한 IP는 251개다.
VPC와 Subnet의 관계 (직관 비교)
| 비교 항목 | VPC | Subnet |
|---|---|---|
| 한 줄 정의 | 격리된 가상 네트워크 전체 | VPC를 쪼갠 하위 구획 |
| 범위 | 리전 전체(여러 AZ 포함) | 단일 AZ에 종속 |
| IP 대역 | 큰 CIDR (예: /16) | VPC의 부분집합 (예: /24) |
| 개수 | 리전당 여러 개 가능 | 한 VPC 안에 여러 개 |
| 리소스 배치 | 직접 배치 안 함(컨테이너 역할) | 실제 EC2/RDS 등이 여기 배치 |
| 인터넷 연결 결정 | VPC에 IGW를 붙임 | 라우트 테이블로 public/private 결정 |
| 비유 | 하나의 건물(부지) | 건물 안의 각 층/방 |
포함 관계 그림:
Region (예: ap-northeast-2 서울)
└── VPC 10.0.0.0/16 ← 리전 전체에 걸침
├── AZ-a
│ ├── Subnet(public) 10.0.1.0/24 ← 웹/ALB/NAT 배치
│ └── Subnet(private) 10.0.2.0/24 ← 앱/DB 배치
└── AZ-c
├── Subnet(public) 10.0.3.0/24
└── Subnet(private) 10.0.4.0/24
핵심 감각: VPC = 리전, Subnet = AZ. 그래서 고가용성(HA)을 원하면 여러 AZ에 서브넷을 나눠 배치한다. 한 AZ가 죽어도 다른 AZ 서브넷의 리소스로 서비스가 유지된다.
Public Subnet vs Private Subnet (가장 많이 쓰는 분할)
VPC를 나눌 때 가장 흔한 방식은 외부에서 접근 가능한 네트워크(public)와 접근 불가능한 네트워크(private)로 나누는 것이다.
| 구분 | Public Subnet | Private Subnet |
|---|---|---|
| 인터넷에서 직접 접근 | 가능 | 불가 |
| 라우트 테이블 | 0.0.0.0/0 → IGW 경로 있음 | IGW로 가는 경로 없음 |
| 공인 IP | 인스턴스에 부여 가능 | 부여 안 함(사설 IP만) |
| 아웃바운드 인터넷 | IGW로 직접 | NAT Gateway를 거쳐 나감 |
| 대표 배치 | ALB, Bastion Host, NAT Gateway | 애플리케이션 서버, RDS 같은 DB |
무엇이 public/private를 결정하나? → 서브넷 자체에 스위치가 있는 게 아니라, 그 서브넷에 연결된 라우트 테이블이 IGW로 가는 경로(0.0.0.0/0 → igw-xxxx)를 갖느냐가 결정한다.
Public Subnet 라우트 테이블
10.0.0.0/16 -> local (VPC 내부 통신)
0.0.0.0/0 -> igw-xxxx (인터넷) ← 이 줄이 있으면 public
Private Subnet 라우트 테이블
10.0.0.0/16 -> local
0.0.0.0/0 -> nat-xxxx (아웃바운드만, NAT 경유) ← IGW 직접 경로 없음
실제 사용 패턴 — 3-Tier 아키텍처
가장 전형적인 웹 서비스 구성이다. 여러 AZ에 걸쳐 public/private를 나눈다.
Internet
│
▼
┌─ VPC ───────────────────────────┐
│ ┌─ public subnet ─────────────┐ │
│ │ ALB · Bastion · NAT Gateway │ │ ← 인터넷 접점
│ └─────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─ private subnet (App) ──┐ │
│ │ App EC2 │ │ ← 외부 직접 접근 불가(ALB 통해서만)
│ └─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─ private subnet (DB) ──┐ │
│ │ RDS │ │ ← App tier에서만 접근, 인터넷 차단
│ └────────────────────────┘ │
└─────────────────────────────────┘
| 계층 | 서브넷 | 이유 |
|---|---|---|
| 로드 밸런서/진입점 | Public | 인터넷 요청을 받아야 하므로 |
| 애플리케이션 | Private | 외부에 직접 노출할 이유가 없음(ALB 통해서만 접근) |
| 데이터베이스 | Private | 절대 인터넷에 노출되면 안 됨, 앱 계층에서만 접근 |
| 아웃바운드 필요(패치 등) | Private → NAT(Public) | 인바운드는 막되 아웃바운드는 NAT로 허용 |
프라이빗 서브넷의 앱 서버가 OS 패치나 외부 API 호출로 인터넷에 나가야 하지만 외부에서 들어오는 것은 막고 싶을 때, public 서브넷의 NAT Gateway를 경유시킨다. (NAT는 별도 노트에서 상세히)
CIDR·IP 설계 시 주의 (실무 감각)
| 주의점 | 이유 |
|---|---|
| VPC CIDR을 넉넉히 잡되 겹치지 않게 | 나중에 VPC Peering/VPN/Transit Gateway 연결 시 대역이 겹치면 통신 불가 |
| 서브넷은 여러 AZ에 분산 | 단일 AZ 장애에도 서비스 유지(HA) |
| 예약 IP 5개 고려 | /24도 실제 251개만 사용 가능 |
| 주 CIDR은 변경 불가 | 확장은 보조 CIDR 추가로만 가능 → 초기 설계 중요 |
| 서브넷 크기 산정 | 필요 IP 수(리소스 + 오토스케일 여유)를 고려해 /24, /20 등 결정 |
실무 시나리오 — 3-Tier를 넘어서 (SAA 빈출)
시나리오 1. 서브넷 IP 고갈 (Auto Scaling·EKS·Lambda)
프라이빗 서브넷을 /24(251개)로 잡았는데 오토스케일로 인스턴스가 급증하거나, EKS 파드가 ENI마다 사설 IP를 소비하거나, VPC-연결 Lambda가 동시성만큼 ENI를 잡으면 IP가 빠르게 고갈된다 → 신규 인스턴스/파드 기동 실패.
- 대응: 서브넷을 넉넉히(
/22,/20) 설계하거나, 보조(secondary) CIDR을 추가해 새 서브넷을 붙인다. - 시험 감각: "instances fail to launch / cannot assign IP in subnet" → 서브넷 CIDR이 작아 IP 고갈 → 더 큰 대역/보조 CIDR.
시나리오 2. 대역 확장 — 주 CIDR은 못 바꾼다
운영 중 IP가 부족한데 주 CIDR은 변경 불가다. → VPC에 보조 CIDR 블록을 추가하고 거기에 새 서브넷을 만든다. (기존 대역과, 그리고 피어링/VPN 상대 대역과 겹치지 않아야 함.)
시나리오 3. Multi-AZ 고가용성 설계
각 계층(웹/앱/DB)의 서브넷을 최소 2개 AZ에 쌍으로 만든다. ALB는 여러 AZ 서브넷에 걸치고, RDS는 Multi-AZ로 대기 인스턴스를 다른 AZ 서브넷에 둔다 → 한 AZ 장애에도 서비스 유지.
AZ-a: [pub-a][app-a][db-a] AZ-c: [pub-c][app-c][db-c]
ALB는 pub-a·pub-c에 걸침 / RDS 기본=db-a, 대기=db-c (Multi-AZ)
시나리오 4. 여러 계정이 같은 네트워크 공유 — VPC Sharing
중앙 네트워크 계정이 **RAM(Resource Access Manager)**으로 서브넷을 다른 계정과 공유 → 각 팀 계정은 공유 서브넷에 리소스를 띄우되 네트워크는 중앙이 일괄 관리. (계정마다 VPC를 난립시키지 않는 대규모 조직 패턴.)
시험 트리거: "share subnets across accounts, central network management" → VPC Sharing(RAM).
Common Wrong Directions
| 오답 방향 | 왜 부족한가 |
|---|---|
| 서브넷이 여러 AZ에 걸친다고 생각 | 서브넷은 단일 AZ에만 속함. HA는 AZ별 서브넷을 별도로 만든다 |
| VPC가 특정 AZ에만 있다고 생각 | VPC는 리전 전체에 걸침 |
| "public subnet"이라 하면 자동으로 인터넷 연결 | 라우트 테이블에 IGW 경로가 있어야 public. 이름만으론 결정 안 됨 |
| DB를 public 서브넷에 두고 보안 그룹만 믿음 | DB는 private 서브넷에 두는 것이 정석(다층 방어) |
| 프라이빗 서브넷은 인터넷과 완전 단절이라 패치도 불가 | 아웃바운드는 NAT Gateway로 가능(인바운드만 차단) |
| 처음에 작은 CIDR로 만들고 나중에 주 CIDR 변경 | 주 CIDR 변경 불가 → 보조 CIDR 추가 또는 재설계 |
Exam Triggers
| 문제에서 이런 표현이 나오면 | 떠올릴 것 |
|---|---|
| "isolated / private network in AWS" | VPC |
| "resources should not be reachable from the internet" | Private Subnet (+ IGW 경로 없음) |
| "load balancer / bastion must accept internet traffic" | Public Subnet |
| "private instances need outbound internet for updates" | NAT Gateway (private → public) |
| "highly available across AZs" | 여러 AZ에 서브넷 분산 |
| "which decides public vs private subnet" | Route Table의 IGW 경로 유무 |
| "VPCs will be peered/connected later" | CIDR 겹치지 않게 설계 |
| "instances fail to launch / no IPs left in subnet" | 서브넷 CIDR 부족 → 큰 대역/보조 CIDR |
| "expand VPC address space in production" | 보조 CIDR 추가(주 CIDR 변경 불가) |
| "share subnets across accounts, central mgmt" | VPC Sharing (RAM) |
Memory Sentence
VPC는 리전 전체에 걸친 격리된 사설 네트워크(내 CIDR 지정), 서브넷은 그것을 단일 AZ 단위로 쪼갠 구획. IGW로 가는 라우트가 있으면 public·없으면 private. 웹/ALB는 public, 앱·DB는 private에 두고, private의 아웃바운드는 NAT로 내보낸다. HA는 여러 AZ에 서브넷을 나눠서.
References
댓글
아직 댓글이 없습니다.