Spis treści 11 sekcji
  1. Trzy bazy, trzy filozofie
  2. Amazon RDS - klasyka, która wciąż działa
  3. Amazon DynamoDB - NoSQL bez limitów skali
  4. Amazon Aurora - RDS na sterydach
  5. Porównanie głowa do głowy
  6. Drzewo decyzyjne - szybki wybór
  7. Scenariusze z praktyki
  8. Połączenie baz - polyglot persistence
  9. Problemy z Lambda + RDS (i jak je rozwiązać)
  10. FAQ - najczęstsze pytania o bazy danych AWS
  11. Co dalej?
TL;DR: RDS to klasyczny SQL (PostgreSQL/MySQL) - najlepszy dla aplikacji z relacyjnymi danymi i złożonymi zapytaniami. DynamoDB to NoSQL key-value/document - idealny dla prostych wzorców dostępu i serverless. Aurora to "RDS na sterydach" - kompatybilna z MySQL/PostgreSQL, ale 3-5× wydajniejsza. Wybór zależy od wzorców dostępu do danych, nie od "co jest lepsze".

Trzy bazy, trzy filozofie

Na AWS masz ponad 15 serwisów bazodanowych, ale 90% aplikacji korzysta z trzech: RDS, DynamoDB i Aurora. Każda ma inną filozofię i inne zastosowania. Zły wybór na starcie oznacza kosztowną migrację za pół roku.

AspektRDSDynamoDBAurora
TypRelacyjna (SQL)NoSQL (key-value/document)Relacyjna (SQL) - cloud-native
SilnikPostgreSQL, MySQL, MariaDB, Oracle, SQL ServerWłasny AWSMySQL-compatible, PostgreSQL-compatible
SchematSztywny (tabele, kolumny, typy)Elastyczny (JSON-like documents)Sztywny (jak RDS)
ZapytaniaPełny SQL (JOIN, subquery, window functions)Get/Put/Query/Scan (ograniczone)Pełny SQL
SkalowanieVertical (większa instancja) + read replicasHorizontal (automatyczne)Vertical + do 15 read replicas + Serverless v2
ServerlessNieTak (on-demand mode)Tak (Aurora Serverless v2)
ZarządzanieManaged (patching, backup automatyczny)Fully managed (zero administracji)Managed (jak RDS, ale storage auto-skaluje)

Amazon RDS - klasyka, która wciąż działa

Kiedy wybrać RDS?

RDS to najlepszy wybór gdy:

  • Twoje dane są relacyjne - użytkownicy mają zamówienia, zamówienia mają produkty, produkty mają kategorie
  • Potrzebujesz JOIN-ów - "pokaż zamówienia z produktami i danymi klienta"
  • Twój zespół zna SQL - krzywa uczenia = 0
  • Masz złożone zapytania analityczne - raportowanie, GROUP BY, window functions
  • Potrzebujesz transakcji ACID na wielu tabelach jednocześnie

Uruchamianie RDS

  1. Wejdź w RDS → Create database
  2. Wybierz Standard createPostgreSQL (najlepsza opcja dla nowych projektów)
  3. Template: Free tier (db.t3.micro; dotyczy tylko kont założonych przed 15.07.2025 - nowsze konta dostają kredyty zamiast 12-miesięcznego Free Tier) lub Dev/Test
  4. DB instance identifier: moja-apka-db
  5. Master username: dbadmin, wygeneruj silne hasło
  6. Storage: 20 GB gp3, włącz Storage autoscaling (max 100 GB)
  7. Connectivity: wybierz VPC, umieść w prywatnym subnecie
  8. Włącz Multi-AZ dla produkcji (podwaja koszt, ale daje HA)
  9. Automated backups: 7 dni (free, brak powodu by wyłączać)
Screenshot: RDS Create Database - wybór PostgreSQL i konfiguracja instancji
# Utwórz subnet group (wymagane)
aws rds create-db-subnet-group \
  --db-subnet-group-name moja-apka-subnets \
  --db-subnet-group-description "Private subnets for DB" \
  --subnet-ids subnet-aaa111 subnet-bbb222

# Utwórz Security Group
aws ec2 create-security-group \
  --group-name rds-sg \
  --description "RDS access" \
  --vpc-id vpc-xxx

