home
SAA-C03

[network] VPC와 서브넷

내 서버를 어디에 두고 무엇을 열어줄지, 클라우드 네트워크의 밑그림은 여기서 시작됩니다.

One-Line Summary

VPC는 AWS 클라우드 안에 만드는 논리적으로 격리된 나만의 가상 네트워크 공간이고, Subnet은 그 VPC의 IP 범위를 더 작게 쪼갠 구획이다. VPC는 리전 전체에 걸치고, 서브넷은 하나의 AZ(가용 영역)에 묶인다. 서브넷을 인터넷에 연결하느냐 마느냐로 public / private을 나누는 것이 네트워크 설계의 출발점이다.

Why It Exists

여러 애플리케이션·서버를 한 네트워크에 아무 통제 없이 두면, 외부에 노출되면 안 되는 DB까지 인터넷에 열리거나 서로 간섭한다. 온프레미스에서 방화벽·서브넷·라우터로 망을 나누던 것을 클라우드에서도 그대로 하고 싶다.

VPCSubnet은 이 문제를 해결한다.

통제 없는 단일 네트워크
  -> 웹 서버도 DB도 다 같은 공간, 외부 노출/간섭 위험

VPC + Subnet
  -> VPC로 격리된 사설 공간을 만들고(내 IP 대역 지정)
  -> Subnet으로 "인터넷에 열 곳(public)"과 "숨길 곳(private)"을 분리
  -> 라우팅/방화벽으로 흐름을 세밀하게 통제

시험 감각:

"격리된 사설 네트워크" = VPC. "그 안을 용도/AZ별로 나눈 구획" = Subnet. "웹은 열고 DB는 숨긴다" = public/private subnet 분리.

Abbreviations

약어풀네임의미
VPCVirtual Private CloudAWS 안의 격리된 가상 사설 네트워크
SubnetSubnetworkVPC IP 범위를 나눈 하위 구획, 하나의 AZ에 속함
CIDRClassless Inter-Domain RoutingIP 주소 범위를 10.0.0.0/16처럼 표기하는 방식
AZAvailability Zone리전 안의 물리적으로 분리된 데이터센터 묶음
IGWInternet GatewayVPC를 인터넷에 연결하는 관문
NATNetwork Address Translation사설 IP를 공인 IP로 바꿔 아웃바운드를 대신 내보내는 장치
Route TableRoute Table트래픽이 어디로 갈지 정하는 경로 규칙표
ENIElastic Network Interface인스턴스에 붙는 가상 네트워크 카드(사설 IP를 가짐)
RFC 1918RFC 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의 관계 (직관 비교)

비교 항목VPCSubnet
한 줄 정의격리된 가상 네트워크 전체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 SubnetPrivate 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

댓글

아직 댓글이 없습니다.