학습 목표
VPC·subnet·route table로 클라우드 네트워크 경계를 설계할 수 있다.
Security Group과 NACL의 stateful·stateless·적용 위치 차이를 설명할 수 있다.
ALB·NLB 역할과 K8s Ingress·Service 연결을 설명할 수 있다.
NAT gateway로 private subnet 아웃바운드를 설계할 수 있다.
public/private 서브넷 배치·CIDR 계획 실수를 피할 수 있다.
문제 상황
- EKS worker를 public subnet에 — SSH·API 노출·스캔 폭주
- RDS를 public 접근 허용 — 인터넷에서 5432 시도
- 두 VPC CIDR
10.0.0.0/16겹침 — peering 불가 - NACL로 443 허용했는데 응답 안 옴 — stateless return 규칙 누락
- ALB 뒤 Pod 502 — target group health·SG 미허용
- private subnet Pod 이미지 pull 실패 — NAT 없음
앞서 클라우드 모델·리전·AZ; Network IP·NAT 개념. 이번 편은 AWS VPC 중심 실무 토폴로지다 (GCP VPC·Azure VNet은 동일 패턴).
1. VPC와 subnet
VPC(Virtual Private Cloud) — 리전 내 격리된 가상 네트워크. CIDR 하나 (예: 10.0.0.0/16).

| 구성 | |
|---|---|
| VPC | 10.0.0.0/16 — 전체 주소 공간 |
| Subnet | VPC 조각 — 단일 AZ에 속함 |
| Route table | subnet 연결 — 목적지 → target |
| IGW | Internet Gateway — public 인터넷 |
VPC 10.0.0.0/16
public 10.0.1.0/24 (AZ-a) → route 0.0.0.0/0 → IGW
public 10.0.2.0/24 (AZ-b)
private 10.0.11.0/24 (AZ-a) → route 0.0.0.0/0 → NAT
private 10.0.12.0/24 (AZ-b)
# code/vpc-subnet.example.tf
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
}
resource "aws_subnet" "public_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true
}
resource "aws_subnet" "private_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-2a"
}
| 규칙 | |
|---|---|
| Subnet ≠ AZ 전체 — AZ마다 public+private 쌍 | |
| CIDR 겹침 금지 — peering·VPN 시 | |
| /16 VPC → /24 subnet 여유 — 미리 계획 |
- 앞서 CIDR (Network 13편) — 클라우드 콘솔 기본값 이해
- 14편 Terraform — VPC IaC 대상
2. Route table
Route table — 목적지 CIDR → next hop (IGW, NAT, VPC peering, TGW).
| 대상 | target | subnet |
|---|---|---|
10.0.0.0/16 |
local | 모든 |
0.0.0.0/0 |
igw-xxx | public |
0.0.0.0/0 |
nat-xxx | private |
10.1.0.0/16 |
pcx-xxx | peering |
Public subnet: default → IGW (inbound from internet possible if SG allows)
Private subnet: default → NAT only (no direct inbound from internet)
| 실수 | |
|---|---|
| private에 IGW route | 의도치 public |
| NAT 단일 AZ | AZ 장애 → 아웃바운드 전체 중단 → AZ별 NAT |
| main route table 혼용 | subnet 별 전용 table |
3. Security Group vs NACL
두 층 방화벽 — SG는 ENI·instance 단위, NACL은 subnet 단위.

