Skip to main content

ECS & ECR โ€” Containers on AWS

Core concept: ECS runs Docker containers. ECR stores Docker images. Fargate removes the need to manage EC2 instances entirely.


ECS Launch Typesโ€‹

FeatureEC2 Launch TypeFargate Launch Type
InfrastructureYou manage EC2 instancesAWS manages everything
CostPay for EC2 regardlessPay per task (CPU + memory)
ControlHigh (OS-level access)Low (no SSH)
StartupFaster (instances already running)Slower (cold-start)
GPU supportโœ…โŒ
Best forPredictable, sustained workloadsVariable, serverless containers
Exam: Serverless containers = Fargate

Any question about running containers without managing servers โ†’ Fargate


ECS Core Conceptsโ€‹

Cluster
โ””โ”€โ”€ Service (keeps N tasks running, integrates with ALB)
โ””โ”€โ”€ Task (one running instance of your container group)
โ””โ”€โ”€ Container(s) (from Task Definition)
ConceptDescription
ClusterLogical grouping of tasks/services
Task DefinitionBlueprint โ€” image, CPU, memory, env vars, volumes
TaskRunning instance of a Task Definition
ServiceKeeps desired count of tasks running, handles rolling updates

Task Definitionโ€‹

{
"family": "order-service",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"executionRoleArn": "arn:aws:iam::123:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123:role/orderServiceTaskRole",
"containerDefinitions": [
{
"name": "order-service",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/order-service:latest",
"portMappings": [{ "containerPort": 8080 }],
"environment": [
{ "name": "SPRING_PROFILES_ACTIVE", "value": "prod" }
],
"secrets": [
{ "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:...:secret:db-pass" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/order-service",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}

IAM Roles for ECSโ€‹

Two different roles!

This is a common exam trap:

RolePurpose
Task Execution RoleECS agent needs: pull image from ECR, write logs to CloudWatch, read Secrets Manager
Task RoleYour container's app code needs: read DynamoDB, publish to SQS, write to S3
ECS Agent (Task Execution Role)       Your App (Task Role)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ€ข Pull from ECR โ€ข DynamoDB access
โ€ข CloudWatch Logs โ€ข S3 access
โ€ข Secrets Manager (for env vars) โ€ข SQS/SNS access
โ€ข SSM Parameter Store โ€ข Custom permissions

Service Auto Scalingโ€‹

# CloudFormation
ScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
ServiceNamespace: ecs
ScalableDimension: ecs:service:DesiredCount
ResourceId: !Sub "service/${Cluster}/${Service.Name}"
MinCapacity: 1
MaxCapacity: 50

ScalingPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyType: TargetTrackingScaling
TargetTrackingScalingPolicyConfiguration:
TargetValue: 70.0
PredefinedMetricSpecification:
PredefinedMetricType: ECSServiceAverageCPUUtilization

Amazon ECRโ€‹

FeatureDescription
Private registryPer-account, per-region
Public registryECR Public (like Docker Hub)
Image scanningOn push or on demand (Snyk/Inspector)
Lifecycle policiesAuto-delete old images
Cross-regionReplicate images across regions
# Authenticate Docker to ECR
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com

# Build and push
docker build -t order-service .
docker tag order-service:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/order-service:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/order-service:latest

CI/CD with ECS + CodePipelineโ€‹

CodeCommit/GitHub
โ†“
CodeBuild โ† builds Docker image, pushes to ECR
โ†“
CodeDeploy โ† Blue/Green ECS deployment
โ†“
ECS Service (new task definition with new image)

๐Ÿงช Practice Questionsโ€‹

Q1. A containerized Java app running on ECS needs to read from DynamoDB. The security team says no access keys should be used. What is the correct solution?

A) Set AWS_ACCESS_KEY_ID environment variable in the task definition
B) Attach a Task Role (IAM role) with DynamoDB permissions to the task definition
C) Use the Task Execution Role with DynamoDB permissions
D) Store keys in Secrets Manager and inject them as environment variables

โœ… Answer & Explanation

B โ€” The Task Role grants permissions to the application code running in the container. The Task Execution Role is for the ECS agent itself (pull images, write logs). Never use access keys in containers.


Q2. A developer wants to run containers without managing any EC2 instances. Which ECS launch type should they use?

A) EC2 Launch Type
B) ECS on Graviton
C) Fargate Launch Type
D) ECS Anywhere

โœ… Answer & Explanation

C โ€” Fargate is the serverless container option โ€” no EC2 instances to manage. AWS provisions the underlying compute automatically.


๐Ÿ”— Resourcesโ€‹