Spis treści 13 sekcji
  1. Czym jest VPC i dlaczego to fundament Twojej chmury
  2. Bloki CIDR - ile adresów naprawdę potrzebujesz?
  3. Subnety publiczne vs prywatne
  4. Internet Gateway vs NAT Gateway
  5. Route Tables - GPS Twojego VPC
  6. Security Groups vs NACLs - dwie warstwy ochrony
  7. Praktyka - budujemy VPC krok po kroku
  8. VPC Peering i Transit Gateway - łączenie sieci
  9. Najczęstsze błędy - i jak ich unikać
  10. Koszty VPC - co jest darmowe, a co nie
  11. Konfiguracja Security Groups - przykład dla aplikacji webowej
  12. Najczęściej zadawane pytania (FAQ)
  13. Następny krok
TL;DR
  • Amazon VPC to Twoja prywatna, izolowana sieć w chmurze AWS - fundament każdej architektury.
  • Bloki CIDR definiują zakres adresów IP. Dla większości projektów /16 (65 536 adresów) to bezpieczny wybór.
  • Subnety publiczne mają dostęp do Internetu przez Internet Gateway, prywatne - przez NAT Gateway.
  • Security Groups działają na poziomie instancji (stateful), NACLs na poziomie subnetu (stateless).
  • NAT Gateway kosztuje ok. 38 USD/miesiąc (eu-central-1) + transfer - planuj budżet świadomie.

Kiedy stawiasz pierwszą instancję EC2 albo bazę danych RDS, AWS automatycznie umieszcza ją w domyślnym VPC. Działa, więc nie zastanawiasz się nad siecią. Problem pojawia się, gdy aplikacja rośnie, dochodzą nowe środowiska i nagle okazuje się, że baza danych ma publiczny adres IP, a Security Groups są otwarte na cały świat. Z mojego doświadczenia w ClearScale widzę to regularnie - dlatego napisałem ten poradnik.

Jeśli dopiero zaczynasz przygodę z chmurą, przeczytaj najpierw Jak zacząć z AWS w 2026. Ten artykuł zakłada, że masz już konto AWS i podstawową orientację w konsoli.

Czym jest VPC i dlaczego to fundament Twojej chmury

Amazon Virtual Private Cloud (VPC) to logicznie wydzielona sekcja chmury AWS, w której uruchamiasz zasoby. Pomyśl o tym jak o własnym biurowcu. Ty decydujesz, ile pięter (subnetów) ma budynek, gdzie są drzwi wejściowe (Internet Gateway), kto może wejść (Security Groups) i jakie są trasy między pokojami (Route Tables).

Każdy VPC istnieje w jednym regionie AWS, ale rozciąga się na wszystkie Availability Zones w tym regionie. To daje Ci redundancję od pierwszego dnia.

Default VPC: AWS tworzy domyślny VPC w każdym regionie. Ma on blok CIDR 172.31.0.0/16 i publiczne subnety. Nadaje się do nauki, ale w produkcji zawsze twórz własny VPC z przemyślaną architekturą.

Bloki CIDR - ile adresów naprawdę potrzebujesz?

CIDR (Classless Inter-Domain Routing) to sposób zapisu zakresu adresów IP. Zapis 10.0.0.0/16 oznacza: "wszystkie adresy od 10.0.0.0 do 10.0.255.255", czyli 65 536 adresów.

Zasada jest prosta - im mniejsza liczba po ukośniku, tym więcej adresów:

CIDRLiczba adresówZastosowanie
/1665 536Cały VPC - standardowy wybór
/204 096Duży subnet
/24256Typowy subnet
/2816Minimalny subnet w AWS (najmniejszy dozwolony)
Uwaga: AWS rezerwuje 5 adresów IP w każdym subnecie (pierwszy, ostatni i 3 dodatkowe). Subnet /24 daje więc 251 użytecznych adresów, a /28 tylko 11. Planuj z zapasem!
Praktyczna rada: Używaj zakresu 10.0.0.0/16 dla pierwszego VPC. Jeśli planujesz łączyć wiele VPC (peering, Transit Gateway), upewnij się, że zakresy CIDR się nie pokrywają. Przykład: VPC produkcyjny 10.0.0.0/16, VPC deweloperski 10.1.0.0/16.

Subnety publiczne vs prywatne

