ECS & Fargate: Containers Without Managing Kubernetes
Kubernetes is powerful and complicated. For a large share of container workloads, most of that complexity is overhead you never wanted. AWS offers a different answer: ECS for orchestration and Fargate for serverless compute.
This page builds the mental model. It separates the two ideas people constantly conflate - the orchestrator and the launch type - and shows where ECS and Fargate sit relative to EKS, so you can decide with confidence rather than by default.
ECS (Elastic Container Service) is AWS's own container orchestrator: it decides where tasks run, keeps services at their desired count, and integrates natively with IAM, VPC, ALB, and CloudWatch.
Insight: the orchestrator and the compute are separate choices. ECS can place containers on EC2 instances you manage, or on Fargate, where AWS runs the compute serverlessly.
Key Concepts:cluster, task definition, task, service, launch type, Fargate vs EC2, ECS vs EKS.
When to Use: you want to run containers on AWS without operating a Kubernetes control plane, worker nodes, and the surrounding ecosystem.
Limitations/Trade-offs: ECS is AWS-specific and does not speak the Kubernetes API; if you need portability or the Kubernetes ecosystem, EKS is the fit.
Related Topics: task definitions, ECS services and deployments, Fargate capacity providers, and load balancer integration.
Two questions decide how your containers run on AWS, and they are independent.
The first is which orchestrator schedules and supervises your containers. ECS is one option; EKS (managed Kubernetes) is the other.
The second is what compute the containers actually run on. This is the launch type: EC2 (virtual machines in your account that you own and operate) or Fargate (serverless compute AWS provisions per task).
People say "Fargate" as if it were an alternative to ECS. It is not. Fargate is a launch type; ECS is the orchestrator that uses it. You run ECS on Fargate.
The ECS object model is small and worth memorizing.
Object
What it is
Cluster
A logical grouping that holds your services and tasks.
Task Definition
A versioned blueprint: which containers, images, CPU, memory, roles, ports, env, secrets.
Task
A running instantiation of a task definition - one or more containers scheduled together.
Container
A single container inside a task, defined by a container definition.
Service
A controller that keeps N copies of a task running and wires them to load balancers.
A one-off job is a task you run and let finish. A long-running server is a service that maintains a desired count and replaces anything that dies.
Listing your clusters is a good first SDK call to confirm the model is wired up.
Once you separate orchestrator from launch type, the trade-offs line up cleanly.
ECS on Fargate removes servers entirely. There are no EC2 instances in your account, nothing to patch, no cluster autoscaler to tune. You declare a task's vCPU and memory, and AWS finds capacity, runs the task in its own kernel-isolated micro-VM, and bills per vCPU-second and GB-second. This is the default recommendation for most teams starting out.
ECS on EC2 keeps a fleet of instances you own in the cluster. The ECS agent on each instance reports capacity, and ECS bin-packs tasks onto them. You get access to the host, GPUs, specific instance types, and lower per-unit cost at steady high utilization - in exchange for operating the fleet.
EKS is a different orchestrator: managed Kubernetes. AWS runs the Kubernetes control plane (at an hourly cost per cluster), and you deploy with Kubernetes objects - Deployments, Pods, Services - using kubectl and the vast Kubernetes ecosystem. EKS itself can also use Fargate for its pods, which is exactly why launch type and orchestrator must be kept separate in your head.
The reason ECS feels lighter is that it leans on services you already use rather than reinventing them. Task IAM roles come straight from IAM. Networking in awsvpc mode gives each task its own elastic network interface and security groups, so a task is a first-class VPC citizen. Load balancing is an ALB target group. Logs go to CloudWatch via the awslogs driver. There is no separate networking layer, ingress controller, or secrets operator to install - the equivalents are AWS primitives ECS calls directly.
Cost shape differs by launch type. Fargate has no idle cost between tasks but a higher per-unit price while running, which suits spiky or low-volume workloads. EC2 launch type can be cheaper at sustained high utilization but you pay for instances whether or not tasks fill them. Fargate Spot cuts the Fargate price substantially for interruptible work, at the cost of two-minute reclaim notices.
When EKS wins is specific: you already have Kubernetes expertise, you need Helm charts or operators, you want workloads portable across clouds, or you depend on Kubernetes-native tooling like custom controllers. If none of those apply, the Kubernetes control plane is complexity you are paying for without using.
The pragmatic default for a team on AWS that just wants to ship containers: ECS on Fargate. Start there, and reach for EC2 launch type when utilization economics or host access demand it, or for EKS when you genuinely need Kubernetes.
"Fargate is an alternative to ECS." - No. Fargate is a launch type; ECS (or EKS) is the orchestrator that runs on it.
"ECS is just AWS's Kubernetes." - No. ECS is a separate orchestrator with its own API. It does not speak the Kubernetes API at all.
"ECS has a control-plane fee like EKS." - No. The ECS control plane is free; you pay only for the compute (Fargate or EC2) your tasks use.
"Fargate means you never think about CPU and memory." - No. You still declare task-level vCPU and memory; Fargate just provisions and bills it for you.
"EKS is always more scalable or production-ready." - No. ECS runs very large production fleets. EKS adds Kubernetes capability, not inherently more reliability.
ECS is the orchestrator that schedules and supervises containers. Fargate is a serverless launch type that provides the compute. You run ECS on Fargate; they are not competitors.
When should I choose ECS over EKS?
Choose ECS when you want to run containers on AWS with minimal operational overhead and no need for the Kubernetes API. Choose EKS when you need Kubernetes tooling, portability, or existing Kubernetes expertise.
Does ECS cost money for the control plane?
No. Unlike EKS, ECS has no control-plane charge. You pay only for the underlying compute: Fargate vCPU/GB-seconds, or the EC2 instances in your cluster.
What are the ECS launch types?
EC2 (you run the instances in the cluster) and Fargate (AWS runs the compute serverlessly). The launch type is chosen per task or service and is independent of the ECS orchestrator itself.
What is a task versus a service?
A task is a running instance of a task definition - one or more containers scheduled together. A service is a controller that keeps a desired number of tasks running and connects them to load balancers.
Can EKS use Fargate too?
Yes. Fargate is a compute layer that both ECS and EKS can use. This is exactly why the launch type (Fargate vs EC2) and the orchestrator (ECS vs EKS) are separate decisions.
Is ECS locked to AWS?
Yes. ECS is AWS-specific and does not run elsewhere. If portability across clouds matters, Kubernetes on EKS is the portable choice.
Why do teams pick Fargate by default?
Because it removes servers entirely: no instances to patch, scale, or right-size. You declare CPU and memory per task and pay only while tasks run, which fits most workloads and teams.