Chapter 01

VPC 네트워크 구축

"ShopEasy 쇼핑몰을 위한 전용 네트워크를 만들자"

학습 목표

  • VPC, 서브넷, 인터넷 게이트웨이, NAT Gateway의 역할과 관계를 이해한다
  • 퍼블릭 서브넷과 프라이빗 서브넷의 차이를 설명할 수 있다
  • ShopEasy 쇼핑몰에 필요한 VPC 네트워크를 직접 구축한다
  • 라우트 테이블을 이용하여 트래픽 흐름을 제어할 수 있다

이 챕터에서 할 일

ShopEasy 쇼핑몰을 AWS에 배포하려면 가장 먼저 네트워크 인프라를 준비해야 합니다. 현실 세계에서 사무실을 열기 전에 건물을 먼저 짓는 것과 같습니다.

이번 챕터에서는 다음 리소스를 생성합니다:

AWS 리소스 역할 설정값
VPC ShopEasy 전용 가상 네트워크 10.0.0.0/16
퍼블릭 서브넷 2개 EC2, NAT GW 등 인터넷 접근 필요 리소스 10.0.1.0/24, 10.0.2.0/24
프라이빗 서브넷 2개 RDS 등 외부 접근 차단 리소스 10.0.100.0/24, 10.0.101.0/24
인터넷 게이트웨이 (IGW) VPC와 인터넷 연결 VPC에 연결
NAT Gateway 프라이빗 서브넷의 외부 통신 지원 퍼블릭 서브넷에 배치
라우트 테이블 2개 트래픽 경로 설정 퍼블릭용, 프라이빗용
예상 소요 시간

30~40분이 소요됩니다. NAT Gateway 생성에 약 2~3분이 걸리니 당황하지 마세요.

왜 VPC가 필요한가?

AWS에 서버를 만들면 전 세계 수백만 명이 같은 AWS 인프라를 공유하고 있습니다. 만약 네트워크가 분리되어 있지 않다면, 다른 사람이 내 데이터베이스에 접근할 수도 있겠죠. VPC(Virtual Private Cloud)는 AWS 안에 나만의 전용 네트워크를 만들어 다른 사람과 완전히 격리된 환경을 제공합니다.

건물 비유로 이해하는 VPC

VPC의 각 구성 요소를 건물에 비유하면 쉽게 이해할 수 있습니다:

AWS 리소스 건물 비유 역할
VPC 전용 사무실 건물 외부와 격리된 나만의 네트워크. 건물 전체가 내 소유이므로 출입을 내가 통제
서브넷 건물 안의 층 퍼블릭 서브넷 = 1층 상가 (손님이 자유롭게 방문)
프라이빗 서브넷 = 지하 금고 (허가된 직원만 접근)
인터넷 게이트웨이 (IGW) 건물 정문 외부(인터넷)에서 건물(VPC) 안으로 들어오는 유일한 출입구
NAT Gateway 지하 비밀 택배 통로 지하 금고(프라이빗 서브넷)에서 외부로 택배(요청)를 보낼 수 있지만, 외부에서 이 통로로 들어올 수는 없음
라우트 테이블 건물 내 이정표 "외부 손님은 정문(IGW)으로", "지하 택배는 비밀 통로(NAT GW)로" 같은 안내판

CIDR 블록이란?

VPC를 만들 때 CIDR(Classless Inter-Domain Routing) 블록을 지정해야 합니다. 이것은 건물의 주소 체계와 같습니다. 10.0.0.0/16이라고 쓰면 10.0.0.0 ~ 10.0.255.255 범위의 IP 주소 65,536개를 사용할 수 있습니다.

CIDR 표기법 이해하기

/16은 앞의 16비트(10.0)가 고정이라는 뜻입니다. 뒤의 16비트(0.0 ~ 255.255)를 자유롭게 사용합니다.

  • 10.0.0.0/16 = 10.0.X.X (65,536개 IP) - VPC 전체
  • 10.0.1.0/24 = 10.0.1.X (256개 IP) - 서브넷 하나
  • 10.0.100.0/24 = 10.0.100.X (256개 IP) - 서브넷 하나

숫자가 클수록 범위가 좁아집니다: /16(넓음) > /24(좁음) > /32(IP 1개)