Subnet to fragment VPC przypisany do jednej Availability Zone. Dzielą się na dwa typy:

  • Subnet publiczny - ma trasę do Internet Gateway. Zasoby mogą mieć publiczny adres IP i być dostępne z Internetu. Tu umieszczasz load balancery (Elastic Load Balancing) i bastion hosty.
  • Subnet prywatny - nie ma bezpośredniego dostępu do Internetu. Zasoby mogą łączyć się z Internetem tylko przez NAT Gateway. Tu umieszczasz serwery aplikacyjne, bazy danych i funkcje Lambda w VPC.

Typowa architektura wygląda tak:

Przepływ ruchu w VPC (schemat):

Użytkownik -> Internet Gateway -> [Subnet publiczny: ALB] -> [Subnet prywatny: EC2/ECS] -> [Subnet prywatny: RDS]
EC2 (prywatny) -> NAT Gateway (publiczny) -> Internet Gateway -> Internet (np. aktualizacje, API)

Ruch przychodzący trafia przez Internet Gateway do load balancera w subnecie publicznym. Load balancer przekazuje go do instancji w subnecie prywatnym. Baza danych siedzi w osobnym prywatnym subnecie i akceptuje połączenia wyłącznie z warstwy aplikacyjnej.

Internet Gateway vs NAT Gateway

Internet Gateway (IGW) to brama między Twoim VPC a publicznym Internetem. Jest darmowy, wysoko dostępny i zarządzany przez AWS. Podłączasz go do VPC i dodajesz trasę w Route Table subnetu publicznego.

NAT Gateway pozwala zasobom w prywatnych subnetach łączyć się z Internetem (np. pobierać aktualizacje), ale blokuje ruch przychodzący. Działa w subnecie publicznym i przekierowuje ruch z prywatnych subnetów.

Uwaga - koszty NAT Gateway: NAT Gateway to ok. 0,052 USD/h w regionie eu-central-1 (ok. 38 USD/miesiąc) plus 0,052 USD za każdy GB przetworzonych danych. Dla środowisk deweloperskich rozważ NAT Instance (tańsze, ale musisz nim zarządzać) albo VPC Endpoints dla usług AWS, które eliminują potrzebę NAT.

Route Tables - GPS Twojego VPC

Route Table to zestaw reguł określających, dokąd trafia ruch sieciowy. Każdy subnet musi być powiązany z jedną Route Table.

Przykładowa Route Table dla subnetu publicznego:

DestinationTargetOpis
10.0.0.0/16localRuch wewnątrz VPC
0.0.0.0/0igw-xxxxxxxxCały pozostały ruch idzie do Internet Gateway

Route Table dla subnetu prywatnego:

DestinationTargetOpis
10.0.0.0/16localRuch wewnątrz VPC
0.0.0.0/0nat-xxxxxxxxRuch na zewnątrz idzie przez NAT Gateway

Security Groups vs NACLs - dwie warstwy ochrony

AWS daje Ci dwa mechanizmy firewalla. Różnią się zasadniczo:

CechaSecurity GroupNACL
Poziom działaniaInstancja (ENI)Subnet
TypStatefulStateless
RegułyTylko ALLOWALLOW i DENY
Kolejność regułWszystkie ewaluowanePo numerach, pierwsza pasująca wygrywa
DomyślnieBlokuje ruch przychodzący, przepuszcza wychodzącyPrzepuszcza wszystko

Stateful oznacza, że jeśli pozwolisz na ruch przychodzący na porcie 443, odpowiedź automatycznie przejdzie z powrotem. W NACLs (stateless) musisz jawnie zdefiniować reguły dla obu kierunków.

Praktyczna rada: W 90% przypadków Security Groups wystarczą. NACLs traktuj jako dodatkową warstwę - przydają się np. do blokowania konkretnych adresów IP na poziomie całego subnetu. Więcej o zabezpieczeniach przeczytasz w poradniku o IAM i bezpieczeństwie AWS.

Praktyka - budujemy VPC krok po kroku

Zbudujemy VPC z dwiema warstwami: publiczną (dla load balancera) i prywatną (dla aplikacji). Architektura obejmie dwie Availability Zones dla wysokiej dostępności.

Dwa sposoby, ten sam efekt: Każdy krok poniżej możesz wykonać na dwa sposoby - klikając w panelu webowym AWS albo wpisując komendy w terminalu. Wybierz jedną metodę i trzymaj się jej. Jeśli dopiero zaczynasz, polecam Panel AWS.