aws ec2 authorize-security-group-ingress \
  --group-id sg-rds123 \
  --protocol tcp --port 5432 \
  --source-group sg-app123  # dostęp tylko z app serwerów

# Utwórz instancję RDS PostgreSQL
aws rds create-db-instance \
  --db-instance-identifier moja-apka-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 16.4 \
  --master-username dbadmin \
  --master-user-password "SuperSilneHaslo123!" \
  --allocated-storage 20 \
  --storage-type gp3 \
  --max-allocated-storage 100 \
  --db-subnet-group-name moja-apka-subnets \
  --vpc-security-group-ids sg-rds123 \
  --backup-retention-period 7 \
  --no-publicly-accessible \
  --storage-encrypted
Nigdy nie udostępniaj RDS publicznie! Opcja "Publicly accessible" to zaproszenie dla skanerów portów. Baza danych powinna być w prywatnym subnecie, dostępna tylko z poziomu aplikacji w tym samym VPC.

Koszty RDS

InstancjavCPURAMKoszt/mc (eu-central-1)Zastosowanie
db.t3.micro21 GB~$15Dev/test, Free Tier
db.t3.small22 GB~$30Mały produkcyjny
db.t3.medium24 GB~$60Średni produkcyjny
db.r6g.large216 GB~$170Memory-intensive
db.r6g.xlarge432 GB~$340Duży produkcyjny

Do tego dochodzi storage ($0.115/GB/mc dla gp3) i opcjonalnie Multi-AZ (podwojenie kosztu instancji).

Amazon DynamoDB - NoSQL bez limitów skali

Kiedy wybrać DynamoDB?

DynamoDB jest idealny gdy:

  • Masz proste wzorce dostępu - "pobierz użytkownika po ID", "lista zamówień klienta"
  • Potrzebujesz milisekund latencji - single-digit ms niezależnie od rozmiaru tabeli
  • Budujesz architekturę serverless (Lambda + DynamoDB to naturalne combo)
  • Ruch jest nieregularny - mode on-demand = płacisz za faktyczne użycie
  • Nie potrzebujesz JOIN-ów ani złożonych zapytań SQL
  • Chcesz zero administracji - brak patching, brak instancji, brak backup management

Kluczowe koncepty DynamoDB

DynamoDB nie jest "bazą bez schematu". Ma schemat - ale inny niż SQL:

  • Partition Key (PK) - klucz główny, determinuje w której partycji leżą dane
  • Sort Key (SK) - opcjonalny, pozwala na query z warunkami (begins_with, between)
  • GSI (Global Secondary Index) - dodatkowy "widok" na dane z innym PK/SK
  • Single-table design - zamiast wielu tabel, jedna tabela z różnymi typami rekordów
# Utwórz tabelę DynamoDB
aws dynamodb create-table \
  --table-name MojaApka \
  --attribute-definitions \
    AttributeName=PK,AttributeType=S \
    AttributeName=SK,AttributeType=S \
    AttributeName=GSI1PK,AttributeType=S \
    AttributeName=GSI1SK,AttributeType=S \
  --key-schema \
    AttributeName=PK,KeyType=HASH \
    AttributeName=SK,KeyType=RANGE \
  --global-secondary-indexes '[{
    "IndexName": "GSI1",
    "KeySchema": [
      {"AttributeName":"GSI1PK","KeyType":"HASH"},
      {"AttributeName":"GSI1SK","KeyType":"RANGE"}
    ],
    "Projection": {"ProjectionType":"ALL"}
  }]' \
  --billing-mode PAY_PER_REQUEST

Przykładowe operacje

import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MojaApka')

# Zapis
table.put_item(Item={
    'PK': 'USER#abc123',
    'SK': 'PROFILE',
    'name': 'Jan Kowalski',
    'email': '[email protected]',
    'plan': 'pro'
})

# Odczyt po kluczu - stałe <5ms niezależnie od rozmiaru tabeli
result = table.get_item(Key={'PK': 'USER#abc123', 'SK': 'PROFILE'})

# Query - wszystkie zamówienia użytkownika
result = table.query(
    KeyConditionExpression='PK = :pk AND begins_with(SK, :sk)',
    ExpressionAttributeValues={
        ':pk': 'USER#abc123',
        ':sk': 'ORDER#'
    }
)

# Scan - UNIKAJ na produkcji (czyta całą tabelę!)
# Zamiast scan, użyj GSI z odpowiednim kluczem