왜 서브넷을 2개씩 만드나요?

AWS의 많은 서비스(특히 RDS, ALB)는 고가용성(High Availability)을 위해 최소 2개의 가용 영역(AZ)에 걸친 서브넷을 요구합니다. 우리는 ap-northeast-2aap-northeast-2c 두 곳에 서브넷을 배치합니다.

이렇게 하면 하나의 데이터센터에 장애가 발생해도 다른 데이터센터에서 서비스를 계속할 수 있습니다.

서울 리전의 가용 영역

서울 리전(ap-northeast-2)에는 a, b, c, d 총 4개의 가용 영역이 있습니다. 이 실습에서는 ac를 사용합니다. b는 일부 인스턴스 타입을 지원하지 않을 수 있으므로 주의하세요.

퍼블릭 vs 프라이빗 서브넷

서브넷 자체에 "퍼블릭"이라는 속성이 있는 것이 아닙니다. 라우트 테이블에 인터넷 게이트웨이(IGW)로의 경로(0.0.0.0/0 → IGW)가 있으면 퍼블릭, 없으면 프라이빗입니다.

구분 퍼블릭 서브넷 프라이빗 서브넷
인터넷에서 접근 가능 (IGW 경유) 불가능
인터넷으로 나가기 가능 (IGW 경유) 가능 (NAT GW 경유)
배치할 리소스 EC2 (웹 서버), NAT GW, ALB RDS, ElastiCache, 내부 서버
라우트 테이블 0.0.0.0/0 → IGW 0.0.0.0/0 → NAT GW
보안 모범 사례

데이터베이스(RDS)는 반드시 프라이빗 서브넷에 배치해야 합니다. 인터넷에서 직접 데이터베이스에 접근할 수 없도록 하는 것이 네트워크 수준의 첫 번째 보안 방어선입니다.

ShopEasy 아키텍처에서의 역할

이번 챕터에서 만들 VPC 네트워크는 ShopEasy 전체 인프라의 토대입니다. 이 네트워크 위에 다음 챕터부터 EC2, RDS 등을 배치하게 됩니다.

Chapter 01에서 만들 네트워크 구조
인터넷
사용자 / 외부 서비스
↓↑
ShopEasy-VPC (10.0.0.0/16)
Internet Gateway
ShopEasy-IGW
↓↑
퍼블릭 서브넷 (라우트: 0.0.0.0/0 → IGW)
Public Subnet A
10.0.1.0/24
ap-northeast-2a
(EC2, NAT GW 배치 예정)
Public Subnet C
10.0.2.0/24
ap-northeast-2c
(고가용성 확보)
NAT Gateway
ShopEasy-NAT
(퍼블릭 서브넷 A에 위치)
↓ (아웃바운드만)
프라이빗 서브넷 (라우트: 0.0.0.0/0 → NAT GW)
Private Subnet A
10.0.100.0/24
ap-northeast-2a
(RDS 배치 예정)
Private Subnet C
10.0.101.0/24
ap-northeast-2c
(RDS 대기 예정)
트래픽 흐름 예시
  • 사용자 → EC2: 인터넷 → IGW → 퍼블릭 서브넷 → EC2 (웹 서버)
  • EC2 → RDS: 퍼블릭 서브넷의 EC2 → 같은 VPC 내부 → 프라이빗 서브넷의 RDS (IGW/NAT 불필요)
  • RDS → 인터넷: 프라이빗 서브넷 → NAT GW → IGW → 인터넷 (소프트웨어 업데이트 등)
  • 인터넷 → RDS: 불가능! (프라이빗 서브넷이므로 외부에서 접근 차단)

실습

시작 전 확인사항
  • AWS 콘솔에 로그인되어 있는지 확인하세요
  • 리전이 아시아 태평양 (서울) ap-northeast-2로 설정되어 있는지 확인하세요
  • 화면 오른쪽 상단의 리전 선택기에서 확인할 수 있습니다
