### 1. **기본 개념**
#### **VPC (Virtual Private Cloud)**
- **정의**: VPC는 **AWS에서 가상 네트워크 환경**을 제공하는 서비스입니다. 사용자에게 논리적으로 격리된 네트워크를 제공하여, AWS 리소스(예: EC2 인스턴스, RDS 데이터베이스)를 격리된 환경에서 실행할 수 있습니다.
- **역할**: VPC는 사용자가 직접 네트워크 설정을 관리할 수 있도록 하여, 네트워크 보안, 라우팅, 인터넷 접근 등의 요소를 사용자 정의할 수 있습니다.
#### **Subnet (서브넷)**
- **정의**: 서브넷은 VPC 내에서 더 작은 **IP 주소 범위로 분할**된 네트워크 세그먼트입니다. 서브넷을 사용하여 VPC 내의 네트워크를 조직화하고, 리소스의 네트워크 접근을 관리합니다.
- **역할**: 서브넷은 **리소스의 배치**와 **네트워크 접근 제어**를 더 세부적으로 설정할 수 있게 합니다. 서브넷마다 다른 보안 정책과 라우팅 규칙을 설정할 수 있습니다.
### 2. **Public Subnet vs Private Subnet**
서브넷은 **Public Subnet**과 **Private Subnet**으로 나뉩니다. 이 두 서브넷의 차이를 이해하는 것이 중요합니다.
#### **Public Subnet**
- **정의**: Public Subnet은 **인터넷 게이트웨이(Internet Gateway)**와 연결되어 있어 **인터넷에서 접근이 가능한 서브넷**입니다.
- **특징**: 서브넷의 리소스가 공용 IP 주소를 가지거나, **NAT 게이트웨이**를 통해 인터넷과 직접 통신할 수 있습니다.
- **사용 예시**: 웹 서버, 프론트엔드 애플리케이션 서버 등 외부에서 접근 가능한 리소스를 배치합니다.
**Public Subnet의 라우팅 테이블 예시**:
```plaintext
Destination | Target
-------------------------
0.0.0.0/0 | igw-1a2b3c4d
```
- **0.0.0.0/0**: 모든 트래픽을 의미합니다.
- **igw-1a2b3c4d**: 인터넷 게이트웨이의 ID입니다.
#### **Private Subnet**
- **정의**: Private Subnet은 **인터넷 게이트웨이와 연결되지 않아**, **인터넷에서 직접 접근할 수 없는 서브넷**입니다.
- **특징**: 서브넷의 리소스는 공용 IP 주소를 가지지 않으며, **NAT 게이트웨이**를 통해서만 외부와 통신할 수 있습니다.
- **사용 예시**: 데이터베이스 서버, 내부 애플리케이션 서버 등 외부 접근이 필요 없는 리소스를 배치합니다.
**Private Subnet의 라우팅 테이블 예시**:
```plaintext
Destination | Target
-------------------------
0.0.0.0/0 | nat-1a2b3c4d
```
- **nat-1a2b3c4d**: NAT 게이트웨이의 ID입니다.
### 3. **VPC와 서브넷의 구성 요소**
#### **VPC 구성 요소**
1. **CIDR 블록**: VPC의 IP 주소 범위를 정의합니다. 예: `10.0.0.0/16`.
2. **서브넷**: VPC 내에서 IP 주소를 더 작은 범위로 나눕니다. 예: `10.0.1.0/24` (Public Subnet), `10.0.2.0/24` (Private Subnet).
3. **라우팅 테이블**: 서브넷의 트래픽 흐름을 제어합니다. 인터넷 게이트웨이 또는 NAT 게이트웨이를 통해 외부와 연결할 수 있습니다.
4. **인터넷 게이트웨이**: VPC를 인터넷에 연결하는 역할을 합니다.
5. **NAT 게이트웨이**: Private Subnet에서 인터넷으로 나가는 트래픽을 중계합니다.
#### **서브넷 구성 요소**
1. **IP 주소 범위**: 서브넷에 할당된 IP 주소 범위. 예: `10.0.1.0/24`.
2. **라우팅 테이블**: 서브넷에서 나가는 트래픽의 경로를 결정합니다.
3. **네트워크 ACL**: 서브넷 수준에서 트래픽을 제어하는 방화벽 규칙입니다.
4. **보안 그룹**: 서브넷 내 리소스에 대한 접근을 제어하는 방화벽 규칙입니다.
### 4. **실제 예시로 이해하기**
#### **예시 시나리오: 웹 애플리케이션 배포**
1. **VPC 구성**
- VPC CIDR 블록: `10.0.0.0/16`.
2. **서브넷 설정**
- **Public Subnet**: `10.0.1.0/24`. (인터넷에 노출된 웹 서버를 배치)
- 라우팅 테이블에 인터넷 게이트웨이 추가.
- **Private Subnet**: `10.0.2.0/24`. (내부 데이터베이스 서버를 배치)
- 라우팅 테이블에 NAT 게이트웨이 추가.
3. **라우팅 테이블 설정**
- Public Subnet의 라우팅 테이블:
```plaintext
Destination | Target
-------------------------
0.0.0.0/0 | igw-1a2b3c4d
```
- Private Subnet의 라우팅 테이블:
```plaintext
Destination | Target
-------------------------
0.0.0.0/0 | nat-1a2b3c4d
```
4. **리소스 배치**
- **Public Subnet**: 웹 서버 (EC2 인스턴스) 배치. 이 인스턴스는 공용 IP 주소를 가지며, 인터넷 게이트웨이를 통해 외부와 통신합니다.
- **Private Subnet**: 데이터베이스 서버 (RDS 인스턴스) 배치. 이 인스턴스는 공용 IP 주소가 없으며, NAT 게이트웨이를 통해 인터넷으로 나가는 요청을 처리합니다.
### 5. **VPC와 서브넷 구성의 실제 사용 사례**
#### **웹 애플리케이션 구성**
- **웹 서버** (Public Subnet): 외부에서 접근 가능한 웹 애플리케이션 서버를 Public Subnet에 배치하여 인터넷에서 직접 접근할 수 있도록 합니다.
- **데이터베이스** (Private Subnet): 외부에서 직접 접근할 필요가 없는 데이터베이스 서버를 Private Subnet에 배치하여 보안을 강화합니다.
#### **기업 내 데이터 분석**
- **분석 서버** (Public Subnet): 외부 데이터 소스를 가져오거나 데이터를 외부로 전송해야 하는 분석 서버를 Public Subnet에 배치합니다.
- **데이터 저장소** (Private Subnet): 데이터의 보안을 위해 분석된 데이터를 저장하는 서버는 Private Subnet에 배치합니다.
### 요약
- **VPC**는 AWS 클라우드 내에서 사용자 정의 네트워크를 제공하여, 네트워크 보안과 트래픽 관리를 지원합니다.
- **서브넷**은 VPC 내에서 IP 주소를 더 작은 범위로 나눠서, 네트워크 리소스를 조직화하고 접근 제어를 가능하게 합니다.
- **Public Subnet**은 인터넷 게이트웨이와 연결되어 있어 인터넷에서 접근할 수 있으며, 외부와 직접 통신하는 리소스를 배치합니다.
- **Private Subnet**은 인터넷 게이트웨이와 연결되지 않아 외부에서 접근할 수 없으며, 내부 리소스 보호를 위한 리소스를 배치합니다.
이해를 돕기 위해 **비유**하자면:
- **VPC**는 **도시**와 같습니다. 도시 안에는 여러 **구역(서브넷)**이 있고, 각 구역마다 **도로(라우팅 테이블)**를 통해 차량이 이동합니다.
- **Public Subnet**은 **공공장소**와 같아서 누구나 접근할 수 있는 공간입니다.
- **Private Subnet**은 **주거 지역**과 같아서 외부 사람은 쉽게 접근할 수 없는 공간입니다.