Lambda, S3, DynamoDB hoạt động không cần VPC. Nhưng RDS, ElastiCache, ECS Fargate, mọi thứ đều nằm trong VPC. VPC là nền tảng networking: bạn định nghĩa IP range, chia subnet, kiểm soát traffic bằng route table, security group, NACL. Mình thấy nhiều bạn mới học AWS thường nhầm public subnet với việc gán public IP, nhưng thực ra public subnet chỉ đơn giản là subnet có route đến Internet Gateway.
flowchart TB
subgraph VPC["VPC 10.0.0.0/16"]
subgraph Public["Public Subnets"]
ALB["ALB"] --- NAT["NAT Gateway"]
end
subgraph Private["Private App Subnets"]
App["ECS/EC2"]
end
subgraph DB["Private DB Subnets"]
RDS["RDS"] --- Redis["ElastiCache"]
end
IGW["Internet Gateway"]
end
Internet["Internet"] <--> IGW
IGW --> ALB
IGW --> NAT
NAT --> App
App --> RDS
```text
---
## CIDR planning
```text
VPC: 10.0.0.0/16 (65,536 IPs)
Public A: 10.0.1.0/24 (+ route IGW)
Public B: 10.0.2.0/24 (+ route IGW)
Private App A: 10.0.10.0/24 (+ route NAT GW)
Private App B: 10.0.11.0/24 (+ route NAT GW)
Private DB A: 10.0.20.0/24 (isolated — no internet)
Private DB B: 10.0.21.0/24 (isolated)
# Reserve: 10.0.3.0-9.0, 10.0.12.0-19.0, 10.0.22.0-255.0 — cho tương lai
```text
**Public subnet = route table có route đến Internet Gateway.** Private subnet = route đến NAT Gateway (hoặc không có internet route). DB subnet = isolated, không route internet nào.
---
## SG vs NACL
| | Security Group | NACL |
|---|---------------|------|
| **Level** | Instance/ENI | Subnet |
| **Stateful** | Có (return auto-allow) | Không (phải allow cả 2 chiều) |
| **Rules** | Allow only | Allow + Deny theo thứ tự số |
| **Dùng khi** | "ALB → EC2 port 3000" | "Chặn IP 203.0.113.0/24" |
```bash
aws ec2 authorize-security-group-ingress --group-id sg-app --protocol tcp --port 3000 --source-group sg-alb
```text
Lệnh này cho phép traffic từ security group của ALB (sg-alb) vào port 3000 của app server, đây là cách tham chiếu SG an toàn hơn mở CIDR.
---
## NAT Gateway cost
**$32/tháng + $0.045/GB data**. Đây là một trong những thứ đắt nhất VPC. Giải pháp: VPC Endpoint (Bài 18) cho S3/DynamoDB → miễn phí, không cần NAT.
---
## Ba điều cần nhớ về VPC
VPC không khó, chỉ có ba loại subnet, ba loại route, và hai loại firewall. Nhưng nhầm cái nào cũng tốn tiền hoặc lỗi bảo mật.
- **Public = route IGW, Private = route NAT, DB = isolated**
- **NAT Gateway $32/tháng** → dùng VPC Endpoint thay thế
- **SG stateful (return auto), NACL stateless** — SG hàng ngày, NACL chặn IP
- **Flow Logs** — biết ai đang nói chuyện với ai
Bài sau: [Phần 18: VPC nâng cao — endpoint, PrivateLink, Transit Gateway](/posts/aws/18-vpc-nang-cao-endpoint-privatelink-tgw/)