VPC 네트워크 구축 실습
  1. VPC 생성

    ShopEasy 쇼핑몰의 모든 AWS 리소스가 들어갈 전용 가상 네트워크를 만듭니다. 이 VPC 안에서만 우리 서비스가 동작하므로, 외부와 완전히 격리된 환경이 됩니다.

    항목
    이름ShopEasy-VPC
    IPv4 CIDR 블록10.0.0.0/16
    왜 10.0.0.0/16인가요?

    10.0.0.0/16은 65,536개의 프라이빗 IP 주소를 제공합니다. ShopEasy는 소규모 서비스이지만, 나중에 서브넷을 추가하거나 서비스를 확장할 여유를 남겨두는 것이 좋습니다. /16은 AWS에서 VPC에 권장하는 일반적인 크기입니다.

    VPC 서비스로 이동: AWS 콘솔 상단 검색창에 "VPC"를 입력하고 VPC 서비스를 클릭합니다.

    VPC 생성 버튼: 왼쪽 메뉴에서 "VPC"를 클릭한 후 오른쪽 상단의 "VPC 생성" 버튼을 클릭합니다.

    설정: "VPC만" 옵션을 선택하고, 이름과 CIDR을 입력한 후 생성합니다.

  2. 퍼블릭 서브넷 2개 생성

    인터넷에 직접 노출되는 리소스(EC2 웹 서버, NAT Gateway)를 배치할 퍼블릭 서브넷을 2개 만듭니다. 서로 다른 가용 영역에 배치하여 고가용성을 확보합니다.

    퍼블릭 서브넷 A

    항목
    VPCShopEasy-VPC
    이름ShopEasy-Public-A
    가용 영역ap-northeast-2a
    IPv4 CIDR 블록10.0.1.0/24

    퍼블릭 서브넷 C

    항목
    VPCShopEasy-VPC
    이름ShopEasy-Public-C
    가용 영역ap-northeast-2c
    IPv4 CIDR 블록10.0.2.0/24
    퍼블릭 IP 자동 할당

    서브넷 생성 후 "퍼블릭 IPv4 주소 자동 할당"을 활성화해야 이 서브넷에 생성되는 EC2 인스턴스가 자동으로 공인 IP를 받습니다. 서브넷 선택 → 작업 → "서브넷 설정 편집"에서 설정할 수 있습니다.

    서브넷 서비스로 이동: VPC 대시보드 왼쪽 메뉴에서 "서브넷"을 클릭합니다.

    서브넷 생성: "서브넷 생성" 클릭 후 VPC를 먼저 선택하고, 서브넷 이름/AZ/CIDR을 입력합니다.

    2개를 한 번에: "새 서브넷 추가" 버튼으로 한 화면에서 2개를 동시에 만들 수 있습니다.

    자동 할당 설정: 퍼블릭 서브넷 각각 선택 → 작업 → 서브넷 설정 편집 → "퍼블릭 IPv4 주소 자동 할당 활성화" 체크

  3. 프라이빗 서브넷 2개 생성

    외부에서 직접 접근할 수 없는 프라이빗 서브넷을 2개 만듭니다. 여기에는 RDS 데이터베이스가 배치됩니다. 인터넷에서 데이터베이스에 접근할 수 없으므로 보안이 크게 강화됩니다.

    프라이빗 서브넷 A

    항목
    VPCShopEasy-VPC
    이름ShopEasy-Private-A
    가용 영역ap-northeast-2a
    IPv4 CIDR 블록10.0.100.0/24

    프라이빗 서브넷 C

    항목
    VPCShopEasy-VPC
    이름ShopEasy-Private-C
    가용 영역ap-northeast-2c
    IPv4 CIDR 블록10.0.101.0/24
    CIDR 주소 설계 의도

    퍼블릭은 10.0.1.0/24, 10.0.2.0/24로 앞번호를, 프라이빗은 10.0.100.0/24, 10.0.101.0/24로 100번대를 사용합니다. 이렇게 하면 주소만 봐도 퍼블릭/프라이빗을 쉽게 구분할 수 있어 관리가 편합니다.

    퍼블릭 서브넷과 동일한 방법으로 생성합니다.

    주의: 프라이빗 서브넷에는 "퍼블릭 IPv4 주소 자동 할당"을 활성화하지 않습니다. (기본값이 비활성화)

    프라이빗 서브넷의 리소스는 공인 IP가 필요 없습니다.

  4. 인터넷 게이트웨이 생성 및 VPC에 연결

    VPC를 인터넷과 연결하는 인터넷 게이트웨이(IGW)를 생성합니다. IGW 없이는 VPC 내부의 어떤 리소스도 인터넷과 통신할 수 없습니다. 건물의 정문을 설치하는 것과 같습니다.

    항목
    이름ShopEasy-IGW
    연결할 VPCShopEasy-VPC
    중요: 2단계 작업!

    인터넷 게이트웨이는 생성VPC에 연결(Attach) 두 단계로 이루어집니다. 생성만 하고 VPC에 연결하지 않으면 아무 역할도 하지 못합니다. 반드시 "VPC에 연결" 작업까지 완료하세요.

    IGW 생성: VPC 대시보드 → 왼쪽 "인터넷 게이트웨이" → "인터넷 게이트웨이 생성"

    VPC에 연결: 생성된 IGW 선택 → 작업 → "VPC에 연결" → ShopEasy-VPC 선택

    연결 후 상태가 "Attached"로 변경되는지 확인하세요.

  5. NAT Gateway 생성

    프라이빗 서브넷의 리소스(RDS 등)가 인터넷으로 나가는 것만 허용하는 NAT Gateway를 만듭니다. 예를 들어, 프라이빗 서브넷의 RDS가 소프트웨어 업데이트를 다운로드할 때 NAT GW를 사용합니다. 외부에서 NAT GW를 통해 프라이빗 서브넷으로 들어오는 것은 불가능합니다.

    항목
    이름ShopEasy-NAT
    서브넷ShopEasy-Public-A (퍼블릭 서브넷!)
    연결 유형퍼블릭
    탄력적 IP"탄력적 IP 할당" 버튼 클릭하여 새로 생성
    비용 주의!

    NAT Gateway는 시간당 약 $0.059 + 데이터 처리 비용이 발생합니다. 하루 24시간 가동하면 월 약 $43가 과금됩니다. 실습이 끝나면 반드시 삭제하세요! (Chapter 08에서 정리합니다)

    왜 퍼블릭 서브넷에 NAT GW를 배치하나요?

    NAT Gateway는 프라이빗 서브넷의 트래픽을 받아서 인터넷으로 전달하는 역할입니다. 인터넷으로 전달하려면 NAT GW 자체가 인터넷에 접근할 수 있어야 합니다. 따라서 인터넷 게이트웨이 경로가 있는 퍼블릭 서브넷에 배치합니다.

    NAT 게이트웨이 생성: VPC 대시보드 → 왼쪽 "NAT 게이트웨이" → "NAT 게이트웨이 생성"

    서브넷: 반드시 퍼블릭 서브넷(ShopEasy-Public-A)을 선택하세요!

    탄력적 IP: "탄력적 IP 할당" 버튼을 클릭하면 자동으로 공인 IP가 할당됩니다.

    생성 시간: 2~3분 정도 소요됩니다. 상태가 "Available"이 될 때까지 기다려주세요.

  6. 퍼블릭 라우트 테이블 생성 및 설정

    퍼블릭 서브넷에서 인터넷으로 나가는 길을 만들어주는 라우트 테이블을 생성합니다. "목적지가 VPC 내부가 아니면 인터넷 게이트웨이로 보내라"라는 규칙을 추가합니다.

    6-1. 라우트 테이블 생성

    항목
    이름ShopEasy-Public-RT
    VPCShopEasy-VPC

    6-2. 라우트 추가

    대상 (Destination)타겟 (Target)설명
    10.0.0.0/16localVPC 내부 통신 (자동 생성됨)
    0.0.0.0/0ShopEasy-IGW그 외 모든 트래픽 → 인터넷

    6-3. 서브넷 연결

    이 라우트 테이블을 퍼블릭 서브넷 2개에 연결합니다:

    • ShopEasy-Public-A
    • ShopEasy-Public-C
    0.0.0.0/0 이란?

    0.0.0.0/0은 "모든 IP 주소"를 의미합니다. VPC 내부(10.0.0.0/16)로 가는 트래픽은 local 라우트가 처리하고, 그 외 모든 목적지의 트래픽은 인터넷 게이트웨이로 보내라는 의미입니다. 이것이 바로 서브넷을 "퍼블릭"으로 만드는 핵심 라우트입니다.

    라우트 테이블 생성: VPC 대시보드 → "라우트 테이블" → "라우트 테이블 생성"

    라우트 추가: 생성된 RT 선택 → "라우트" 탭 → "라우트 편집" → "라우트 추가" → 대상: 0.0.0.0/0, 타겟: 인터넷 게이트웨이(ShopEasy-IGW)

    서브넷 연결: "서브넷 연결" 탭 → "서브넷 연결 편집" → ShopEasy-Public-A, ShopEasy-Public-C 체크 → 저장

  7. 프라이빗 라우트 테이블 생성 및 설정

    프라이빗 서브넷에서 외부로 나가는 트래픽을 NAT Gateway를 통해 보내는 라우트 테이블을 생성합니다. 이를 통해 프라이빗 서브넷의 리소스가 소프트웨어 업데이트 등을 수행할 수 있습니다.

    7-1. 라우트 테이블 생성

    항목
    이름ShopEasy-Private-RT
    VPCShopEasy-VPC

    7-2. 라우트 추가

    대상 (Destination)타겟 (Target)설명
    10.0.0.0/16localVPC 내부 통신 (자동 생성됨)
    0.0.0.0/0ShopEasy-NAT외부 트래픽 → NAT Gateway 경유

    7-3. 서브넷 연결

    이 라우트 테이블을 프라이빗 서브넷 2개에 연결합니다:

    • ShopEasy-Private-A
    • ShopEasy-Private-C
    퍼블릭 vs 프라이빗 라우트 테이블의 차이

    두 라우트 테이블의 차이는 단 하나입니다:

    • 퍼블릭 RT: 0.0.0.0/0 → 인터넷 게이트웨이 (양방향 통신)
    • 프라이빗 RT: 0.0.0.0/0 → NAT Gateway (아웃바운드만 가능)

    Step 6과 동일한 방법으로 생성합니다.

    라우트 추가시 차이: 타겟을 인터넷 게이트웨이가 아닌 NAT 게이트웨이(ShopEasy-NAT)로 선택합니다.

    서브넷 연결: ShopEasy-Private-A, ShopEasy-Private-C를 체크하여 연결합니다.

    NAT GW 상태 확인: NAT Gateway가 아직 "Pending" 상태라면 "Available"이 될 때까지 기다려야 라우트를 추가할 수 있습니다.

