VPC mặc định không cho instance trong private subnet gọi S3 API. Phải đi qua NAT Gateway, tốn thêm $32/tháng + latency. VPC Endpoint giải quyết chuyện đó — miễn phí cho S3 và DynamoDB. Bài này xoay quanh 3 bài toán nâng cao: gọi AWS API không cần internet (VPC Endpoint), nối nhiều VPC (Peering vs Transit Gateway), và share service cross-VPC (PrivateLink).


  flowchart TB
    subgraph VPC1["VPC Prod"]
        App["App"]
    end
    subgraph VPC2["VPC Staging"]
        Worker["Worker"]
    end
    TGW["Transit Gateway<br/>hub-and-spoke<br/>$0.02/GB + $0.05/h/attachment"]
    VPCE["VPC Endpoint<br/>S3/DynamoDB: Free Gateway<br/>Secrets Manager: $7.20/mo/AZ Interface"]
    PrivateLink["PrivateLink<br/>share service cross-VPC<br/>không cần peering"]
    VPC1 --> TGW
    VPC2 --> TGW
    App --> VPCE --> S3["S3"]
    App --> PrivateLink --> Worker

Mình từng thấy team dùng VPC Peering cho 12 VPC — transitive không có, route table phải manual từng cặp, 2 tháng sau loạn không ai dám đụng. TGW ra đời giải quyết đúng cái đau đó.


VPC Endpoint: gọi AWS API qua backbone, không internet

Gateway Endpoint (S3 + DynamoDB — miễn phí)

aws ec2 create-vpc-endpoint --vpc-id vpc-xxx \
  --service-name com.amazonaws.ap-southeast-1.s3 \
  --vpc-endpoint-type Gateway --route-table-ids rtb-private

Interface Endpoint (các service khác)

Tạo ENI trong subnet — $7.20/tháng/AZ. Rule of thumb: nếu data transfer < ~1 TB/tháng qua endpoint, Interface Endpoint rẻ hơn NAT Gateway (còn phụ thuộc vào payload size, không chỉ request count).


Peering vs Transit Gateway

VPC PeeringTransit Gateway
Số VPC2-55-5000
TransitiveKhông (A→B peer, B→C peer, A↛C)
CostFree data transfer (cùng AZ); cross-AZ tính phí inter-AZ standard$0.02/GB + $0.05/h/attachment
RouteManual từng routeCentral route table
aws ec2 create-transit-gateway
aws ec2 create-transit-gateway-vpc-attachment --transit-gateway-id tgw-xxx --vpc-id vpc-xxx --subnet-ids subnet-a subnet-b

# Provider: NLB + endpoint service
aws ec2 create-vpc-endpoint-service-configuration --network-load-balancer-arns $NLB_ARN --acceptance-required

# Consumer: Interface Endpoint → service
aws ec2 create-vpc-endpoint --vpc-id vpc-consumer \
  --service-name com.amazonaws.vpce.ap-southeast-1.vpce-svc-xxx \
  --vpc-endpoint-type Interface --subnet-ids subnet-consumer

Consumer thấy service như một endpoint trong VPC của mình — không cần peering, không cần overlap CIDR.


Khi nào dùng cái gì

Ba công cụ này giải quyết ba bài toán khác nhau — nếu bạn đang NAT Gateway cho S3, đang peer 12 VPC, hoặc share service bằng cách mở security group cho VPC khác, bạn đang làm sai và đang tốn thêm tiền.

Bài sau: Phần 19: Dự án — Deploy static website lên AWS