Krok 1 - Tworzenie VPC

  1. Otwórz konsolę AWS i przejdź do VPC Dashboard.
  2. Kliknij Create VPC.
  3. Wybierz VPC only (nie "VPC and more" - chcemy zrozumieć każdy element).
  4. Name tag: cloudmaniak-vpc
  5. IPv4 CIDR: 10.0.0.0/16
  6. Kliknij Create VPC.
Screenshot: Formularz tworzenia VPC z wypełnionym CIDR 10.0.0.0/16
aws ec2 create-vpc \
  --cidr-block 10.0.0.0/16 \
  --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=cloudmaniak-vpc}]'

# Włącz DNS hostnames (potrzebne dla publicznych DNS)
aws ec2 modify-vpc-attribute \
  --vpc-id vpc-XXXXXXXX \
  --enable-dns-hostnames

Krok 2 - Tworzenie subnetów

Tworzymy cztery subnety - po jednym publicznym i prywatnym w dwóch Availability Zones:

  1. W VPC Dashboard kliknij Subnets > Create subnet.
  2. Wybierz swój VPC (cloudmaniak-vpc).
  3. Utwórz kolejno cztery subnety:
    • public-subnet-1a - AZ: eu-central-1a, CIDR: 10.0.1.0/24
    • public-subnet-1b - AZ: eu-central-1b, CIDR: 10.0.2.0/24
    • private-subnet-1a - AZ: eu-central-1a, CIDR: 10.0.10.0/24
    • private-subnet-1b - AZ: eu-central-1b, CIDR: 10.0.11.0/24
  4. Dla subnetów publicznych: zaznacz subnet > Actions > Edit subnet settings > włącz Auto-assign public IPv4 address.
Screenshot: Lista czterech subnetów w VPC Dashboard
# Subnety publiczne
aws ec2 create-subnet --vpc-id vpc-XXXXXXXX \
  --cidr-block 10.0.1.0/24 --availability-zone eu-central-1a \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=public-subnet-1a}]'

aws ec2 create-subnet --vpc-id vpc-XXXXXXXX \
  --cidr-block 10.0.2.0/24 --availability-zone eu-central-1b \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=public-subnet-1b}]'

# Subnety prywatne
aws ec2 create-subnet --vpc-id vpc-XXXXXXXX \
  --cidr-block 10.0.10.0/24 --availability-zone eu-central-1a \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=private-subnet-1a}]'

aws ec2 create-subnet --vpc-id vpc-XXXXXXXX \
  --cidr-block 10.0.11.0/24 --availability-zone eu-central-1b \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=private-subnet-1b}]'

# Włącz auto-assign publicznych IP dla subnetów publicznych
aws ec2 modify-subnet-attribute \
  --subnet-id subnet-XXXXXXXX \
  --map-public-ip-on-launch

Krok 3 - Internet Gateway, NAT Gateway i Route Tables

  1. Internet Gateway: VPC Dashboard > Internet Gateways > Create > Name: cloudmaniak-igw > Create. Następnie: Actions > Attach to VPC > wybierz cloudmaniak-vpc.
  2. Elastic IP dla NAT: EC2 Dashboard > Elastic IPs > Allocate > Allocate.
  3. NAT Gateway: VPC Dashboard > NAT Gateways > Create > Subnet: public-subnet-1a, Elastic IP: wybierz przydzielony adres > Create.
  4. Route Table publiczna: Route Tables > Create > Name: public-rt. Dodaj trasę: Destination 0.0.0.0/0, Target: cloudmaniak-igw. Powiąż z oboma subnetami publicznymi (Subnet Associations).
  5. Route Table prywatna: Route Tables > Create > Name: private-rt. Dodaj trasę: Destination 0.0.0.0/0, Target: NAT Gateway. Powiąż z oboma subnetami prywatnymi.
Screenshot: Route Table z trasą do Internet Gateway
# Internet Gateway
aws ec2 create-internet-gateway \
  --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=cloudmaniak-igw}]'
aws ec2 attach-internet-gateway \
  --internet-gateway-id igw-XXXXXXXX --vpc-id vpc-XXXXXXXX

# Elastic IP + NAT Gateway
aws ec2 allocate-address --domain vpc
aws ec2 create-nat-gateway \
  --subnet-id subnet-PUBLIC-1A \
  --allocation-id eipalloc-XXXXXXXX \
  --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=cloudmaniak-nat}]'

