Spis treści 10 sekcji
- App Runner - najprostszy wybór, idealny na side projekty i prototypy. Zero konfiguracji infrastruktury.
- ECS + Fargate - złoty środek dla większości firm. Prostszy niż Kubernetes, wystarczająco elastyczny.
- ECS + EC2 - gdy potrzebujesz pełnej kontroli nad instancjami (GPU, specyficzny hardware).
- EKS - gdy już znasz Kubernetes lub potrzebujesz multi-cloud/hybrid. Najwyższy próg wejścia.
- Koszty mogą się różnić nawet 5x między usługami - wybór ma realne konsekwencje finansowe.
Masz gotowy obraz Dockera i chcesz go uruchomić na AWS. Otwierasz konsolę i widzisz cztery usługi kontenerowe: ECS, EKS, Fargate, App Runner. Każda obiecuje, że jest tą właściwą. Która faktycznie jest?
Pracując jako MSP Engineer w ClearScale, wdrażałem kontenery na AWS dziesiątki razy - od jednoosobowych startupów po korporacje z setkami mikroserwisów. W tym artykule dam Ci konkretne porównanie, tabelę kosztów i drzewo decyzyjne, które pozwoli Ci wybrać w 5 minut. Jeśli dopiero zaczynasz przygodę z kontenerami, przeczytaj najpierw Docker dla początkujących.
Czym różnią się te usługi?
Zanim przejdziemy do porównania, wyjaśnijmy fundamentalną różnicę. Te cztery usługi to nie cztery zamienniki - to różne warstwy abstrakcji:
- ECS (Elastic Container Service) - orkiestrator kontenerów stworzony przez AWS. Definiujesz zadania (tasks) i serwisy. Decydujesz, czy kontenery działają na EC2 czy Fargate.
- EKS (Elastic Kubernetes Service) - zarządzany Kubernetes na AWS. Używasz standardowych narzędzi K8s (kubectl, Helm). AWS zarządza control plane.
- Fargate - serverless compute engine. Nie jest samodzielną usługą, lecz trybem uruchamiania dla ECS lub EKS. Nie zarządzasz żadnymi instancjami EC2.
- App Runner - w pełni zarządzana usługa. Dajesz obraz z ECR lub kod źródłowy, App Runner robi resztę.
Wielka tabela porównawcza
| Cecha | ECS + Fargate | ECS + EC2 | EKS | App Runner |
|---|---|---|---|---|
| Złożoność konfiguracji | Średnia | Wysoka | Bardzo wysoka | Minimalna |
| Krzywa uczenia | 2-3 tygodnie | 3-4 tygodnie | 2-6 miesięcy | 1-2 dni |
| Zarządzanie infrastrukturą | Brak (serverless) | Pełne (patche, skalowanie EC2) | Częściowe (worker nodes) | Brak |
| Autoskalowanie | Tak (task-level) | Tak (task + instancje) | Tak (pod + node) | Tak (automatyczne) |
| Min. koszt miesięczny | ~10-15 USD | ~25-35 USD | ~75 USD (sam control plane) | ~5-10 USD |
| Skalowanie do zera | Nie (min. 1 task) | Nie | Tak (z KEDA/Karpenter) | Tak (z opóźnieniem cold start) |
| GPU support | Nie | Tak | Tak | Nie |
| Custom networking | Tak (VPC, SG) | Pełna kontrola | Pełna kontrola | Ograniczone |
| Multi-container pods | Tak (sidecar) | Tak (sidecar) | Tak (natywne) | Nie |
| CI/CD integracja | CodePipeline, GitHub Actions | CodePipeline, GitHub Actions | ArgoCD, Flux, GitHub Actions | Wbudowane auto-deploy |
| Vendor lock-in | Średni (API AWS) | Średni (API AWS) | Niski (standardowy K8s) | Wysoki |
| Najlepszy dla | Większości zastosowań | GPU, specjalny hardware | Zespołów znających K8s | Prostych aplikacji webowych |
Drzewo decyzyjne - co wybrać?
Zamiast zgadywać, przejdź przez te pytania:
- Czy to prosty serwis webowy bez skomplikowanego networkingu?
- Tak -> App Runner. Koniec, nie komplikuj.
- Nie -> pytanie 2.
- Czy Twój zespół zna i używa Kubernetes?
- Tak -> EKS. Wykorzystaj istniejącą wiedzę.
- Nie -> pytanie 3.
- Czy potrzebujesz GPU lub specyficznego hardware?
- Tak -> ECS + EC2 z odpowiednimi instancjami.
- Nie -> pytanie 4.
- Czy planujesz multi-cloud lub migrację poza AWS?
- Tak -> EKS. Kubernetes jest przenośny.
- Nie -> ECS + Fargate. Najlepsza relacja prostoty do elastyczności.
Scenariusze z życia wzięte
Scenariusz 1: Side project / MVP
Budujesz aplikację w Node.js lub Pythonie, masz 1-2 kontenery, ruch jest niewielki (kilkaset requestów dziennie). Budżet: jak najmniej.
Wybór: App Runner. Podpinasz repozytorium z GitHub lub obraz z ECR. App Runner buduje, wdraża i skaluje automatycznie. Zero konfiguracji ALB, target group czy task definition. Koszt: 5-15 USD/miesiąc. Rozważ też, czy w tym scenariuszu nie lepiej użyć Lambdy zamiast kontenerów.
Scenariusz 2: Startup z 3-5 mikroserwisami
Masz API gateway, backend, worker do kolejek, może serwis do wysyłki maili. Zespół 3-5 programistów, żaden nie jest DevOps-em z krwi i kości.
Wybór: ECS + Fargate. Definiujesz task definition dla każdego mikroserwisu, ustawiasz ALB do routingu, Service Discovery do komunikacji między serwisami. Fargate eliminuje zarządzanie instancjami. Koszt: 50-200 USD/miesiąc w zależności od ruchu.
Scenariusz 3: Enterprise z 50+ mikroserwisami
Korporacja, kilka zespołów, potrzeba namespace isolation, service mesh, zaawansowane strategie deploymentu (canary, blue/green). Być może multi-cloud.
Wybór: EKS. Kubernetes daje ekosystem narzędzi: Istio/Linkerd (service mesh), ArgoCD (GitOps), Karpenter (autoskalowanie nodów). Koszt: 500+ USD/miesiąc, ale masz pełną kontrolę i przenośność. Potrzebujesz jednak dedykowanego platform engineera.
Porównanie kosztów - realne liczby
Poniższe szacunki dotyczą typowej aplikacji webowej: 2 kontenery (0.5 vCPU, 1 GB RAM każdy), ruch ok. 100k requestów/dzień, region eu-central-1 (Frankfurt).
| Usługa | Compute | Stałe opłaty | Szacunkowy koszt/miesiąc |
|---|---|---|---|
| ECS + Fargate | ~35 USD (2 taski 24/7) | 0 USD | ~35-45 USD |
| ECS + EC2 | ~25 USD (t3.small On-Demand) | 0 USD | ~25-35 USD |
| EKS + Fargate | ~35 USD | 75 USD (control plane) | ~110-120 USD |
| EKS + EC2 | ~25 USD | 75 USD (control plane) | ~100-110 USD |
| App Runner | ~30 USD (z auto-pause) | 0 USD | ~30-40 USD |
Praktyka: Deploy aplikacji na ECS Fargate
Przejdźmy od teorii do praktyki. Pokażę Ci jak wrzucić obraz Dockera do ECR i uruchomić go na ECS Fargate. Jeśli nie masz jeszcze Dockera, wróć do przewodnika Docker dla początkujących.
Krok 1: Utwórz repozytorium ECR i wypchnij obraz
- Otwórz Amazon ECR w konsoli AWS.
- Kliknij Create repository.
- Wpisz nazwę:
moja-aplikacja, zostaw resztę domyślnie. - Kliknij Create repository.
- Wejdź w utworzone repozytorium i kliknij View push commands - konsola pokaże Ci gotowe komendy do skopiowania.
# Utwórz repozytorium ECR
aws ecr create-repository \
--repository-name moja-aplikacja \
--region eu-central-1
# Zaloguj Docker do ECR
aws ecr get-login-password --region eu-central-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.eu-central-1.amazonaws.com
# Zbuduj obraz
docker build -t moja-aplikacja .
# Uwaga: na Macu z Apple Silicon dodaj --platform linux/amd64,
# inaczej Fargate (domyślnie x86_64) nie uruchomi obrazu ARM
# Otaguj obraz
docker tag moja-aplikacja:latest \
123456789012.dkr.ecr.eu-central-1.amazonaws.com/moja-aplikacja:latest
# Wypchnij do ECR
docker push \
123456789012.dkr.ecr.eu-central-1.amazonaws.com/moja-aplikacja:latest
Krok 2: Utwórz Task Definition i uruchom serwis ECS
- Otwórz Amazon ECS w konsoli.
- Przejdź do Task definitions -> Create new task definition.
- Nazwa:
moja-aplikacja-task, Launch type: AWS Fargate. - CPU: 0.5 vCPU, Memory: 1 GB.
- Dodaj kontener: nazwa
app, Image URI z ECR (skopiuj z poprzedniego kroku), port 8080. - Kliknij Create.
- Przejdź do Clusters -> Create cluster (lub użyj istniejącego).
- W klastrze kliknij Create service, wybierz task definition, Desired tasks: 2.
- W sekcji Networking skonfiguruj VPC, subnety i Security Group (otwórz port 8080).
- Opcjonalnie podepnij Application Load Balancer.
# Utwórz klaster ECS
aws ecs create-cluster --cluster-name moj-klaster
# Zarejestruj task definition (z pliku JSON)
aws ecs register-task-definition \
--cli-input-json file://task-definition.json
# Przykładowy task-definition.json:
# {
# "family": "moja-aplikacja-task",
# "networkMode": "awsvpc",
# "requiresCompatibilities": ["FARGATE"],
# "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
# "cpu": "512",
# "memory": "1024",
# "containerDefinitions": [{
# "name": "app",
# "image": "123456789012.dkr.ecr.eu-central-1.amazonaws.com/moja-aplikacja:latest",
# "portMappings": [{"containerPort": 8080, "protocol": "tcp"}],
# "essential": true
# }]
# }
# Utwórz serwis
aws ecs create-service \
--cluster moj-klaster \
--service-name moja-aplikacja-svc \
--task-definition moja-aplikacja-task \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}"
:latest jako tagu obrazu. Użyj konkretnego tagu (np. git SHA: :abc1234), żebyś zawsze wiedział, jaka wersja kodu działa. To podstawa bezpiecznych rollbacków.Kiedy NIE używać kontenerów na AWS
Kontenery nie są odpowiedzią na wszystko. Oto sytuacje, w których lepsze są inne usługi:
- Proste API lub funkcje event-driven - użyj AWS Lambda. Zero zarządzania, płacisz tylko za wykonania.
- Statyczna strona internetowa - S3 + CloudFront. Taniej i szybciej niż jakikolwiek kontener.
- Prosty serwer z GUI (np. WordPress) - pojedyncza instancja EC2 może być prostsza niż konteneryzacja.
Migracja między usługami
Dobra wiadomość: obraz Dockera jest ten sam, niezależnie od tego, gdzie go uruchamiasz. Ścieżka migracji wygląda zwykle tak:
App Runner -> ECS Fargate -> ECS EC2 / EKS
Zaczynasz od najprostszego rozwiązania i przechodzisz na bardziej złożone, gdy tego potrzebujesz. Obraz z ECR działa wszędzie - zmieniasz tylko orkiestrator. To dlatego warto od początku trzymać obrazy w Amazon ECR.
Najczęściej zadawane pytania (FAQ)
Czy Fargate jest droższy od EC2?
Tak, Fargate jest ok. 20-30% droższy od EC2 pod względem czystego compute. Ale eliminujesz koszty zarządzania instancjami: patche, skalowanie, monitorowanie. Dla większości zespołów czas inżynierów jest droższy niż różnica w rachunku AWS. Fargate jest tańszy, gdy weźmiesz pod uwagę Total Cost of Ownership.
Czy mogę uruchomić EKS bez znajomości Kubernetes?
Technicznie tak, ale odradzam. EKS to zarządzany Kubernetes, co oznacza, że AWS dba o control plane, ale Ty wciąż musisz znać koncepty K8s: pods, deployments, services, ingress, RBAC. Bez tej wiedzy będziesz walczyć z każdym problemem. Zacznij od ECS Fargate i przejdź na EKS, gdy zespół dorośnie do Kubernetes.
Czy App Runner nadaje się na produkcję?
Tak, ale z ograniczeniami. App Runner świetnie działa dla prostych aplikacji webowych i API. Nie sprawdzi się, gdy potrzebujesz: sidecar kontenerów, zaawansowanego networkingu (VPC peering, PrivateLink), GPU, cron jobów czy skomplikowanego service discovery. Dla większości startupów i side projektów jest wystarczający.
Ile kosztuje EKS dla małego projektu?
Minimum 75 USD/miesiąc za sam control plane, plus koszty worker nodów (EC2 lub Fargate). Dla małego projektu z 2-3 mikroserwisami realny koszt to 120-180 USD/miesiąc. To dużo w porównaniu z ECS Fargate (35-50 USD) czy App Runner (20-40 USD). EKS finansowo opłaca się od ok. 15-20 mikroserwisów, gdzie ekosystem Kubernetes zaczyna przynosić realne korzyści.
Czy da się przenieść aplikację z ECS na EKS (i odwrotnie)?
Tak, obrazy Dockera z ECR działają na obu platformach. Trzeba jednak przepisać konfigurację orkiestratora: task definitions (ECS) na manifesty Kubernetes (EKS) lub odwrotnie. Sieć, load balancery i IAM role też wymagają rekonfiguracji. Migracja jest wykonalna, ale nie jest trywialna - planuj na 1-2 tygodnie dla małego projektu.
Następny krok
Wiesz już, która usługa kontenerowa jest dla Ciebie. Oto co zrobić dalej:
- Jeśli zaczynasz - przeczytaj Docker dla początkujących i zbuduj swój pierwszy obraz.
- Jeśli masz obraz - wrzuć go do ECR i uruchom na App Runner (5 minut) lub ECS Fargate (30 minut) według instrukcji wyżej.
- Jeśli chcesz zrozumieć koszty - sprawdź jak zacząć z AWS w 2026, gdzie omawiam Free Tier i optymalizację kosztów.
- Jeśli potrzebujesz compute bez kontenerów - przeczytaj porównanie EC2 vs Lambda i pełny poradnik EC2.
Masz pytania o kontenery na AWS? Napisz do mnie - chętnie pomogę wybrać najlepsze rozwiązanie dla Twojego projektu.