Koszty DynamoDB

ModeOdczytZapisStorageKiedy używać
On-demand$0.25/1M RRU$1.25/1M WRU$0.25/GB/mcNieregularny ruch, startupy, dev
Provisioned$0.00013/RCU/h$0.00065/WCU/h$0.25/GB/mcStały, przewidywalny ruch
Free Tier25 RCU25 WCU25 GBPrototypy, małe apki
Pro tip: DynamoDB Free Tier (25 RCU + 25 WCU + 25 GB) NIE wygasa po 12 miesiącach - jest permanentny! Mała aplikacja może działać na DynamoDB za $0 na zawsze. Uwaga: darmowe RCU/WCU dotyczą tylko trybu provisioned - w on-demand płacisz za każdy request.

Amazon Aurora - RDS na sterydach

Kiedy wybrać Aurora?

Aurora to relacyjna baza danych zbudowana przez AWS od podstaw, kompatybilna z MySQL i PostgreSQL. Wybierz ją gdy:

  • Potrzebujesz SQL + wysokiej wydajności - Aurora oferuje do 5× przepustowości standardowego MySQL i do 3× standardowego PostgreSQL
  • Chcesz auto-skalowanie storage - dysk rośnie automatycznie od 10 GB do 128 TB
  • Potrzebujesz wielu read replik - do 15, z lagiem rzędu milisekund dzięki wspólnemu storage (RDS też pozwala na 15, ale każda replika to osobna kopia danych)
  • Chcesz serverless SQL - Aurora Serverless v2 skaluje się do 0 ACU (auto-pause), gdy baza śpi płacisz tylko za storage
  • Wymagasz global database - replikacja cross-region z <1s lag

Aurora Serverless v2 - game changer

Aurora Serverless v2 automatycznie skaluje compute od 0 ACU (auto-pause przy braku połączeń, wznowienie ~15 s) do 256 ACU (1 ACU = ~2 GB RAM). Płacisz za faktyczne użycie, nie za zarezerwowaną instancję:

  1. Wejdź w RDS → Create database
  2. Wybierz Amazon AuroraPostgreSQL-Compatible
  3. Template: Production lub Dev/Test
  4. DB cluster identifier: moja-apka-aurora
  5. Instance configuration: wybierz Serverless v2
  6. Capacity range: Min 0.5 ACU, Max 8 ACU (dostosuj do potrzeb)
  7. Connectivity: prywatny subnet, Security Group jak dla RDS
  8. Kliknij Create database
Screenshot: Aurora Create - wybór Serverless v2 z konfiguracją ACU
# 1. Utwórz klaster Aurora Serverless v2
aws rds create-db-cluster \
  --db-cluster-identifier moja-apka-aurora \
  --engine aurora-postgresql \
  --engine-version 16.4 \
  --master-username dbadmin \
  --master-user-password "SuperSilneHaslo123!" \
  --serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=8 \
  --db-subnet-group-name moja-apka-subnets \
  --vpc-security-group-ids sg-rds123 \
  --storage-encrypted

# 2. Dodaj instancję writer (Serverless v2)
aws rds create-db-instance \
  --db-instance-identifier moja-apka-aurora-writer \
  --db-cluster-identifier moja-apka-aurora \
  --db-instance-class db.serverless \
  --engine aurora-postgresql

# 3. Opcjonalnie: dodaj read replica (też serverless)
aws rds create-db-instance \
  --db-instance-identifier moja-apka-aurora-reader \
  --db-cluster-identifier moja-apka-aurora \
  --db-instance-class db.serverless \
  --engine aurora-postgresql

Koszty Aurora

WariantComputeStorageI/O
Aurora ProvisionedJak RDS (instancje)$0.10/GB/mc$0.20/1M requests
Aurora Serverless v2$0.12/ACU/h (~$87/ACU/mc)$0.10/GB/mc$0.20/1M requests
Aurora I/O-Optimized+30% compute$0.225/GB/mc$0 (wliczone!)
Aurora Serverless v2 przy minimum 0.5 ACU: ~$44/mc compute + storage + I/O. To drożej niż db.t3.micro ($15), ale dostajesz auto-scaling, lepszą wydajność i brak zarządzania instancjami. Dla produkcji to często lepszy deal.

Porównanie głowa do głowy