| Security Group | NACL | |
|---|---|---|
| 범위 | ENI (EC2, ALB, RDS…) | subnet 전체 |
| 상태 | stateful — return 자동 | stateless — in/out 별도 |
| 규칙 | allow 만 | allow + deny 순서 |
| 기본 | deny all inbound | allow all (변경 권장) |
# code/security-group.example.tf
resource "aws_security_group" "api" {
name = "api-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
| 패턴 | |
|---|---|
| ALB SG | 443 from 0.0.0.0/0 |
| App SG | 8080 from ALB SG only |
| RDS SG | 5432 from App SG only |
| NACL | subnet 추가 격리 — 드묾 필요 |
- Network 방화벽 — 클라우드는 SG가 일상
- K8s NetworkPolicy — Pod 레벨 (플랫폼 추가 층)
4. ALB와 NLB
로드 밸런서 — 트래픽 분산·헬스 체크·TLS 종료.

| ALB (L7) | NLB (L4) | |
|---|---|---|
| 계층 | HTTP/HTTPS 라우팅 | TCP/UDP |
| 기능 | path/host routing, TLS | 초저지연, static IP |
| 대상 | IP·instance·Pod (IP mode) | instance·IP |
| K8s | Ingress controller 백엔드 | Service type: LoadBalancer |
Internet → ALB (public subnet) → target group → Pod / EC2 (private)
TLS terminate at ALB
| K8s 연결 | |
|---|---|
| Ingress (7편) | ALB Ingress Controller → AWS ALB 생성 |
| Service LB | NLB·CLB — L4 직접 |
| health | readiness ≠ LB health — 둘 맞춤 |
- 앞서 Ingress·TLS — ALB가 종료 지점 일반
- 502 — SG·target unhealthy·wrong port
5. NAT gateway
Private subnet 리소스 — 인터넷 아웃바운드 (패키지·ECR·API) 필요 · 인바운드 직접 불가.

Private EC2 / EKS node (10.0.11.5)
→ route 0.0.0.0/0 → NAT GW (public subnet)
→ IGW → Internet
Return traffic: NAT remembers connection (SNAT)
| NAT Gateway | 관리형·AZ 고정·요금 |
| NAT Instance | 직접 운영 — 레거시 |
| VPC Endpoint | S3·ECR — NAT 우회·비용↓ |
| 설계 | |
|---|---|
| EKS node | private + NAT or endpoint |
| multi-AZ | AZ마다 NAT (HA) |
| 비용 | NAT 시간·GB — endpoint 검토 |
- Network NAT (15편) — 사설 IP 공인 변환 — 동일 아이디어
- 17편 — VPC endpoint·관리형 서비스
6. EKS 배치 예시
| 리소스 | subnet | SG |
|---|---|---|
| ALB | public | 443 inbound |
| EKS nodes | private | cluster·node SG |
| RDS | private | 5432 from app |
| Control plane | AWS 관리 | endpoint access |
┌─ public subnet ─ ALB
Internet ─ IGW ─────┤
└─ public subnet ─ NAT GW
↑
private subnet ─ EKS workers ─ RDS
| 체크 | |
|---|---|
| API server access | public vs private endpoint |
| Pod → RDS | SG 양방향 아님 — RDS inbound 만 |
| peering | 다른 VPC·온프레 CIDR route |
7. 실무 체크리스트
| 항목 | 확인 |
|---|---|
| CIDR | peering·VPN 미래 겹침? |
| Subnet | AZ 분산·public 최소? |
| Route | private → NAT not IGW? |
| SG | least privilege·SG 참조? |
| LB | health·TLS·target port? |
| NAT | multi-AZ·endpoint 대안? |
| IaC | 14편 Terraform module? |
8. 정리
- VPC·subnet·route — 클라우드 네트워크 골격
- SG stateful vs NACL stateless
- ALB L7 Ingress · NLB L4 Service
- NAT — private 아웃바운드
- EKS — private node + public ALB 표준
- 다음 — 관리형 서비스 (RDS, S3, SQS, Lambda)
다음에 다룰 것
- RDS·ElastiCache, S3
- SQS/SNS, Lambda·Serverless 개요
해당 내용은 AWS VPC User Guide, AWS Well-Architected Framework 의 내용을 기반으로 합니다.
'플랫폼, 데브옵스와 클라우드' 카테고리의 다른 글
| Well-Architected (0) | 2026.07.05 |
|---|---|
| 관리형 서비스 (1) | 2026.07.04 |
| 클라우드 모델 (0) | 2026.07.02 |
| IaC와 GitOps (0) | 2026.07.01 |
| 배포 전략 (0) | 2026.06.30 |