# Route Table publiczna
aws ec2 create-route-table --vpc-id vpc-XXXXXXXX \
  --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=public-rt}]'
aws ec2 create-route --route-table-id rtb-PUBLIC \
  --destination-cidr-block 0.0.0.0/0 --gateway-id igw-XXXXXXXX
aws ec2 associate-route-table --route-table-id rtb-PUBLIC \
  --subnet-id subnet-PUBLIC-1A
aws ec2 associate-route-table --route-table-id rtb-PUBLIC \
  --subnet-id subnet-PUBLIC-1B

# Route Table prywatna
aws ec2 create-route-table --vpc-id vpc-XXXXXXXX \
  --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=private-rt}]'
aws ec2 create-route --route-table-id rtb-PRIVATE \
  --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-XXXXXXXX
aws ec2 associate-route-table --route-table-id rtb-PRIVATE \
  --subnet-id subnet-PRIVATE-1A
aws ec2 associate-route-table --route-table-id rtb-PRIVATE \
  --subnet-id subnet-PRIVATE-1B

VPC Peering i Transit Gateway - łączenie sieci

Gdy Twoja infrastruktura rośnie, pojawia się potrzeba łączenia VPC ze sobą:

  • VPC Peering - bezpośrednie, prywatne połączenie między dwoma VPC. Proste, bez dodatkowych kosztów (płacisz tylko za transfer). Idealne gdy łączysz 2-3 VPC. Ograniczenie: nie działa tranzytywnie (jeśli A jest połączone z B i B z C, to A nie widzi C automatycznie).
  • Transit Gateway - centralny hub sieciowy. Łączysz do niego wiele VPC, sieci VPN i połączenia Direct Connect. Kosztuje ok. 0,05 USD/h, ale drastycznie upraszcza zarządzanie gdy masz 4+ sieci.

Z mojego doświadczenia, większość firm przechodzi na Transit Gateway gdy liczba VPC przekracza trzy. Wcześniej VPC Peering jest prostszym i tańszym rozwiązaniem. Więcej o projektowaniu architektury znajdziesz w artykule o architekturze aplikacji webowej w AWS.

Najczęstsze błędy - i jak ich unikać

  1. Baza danych w publicznym subnecie - to najpopularniejszy błąd. RDS i inne bazy danych zawsze powinny być w prywatnych subnetach. Jedyny sposób dostępu to przez warstwę aplikacyjną lub bastion host.
  2. Security Groups otwarte na 0.0.0.0/0 - szczególnie porty SSH (22) i RDP (3389). Zawsze ograniczaj źródło do konkretnych adresów IP lub Security Groups.
  3. Brak planowania CIDR - gdy dwa VPC mają ten sam zakres adresów, nie możesz ich połączyć przez peering. Planuj zakresy z wyprzedzeniem, nawet jeśli dziś masz jeden VPC.
  4. Jeden NAT Gateway dla wszystkich AZ - jeśli AZ z NAT Gateway ulegnie awarii, zasoby w prywatnych subnetach w innych AZ stracą dostęp do Internetu. W produkcji twórz NAT Gateway w każdej AZ.
  5. Ignorowanie VPC Flow Logs - bez logów nie wiesz, co się dzieje w Twojej sieci. Włącz Flow Logs i wysyłaj je do S3 lub CloudWatch Logs.
Uwaga: Jeśli korzystasz z Default VPC w produkcji, zaplanuj migrację do własnego VPC. Default VPC ma publiczne subnety i liberalne ustawienia, które nie spełniają wymagań bezpieczeństwa większości organizacji.

Koszty VPC - co jest darmowe, a co nie

KomponentKoszt
VPC, subnety, Route Tables, Security Groups, NACLsBezpłatne
Internet GatewayBezpłatny (płacisz za transfer)
NAT Gateway~0,052 USD/h + 0,052 USD/GB (eu-central-1)
Publiczny adres IPv4 (w tym Elastic IP - przypisany lub nie)0,005 USD/h (~3,60 USD/miesiąc za adres)
VPC PeeringBezpłatny (płacisz za transfer cross-AZ/region)
Transit Gateway~0,05 USD/h + 0,02 USD/GB
VPC Flow LogsKoszt zapisu do S3/CloudWatch
Praktyczna rada: NAT Gateway to często jeden z większych pozycji na rachunku AWS. Aby zredukować koszty: (1) używaj VPC Endpoints dla S3 i DynamoDB (bezpłatne, Gateway Endpoints), (2) rozważ NAT Instance na t4g.nano dla środowisk dev - realnie ok. 7 USD/miesiąc łącznie z opłatą za publiczny adres IPv4; użyj obrazu fck-nat (Amazon Linux 2023, ARM), bo oficjalne NAT AMI Amazona oparte na Amazon Linux 1 nie jest już wspierane, (3) analizuj ruch przez NAT za pomocą Flow Logs i eliminuj niepotrzebne połączenia.

