VPC
Virtual Private Cloud
클라우드 내 격리된 가상 네트워크. 서브넷, 라우팅 테이블 구성.
Virtual Private Cloud
클라우드 내 격리된 가상 네트워크. 서브넷, 라우팅 테이블 구성.
VPC(Virtual Private Cloud)는 퍼블릭 클라우드 내에서 논리적으로 격리된 프라이빗 네트워크 공간입니다. 온프레미스 데이터센터의 네트워크를 클라우드에서 재현할 수 있으며, IP 주소 범위, 서브넷, 라우팅 테이블, 게이트웨이를 완전히 제어합니다.
VPC는 서브넷으로 구분됩니다. 퍼블릭 서브넷은 인터넷 게이트웨이를 통해 외부와 통신하고, 프라이빗 서브넷은 NAT 게이트웨이를 통해서만 아웃바운드 통신이 가능합니다. 데이터베이스 같은 민감 리소스는 프라이빗 서브넷에 배치합니다.
보안 그룹(Security Group)은 인스턴스 레벨의 방화벽으로 인바운드/아웃바운드 트래픽을 제어합니다. 네트워크 ACL(NACL)은 서브넷 레벨에서 추가적인 보안 계층을 제공합니다. 두 가지를 조합하여 심층 방어(Defense in Depth)를 구현합니다.
VPC Peering으로 다른 VPC와 연결하고, Transit Gateway로 여러 VPC와 온프레미스 네트워크를 중앙에서 관리할 수 있습니다. PrivateLink를 사용하면 인터넷을 거치지 않고 AWS 서비스에 접근합니다.
# Terraform: AWS VPC 구성
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
}
}
# 퍼블릭 서브넷 (AZ 2개)
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = {
Name = "public-subnet-${count.index + 1}"
}
}
# 프라이빗 서브넷 (DB용)
resource "aws_subnet" "private" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 10}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
tags = {
Name = "private-subnet-${count.index + 1}"
}
}
# 인터넷 게이트웨이
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
}
# NAT 게이트웨이 (프라이빗 서브넷 아웃바운드용)
resource "aws_nat_gateway" "main" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public[0].id
}
# 보안 그룹: 웹 서버
resource "aws_security_group" "web" {
name = "web-sg"
description = "Allow HTTP/HTTPS inbound"
vpc_id = aws_vpc.main.id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# 보안 그룹: DB (웹 서버에서만 접근)
resource "aws_security_group" "db" {
name = "db-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.web.id] # 웹 SG에서만
}
}
네트워크: "DB를 퍼블릭 서브넷에 두면 안 됩니다. 프라이빗 서브넷으로 옮기고 보안 그룹에서 웹 서버 SG만 허용하세요."
개발: "그럼 로컬에서 DB 접속은 어떻게 하나요?"
네트워크: "Bastion 호스트나 SSM Session Manager 쓰면 됩니다. 직접 외부 노출은 절대 안 돼요."
면접관: "3-tier 아키텍처의 VPC 설계를 설명해주세요."
지원자: "퍼블릭 서브넷에 ALB, 프라이빗 서브넷에 애플리케이션 서버, 별도 프라이빗 서브넷에 RDS를 배치합니다. 보안 그룹 체인으로 ALB→App→DB 방향으로만 통신을 허용하고, 각 티어는 최소 2개 AZ에 분산하여 고가용성을 확보합니다."
리뷰어: "보안 그룹 인바운드에 0.0.0.0/0이 있네요. SSH 포트는 회사 IP 대역만 허용하세요."
작성자: "맞습니다. cidr_blocks를 회사 VPN 대역으로 제한하겠습니다."