확인 사항

모든 실습을 완료했다면, 아래 항목들을 하나씩 점검해보세요:

  • VPCShopEasy-VPC (10.0.0.0/16)로 생성되었다
  • 퍼블릭 서브넷 2개가 각각 다른 AZ(a, c)에 생성되었다
  • 퍼블릭 서브넷에 "퍼블릭 IPv4 자동 할당"이 활성화되어 있다
  • 프라이빗 서브넷 2개가 각각 다른 AZ(a, c)에 생성되었다
  • 인터넷 게이트웨이가 생성되고 ShopEasy-VPC에 연결(Attached)되었다
  • NAT Gateway가 퍼블릭 서브넷에 생성되고 상태가 "Available"이다
  • 퍼블릭 라우트 테이블에 0.0.0.0/0 → IGW 라우트가 있고, 퍼블릭 서브넷 2개가 연결되었다
  • 프라이빗 라우트 테이블에 0.0.0.0/0 → NAT GW 라우트가 있고, 프라이빗 서브넷 2개가 연결되었다
확인 방법

VPC 대시보드의 "리소스 맵" 기능을 활용하면 VPC의 전체 구조를 한눈에 확인할 수 있습니다. VPC 선택 → "리소스 맵" 탭에서 서브넷, 라우트 테이블, IGW, NAT GW의 연결 관계를 시각적으로 확인해보세요.

다음 챕터 미리보기

VPC 네트워크가 준비되었으니, 다음 챕터에서는 퍼블릭 서브넷에 EC2 인스턴스를 생성하여 ShopEasy API 서버를 배포합니다. 보안 그룹을 설정하고, Node.js를 설치하여 실제로 서비스가 동작하는 것을 확인하게 됩니다.