Konfiguracja Security Groups - przykład dla aplikacji webowej

Na koniec skonfigurujmy Security Groups dla typowej trójwarstwowej architektury, którą omówiliśmy w artykule o EC2:

  • SG dla ALB - ruch przychodzący: TCP 443 (HTTPS) z 0.0.0.0/0
  • SG dla EC2/ECS - ruch przychodzący: TCP 8080 z SG ALB (referencja po ID Security Group)
  • SG dla RDS - ruch przychodzący: TCP 5432 (PostgreSQL) z SG EC2/ECS

Kluczowa technika to referencja między Security Groups zamiast adresów IP. Gdy dodajesz nową instancję EC2 do SG aplikacji, automatycznie uzyskuje ona dostęp do bazy danych. Zero ręcznych zmian.

Najczęściej zadawane pytania (FAQ)

Czy mogę zmienić blok CIDR istniejącego VPC?

Nie możesz zmienić głównego bloku CIDR, ale możesz dodać dodatkowe (secondary CIDR blocks) do istniejącego VPC. Domyślny limit to 5 bloków CIDR na VPC (przez Service Quotas można go zwiększyć do 50). To przydatne, gdy zabraknie Ci adresów IP.

Ile VPC mogę mieć w jednym regionie?

Domyślny limit to 5 VPC na region, ale możesz poprosić AWS o zwiększenie tego limitu przez Service Quotas. W praktyce firmy rzadko potrzebują więcej niż 3-4 VPC na region (produkcja, staging, dev, shared services).

Czy NAT Gateway jest potrzebny, jeśli moje instancje nie potrzebują dostępu do Internetu?

Nie. Jeśli Twoje instancje w prywatnych subnetach komunikują się tylko z innymi usługami AWS, użyj VPC Endpoints zamiast NAT Gateway. Gateway Endpoints dla S3 i DynamoDB są bezpłatne. Interface Endpoints dla innych usług kosztują mniej niż NAT Gateway.

Jaka jest różnica między Security Group a NACL w praktyce?

Security Groups to Twój główny firewall - definiujesz reguły na poziomie instancji i są stateful (odpowiedzi automatycznie przechodzą). NACLs działają na poziomie subnetu i są stateless (musisz jawnie zdefiniować reguły dla obu kierunków). Większość zespołów używa głównie Security Groups, a NACLs traktuje jako dodatkową warstwę obrony.

Czy ruch między subnetami w tym samym VPC jest darmowy?

Ruch w tej samej Availability Zone jest darmowy. Ruch między różnymi AZ w tym samym VPC kosztuje 0,01 USD/GB w każdym kierunku. To niewiele, ale przy dużym ruchu się sumuje. Dlatego warto umieszczać komunikujące się ze sobą zasoby w tej samej AZ, gdy to możliwe.

Następny krok

Masz działający VPC z publicznymi i prywatnymi subnetami. Czas go wykorzystać. Polecam następujące kroki:

  1. Uruchom instancję EC2 w prywatnym subnecie i sprawdź, czy łączy się z Internetem przez NAT Gateway.
  2. Skonfiguruj Application Load Balancer w subnetach publicznych i przekieruj ruch do instancji prywatnej.
  3. Włącz VPC Flow Logs i przeanalizuj ruch sieciowy po kilku godzinach.
  4. Zapoznaj się z Route 53 i podepnij domenę do load balancera.

Sieć to fundament, na którym budujesz wszystko inne. Zainwestowany dziś czas w zrozumienie VPC zaprocentuje przy każdym kolejnym projekcie w AWS.

Emil Kowalczyk

Pasjonat chmury i twórca CloudManiak.pl. Na co dzień MSP Engineer w amerykańskiej firmie ClearScale (AWS Premier Tier Partner). Pomagam osobom wchodzącym do świata chmury zdobywać wiedzę i certyfikaty.