KryteriumRDS PostgreSQLDynamoDBAurora PostgreSQL
Latencja odczytu2-10 ms<5 ms (stałe)1-5 ms
Skalowanie zapisuVertical onlyHorizontal (auto)Vertical (ale większy max)
Skalowanie odczytu15 read replicasUnlimited (DAX cache)15 read replicas (wspólny storage)
Max storage64 TBUnlimited128 TB (auto-grow)
TransakcjePełne ACIDTransactWriteItems (ograniczone)Pełne ACID
JOIN-yTakNieTak
Full-text searchTak (tsvector)Nie (użyj OpenSearch)Tak
Min koszt/mc~$15 (t3.micro)$0 (free tier permanent)~$44 (Serverless v2)
BackupAutomatyczny (35 dni max)Point-in-time recovery + on-demandAutomatyczny (ciągły)
Multi-regionCross-region replicasGlobal TablesGlobal Database (<1s lag)
Vendor lock-inNiski (standard SQL)Wysoki (własne API AWS)Średni (SQL, ale Aurora-specific features)

Drzewo decyzyjne - szybki wybór

Odpowiedz na te pytania w kolejności:

  1. Potrzebujesz JOIN-ów i złożonych zapytań SQL?
    • TAK → RDS lub Aurora (przejdź do pytania 4)
    • NIE → przejdź do pytania 2
  2. Czy Twoje wzorce dostępu to głównie get/put po kluczu?
    • TAK → DynamoDB
    • NIE → RDS lub Aurora
  3. Budujesz architekturę serverless (Lambda)?
    • TAK → DynamoDB (naturalny partner Lambda, zero connection pooling issues)
    • NIE → RDS lub Aurora
  4. Potrzebujesz auto-skalowania compute + storage?
    • TAK → Aurora Serverless v2
    • NIE → przejdź do pytania 5
  5. Budżet jest ograniczony (startup, side project)?
    • TAK → RDS (db.t3.micro na start)
    • NIE → Aurora (lepsza wydajność, mniej zarządzania)

Scenariusze z praktyki

Scenariusz 1: Sklep e-commerce

Rekomendacja: Aurora PostgreSQL

Produkty, zamówienia, koszyk, użytkownicy - relacyjne dane z JOIN-ami. Potrzebujesz raportów sprzedaży (GROUP BY, SUM). Aurora daje wydajność potrzebną w Black Friday bez ręcznego skalowania. Read replica dla raportów, żeby nie obciążać writera.

Scenariusz 2: Aplikacja SaaS (API-driven)

Rekomendacja: DynamoDB

Proste CRUD na zasobach tenantów. Serverless backend (Lambda). Nieregularny ruch. DynamoDB on-demand skaluje się od zera do tysięcy requestów/s bez konfiguracji. Zero kosztów stałych. Architekturę SaaS na DynamoDB opisałem w Use Case: SaaS za 200 zł.

Scenariusz 3: Blog / CMS

Rekomendacja: RDS PostgreSQL (db.t3.small)

Relacyjne dane (posty, kategorie, komentarze, tagi). Złożone zapytania (najnowsze posty w kategorii z liczbą komentarzy). Mały budżet. RDS t3.small za $30/mc w zupełności wystarczy. Jeśli ruch rośnie, dodaj read replica i cache (ElastiCache).

Scenariusz 4: IoT / real-time analytics

Rekomendacja: DynamoDB + S3 (data lake)

Tysiące urządzeń wysyłających dane co sekundę. DynamoDB obsługuje miliony writes/s. Hot data (ostatnie 24h) w DynamoDB, cold data eksportuj do S3 i analizuj Athena/QuickSight.

Scenariusz 5: System bankowy / finanse

Rekomendacja: Aurora PostgreSQL z Multi-AZ

Transakcje ACID na wielu tabelach (przelew = debit + credit atomowo). Aurora Global Database dla disaster recovery. Szyfrowanie at-rest i in-transit. Audit logging. Zero kompromisów na niezawodności.

Połączenie baz - polyglot persistence

W praktyce wiele aplikacji używa WIĘCEJ niż jednej bazy. To normalne i ma nawet nazwę - polyglot persistence:

  • Aurora - główna baza (użytkownicy, zamówienia, finanse)
  • DynamoDB - sesje użytkowników, cache, feature flags
  • ElastiCache (Redis) - cache API responses, rate limiting
  • S3 - pliki, obrazy, backupy

