오늘은 AWS 클라우드 환경에서 회사 전용 독립 네트워크(Custom VPC)를 설계하고,
이를 테라폼(Terraform) 코드로 완벽하게 구축하는 방법에 대해 알아보겠습니다.
기존 기본(Default) VPC 환경에서 벗어나 프로덕션급 보안 및 안정성을 갖춘 전용 네트워크 망을 다지는 첫걸음입니다.

1. 개요 및 최종 네트워크 구성 목표
AWS에서 커스텀 VPC를 구축하는 이유는 기업 인프라 자원의 격리 및 보안 강화입니다.
우리의 로드맵은 커스텀 VPC를 기반으로 웹(Public Subnet), 백엔드/DB(Private Subnet)를 구축하고, 나아가 EKS, CI/CD, 모니터링 시스템까지 확장할 수 있는 견고한 뼈대를 만드는 것입니다.
AWS Account (ap-northeast-2)
└── Company VPC (10.0.0.0/16)
├── Public Subnet (10.0.1.0/24) ─── Internet Gateway ─── Internet
│ ├── ALB / Bastion Host
│ └── NAT Gateway (EIP) ───┐ (Outbound Pull)
│ │
└── Private Subnet (10.0.101.0/24) ◀┘
├── WAS / EKS Worker Node
└── Database (RDS)
2. VPC 핵심 개념: 현실세계 비유로 한눈에 이해하기
클라우드 용어가 다소 생소하다면 아파트 단지 체계와 비교해 보면 아주 직관적으로 이해할 수 있습니다.
| AWS 네트워크 용어 | 현실세계 비유 | 설명 |
| AWS Cloud | 도시 / 국가 | 전체 서비스 생태계 공간 |
| VPC | 아파트 단지 | 나(회사)만 사용하는 독립된 사설 네트워크 공간 |
| Subnet | 아파트 동 (101동, 102동...) | VPC를 용도/보안 수준별로 나눈 작은 네트워크 구역 |
| EC2 / DB | 세대 (101호, 102호...) | 실제 서버 자원 |
| Internet Gateway (IGW) | 아파트 정문 | 외부 인터넷 트래픽이 드나드는 대문 (양방향) |
| Route Table | 단지 내 안내 표지판 | 패킷(데이터)이 목적지를 찾아가는 이정표 |
| Security Group (SG) | 각 집 현관문 | EC2/인스턴스 단위의 Stateful 방화벽 |
| Network ACL (NACL) | 단지/동 출입 통제소 | 서브넷 단위의 Stateless 방화벽 (1차 검문) |
| NAT Gateway | 아파트 후문 택배 출구 | Private 서브넷 내부에서 외부로 데이터(패킷)를 요청해 다운로드(Pull)만 받는 일방향 출구 |
3. VPC 구성 요소 및 네트워크 상세 구조
1) Default VPC vs Custom VPC
- Default VPC: 리전별로 기본 자동 생성되어 있으며, 누구나 쉽게 학습 및 테스트용으로 활용할 수 있으나 보안 정책 및 대역 설계에 한계가 있습니다.
- Custom VPC: 기업의 필요에 맞추어 CIDR 대역, 서브넷 개수, 라우팅 테이블, 게이트웨이 등을 직접 설계하여 만드는 전용 네트워크입니다.
2) CIDR (Classless Inter-Domain Routing) 및 가용 IP 계산
VPC 생성 시 IP 주소 범위를 지정합니다. 예컨대 10.0.0.0/16 설정 시:
- 앞 16비트(10.0)는 고정되며, 뒤 16비트를 변경하여 총 2^{16} = 65,536개의 IP를 사용할 수 있습니다.
- 하위 서브넷으로 10.0.1.0/24를 할당하면 2^{32-24} = 256개의 IP가 생성됩니다.
💡 AWS 예약 IP (5개) 지식 더하기
서브넷 대역당 전체 256개 IP 중 아래 5개는 AWS 시스템 관리용으로 예약되어 있으므로 실제 할당 가능 IP는 251개가 됩니다.
- 10.0.1.0: 네트워크 주소
- 10.0.1.1: AWS VPC 라우터 주소
- 10.0.1.2: AWS DNS 서버 주소
- 10.0.1.3: AWS 향후 예약용 주소
- 10.0.1.255: 브로드캐스트 주소
3) 서브넷 (Public vs Private) 및 게이트웨이
- Public Subnet: 외부 인터넷 망과 직접 통신하는 구역입니다. 라우팅 테이블이 Internet Gateway(IGW)로 연결되어 있으며, ALB, Bastion Host 등이 배치됩니다.
- Private Subnet: 외부 망과 완전 격리된 보안 구역입니다. 외부에서 직접 들어오는 트래픽은 모두 차단되지만, 소프트웨어 패치나 Docker 이미지 다운로드(Pull)를 위해 NAT Gateway를 거쳐 외부로 나갈 수 있습니다.
[ 패킷 흐름 및 보안 계층 관문 ]
[ Internet / External ]
│
▼
┌──────────────────────────────┐
│ Subnet Boundary │
│ ┌──────────────────────┐ │
│ │ Network ACL (NACL) │ ⬅️ 1차 검문 (Stateless, 서브넷 단위)
│ └──────────┬───────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Security Group (SG) │ ⬅️ 2차 검문 (Stateful, ENI/인스턴스 단위)
│ └──────────┬───────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ EC2 Instance │ ⬅️ 최종 도착지
│ └──────────────────────┘ │
└──────────────────────────────┘
4. 테라폼(Terraform)을 이용한 Custom VPC 구축 실습
이제 HCL(HashiCorp Configuration Language) 코드를 활용해 커스텀 VPC, 퍼블릭 서브넷, 인터넷 게이트웨이, 라우트 테이블 및 연결(Association)을 만들어 보겠습니다.
~/tf-step3/vpc.tf 코드 작성
# 1. 커스텀 VPC 생성 (Company VPC)
resource "aws_vpc" "DE-AI-07-COMPANY" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "DE-AI-07-COMPANY"
}
}
# 2. 퍼블릭 서브넷 생성
resource "aws_subnet" "public" {
# 암묵적 의존성: vpc_id 속성을 참조하므로 VPC가 먼저 생성된 후 서브넷이 생성됩니다.
vpc_id = aws_vpc.DE-AI-07-COMPANY.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true # 인스턴스 생성 시 자동으로 퍼블릭 IP 부여
tags = {
Name = "DE-AI-07-COMPANY-public-subnet"
}
}
# 3. 인터넷 게이트웨이 (IGW) 생성
resource "aws_internet_gateway" "company" {
vpc_id = aws_vpc.DE-AI-07-COMPANY.id
tags = {
Name = "DE-AI-07-COMPANY-igw"
}
}
# 4. 라우트 테이블 생성 (Public 전용)
resource "aws_route_table" "public" {
vpc_id = aws_vpc.DE-AI-07-COMPANY.id
# 0.0.0.0/0 (모든 외부 트래픽)을 인터넷 게이트웨이로 전달
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.company.id
}
tags = {
Name = "DE-AI-07-COMPANY-public-rt"
}
}
# 5. 서브넷과 라우트 테이블 최종 연결 (Association)
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
명령어 실행 및 결과 검증
파일 작성이 완료된 터미널에서 다음 명령어를 차례대로 실행합니다.
# 1. 프로바이더 및 파이프라인 초기화
terraform init
# 2. 인프라 생성 계획 확인
terraform plan
# 3. 인프라 실제 프로비저닝 적용
terraform apply
생성 완료 후 리소스 상태를 조회하여 인프라가 문제없이 연동되었는지 검증합니다.
terraform state list
# 실행 결과 예시
aws_internet_gateway.company
aws_route_table.public
aws_route_table_association.public
aws_subnet.public
aws_vpc.DE-AI-07-COMPANY
🖐️ 요약 및 결론
- Custom VPC 구축: 기본 설정에 의존하지 않고 기업 환경에 적합한 사설 망을 세밀하게 제어할 수 있습니다.
- 보안 인프라 구조: Public과 Private 영역을 분리하여 핵심 리소스(WAS/DB)의 노출을 차단합니다.
- 코드 기반의 제어(IaC): 테라폼을 통해 네트워크 아키텍처 전체를 버전 관리하고 재현성 있게 배포할 수 있습니다.
다음 포스팅에서는 이번에 만든 Public 서브넷에 연결될 Private 서브넷 구축 및 NAT Gateway 연결 과정을 함께 다루어 보겠습니다!