Skip to content

AWS Container Services

AWS offers two container orchestrators: Amazon Elastic Container Service (ECS) and Amazon Elastic Kubernetes Service (EKS). Both are managed and highly available; both can run containers on EC2 instances or on AWS Fargate. This page is the canonical comparison between them.

Amazon ECS is AWS’s own orchestrator. It has fewer concepts, integrates natively with the rest of AWS, has no control-plane charge, and does exactly what AWS designed it to do.

Amazon EKS is upstream Kubernetes with the control plane run for you. It is portable across clouds and on-premises, extensible through the entire Kubernetes ecosystem, and carries a per-cluster charge and a much larger surface to learn and operate.

ECSEKS
SchedulerAWS-proprietaryUpstream Kubernetes
Control planeManaged, freeManaged, charged per cluster-hour
Service discoveryAWS Cloud Map / ECS Service ConnectKubernetes Services and CoreDNS
Load balancingDirect ALB/NLB target group registrationAWS Load Balancer Controller, or the built-in controllers under EKS Auto Mode
MonitoringCloudWatch and Container Insights nativelyCloudWatch, Container Insights, or the Prometheus/Grafana stack
IdentityIAM task rolesEKS Pod Identity or IAM Roles for Service Accounts (IRSA), mapped to Kubernetes RBAC
ConfigurationTask definitions and service definitions (JSON)Kubernetes manifests (YAML)

ECS reaches for the AWS service that already exists — Route 53, Elastic Load Balancing, CloudWatch, IAM. EKS brings its own equivalents inside the cluster and bridges them out to AWS through controllers and add-ons. That is the structural difference from which most of the others follow.

ECSEKSWhat it is
Task definitionPod spec (inside a Deployment, Job, etc.)The container specification
TaskPodOne running instance of that specification
ServiceDeployment + ServiceThe controller that keeps n copies running and fronts them
ClusterClusterThe logical grouping and its capacity
Container instanceNodeAn EC2 instance registered as capacity

Containers within an ECS task, like containers within a Kubernetes pod, share a network namespace and can share volumes.

ECS does what AWS ships. That is a real constraint and also a real feature: there are fewer ways for the platform to be misconfigured, and upgrades are AWS’s problem.

EKS inherits the whole Kubernetes ecosystem — custom resources and operators, service meshes, admission controllers, Helm, GitOps tooling, third-party observability. Manifests written for EKS mostly run on any conformant Kubernetes, which is the argument for it when portability is a genuine requirement rather than an aspiration.

ECS has no charge for the control plane; you pay only for the EC2 or Fargate capacity underneath.

EKS charges per cluster per hour on top of the capacity — $0.10 for a cluster on a supported Kubernetes version, rising to $0.60 once the version enters extended support. EKS Auto Mode adds a management fee on top of the EC2 instance price. Check current figures on the EKS pricing page before building a model; per-cluster charges are the reason multi-tenant clusters exist and the reason a cluster-per-team pattern gets expensive.

Choose ECS when you are building on AWS and staying there, the team has no Kubernetes experience to spend, you want the smallest thing that will hold the service up, or you are running enough separate workloads that per-cluster fees would add up.

Choose EKS when the team already runs Kubernetes, you need specific ecosystem components with no ECS equivalent, you are migrating an existing Kubernetes workload, or you have a real requirement to run the same workloads somewhere other than AWS.

The honest test for EKS is whether you would still choose it if portability turned out never to be exercised. Often the answer is yes — because of the team’s existing skills or a needed operator — and often it is no.

EC2 launch type / managed node groups. You provision and patch the instances. Choose it when you need a specific instance type, GPUs or other accelerators, Windows containers on EKS, privileged containers, DaemonSets, local NVMe, or when high steady utilisation makes reserved or Spot EC2 capacity cheaper per unit of work.

Fargate. AWS provides the host; you specify CPU and memory per task or pod and pay for that. Choose it when you would rather not run a fleet, when load is variable enough that instance utilisation would be poor, or when per-task isolation is worth paying for. The trade is a higher price per unit of compute, a fixed menu of CPU/memory combinations, and no access to the host.

Details of what Fargate can and cannot do, on each orchestrator, are in Fargate and ECS Fargate vs EKS Fargate.

  • Scan images in the registry and block deployment on critical findings — see Amazon ECR.
  • Give each task or pod its own IAM identity rather than sharing the node’s role.
  • Put tasks in private subnets and expose them only through a load balancer.
  • Set CPU and memory requests and limits deliberately; unset limits are how one container starves its neighbours, and oversized requests are how a cluster’s bill doubles.
  • Tag by service, environment and owner from the first deployment, so cost allocation is possible later.