Nie bój się mieszać technologii - każda baza robi co innego najlepiej.

Problemy z Lambda + RDS (i jak je rozwiązać)

Jeśli łączysz Lambda z RDS/Aurora, napotkasz problem connection pooling. Lambda tworzy nowe połączenie przy każdym cold starcie, a baza ma limit połączeń (np. 100 dla db.t3.micro).

Rozwiązanie: RDS Proxy - managed connection pooler:

# Utwórz RDS Proxy
aws rds create-db-proxy \
  --db-proxy-name moja-apka-proxy \
  --engine-family POSTGRESQL \
  --auth '[{
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:eu-central-1:123456789:secret:db-creds",
    "IAMAuth": "REQUIRED"
  }]' \
  --role-arn arn:aws:iam::123456789:role/rds-proxy-role \
  --vpc-subnet-ids subnet-aaa111 subnet-bbb222 \
  --vpc-security-group-ids sg-proxy123

# Zarejestruj target
aws rds register-db-proxy-targets \
  --db-proxy-name moja-apka-proxy \
  --db-cluster-identifiers moja-apka-aurora

RDS Proxy kosztuje ~$0.015/vCPU/h, rozliczane min. za 2 vCPU (~$22/mc dla db.t3.small). DynamoDB nie ma tego problemu - kolejny powód, dla którego jest naturalnym partnerem Lambda.

FAQ - najczęstsze pytania o bazy danych AWS

Czy mogę migrować z RDS do DynamoDB (lub odwrotnie)?

Technicznie tak, ale to poważna przebudowa. RDS → DynamoDB wymaga przeprojektowania schematu (normalizacja → single-table design). DynamoDB → RDS jest prostsze (flatten → tabele). Lepiej wybrać dobrze na starcie niż migrować później.

Aurora jest droga - czy naprawdę warto?

Aurora Serverless v2 (min 0.5 ACU) to ~$44/mc - 3× drożej niż db.t3.micro ($15). Ale dostajesz: auto-scaling, 3× lepszą wydajność, automatyczny storage growth, szybszy failover. Dla produkcji z rosnącym ruchem - tak, warto. Dla dev/test - RDS wystarczy.

Czy DynamoDB obsługuje transakcje?

Tak, od 2018 roku. TransactWriteItems pozwala na atomowe operacje na do 100 itemów w jednej transakcji. Ale to nie jest to samo co SQL BEGIN/COMMIT - nie ma izolacji SELECT FOR UPDATE. Dla prostych "albo wszystko albo nic" - wystarczy. Dla złożonych transakcji bankowych - RDS/Aurora.

Który engine RDS wybrać: PostgreSQL czy MySQL?

W 2026 rekomendacja to PostgreSQL. Ma lepsze: typy danych (JSONB, arrays, hstore), window functions, pełnotekstowe wyszukiwanie, rozszerzenia (PostGIS, pgvector dla AI). MySQL wygrywa tylko gdy migrujesz istniejącą aplikację MySQL lub zespół zna wyłącznie MySQL.

Jak backupować bazę danych na AWS?

RDS i Aurora mają automatyczny backup (do 35 dni, domyślnie 7). DynamoDB ma Point-in-Time Recovery (PITR) i on-demand backup. Dodatkowo: eksportuj snapshoty do S3 dla długoterminowego przechowywania. Koszt: snapshot storage ~$0.02/GB/mc.

Co dalej?

  1. Przejdź przez drzewo decyzyjne wyżej i wybierz bazę dla swojego projektu.
  2. Dla RDS/Aurora: zacznij od najtańszej instancji i skaluj w górę gdy metryki w CloudWatch pokażą bottleneck.
  3. Dla DynamoDB: zacznij od on-demand mode i zaprojektuj single-table design.
  4. Umieść bazę w prywatnym subnecie VPC z odpowiednimi Security Groups.
  5. Włącz szyfrowanie (at-rest i in-transit) i automatyczne backupy.
  6. Jeśli używasz Lambda z RDS - rozważ RDS Proxy.

Wybór bazy danych to jedna z najważniejszych decyzji architektonicznych. Zły wybór = kosztowna migracja za pół roku. Dobry wybór = infrastruktura, która rośnie razem z aplikacją. Jeśli budujesz pełną architekturę, przeczytaj architekturę aplikacji webowej na 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.