ECS 와 Fargate (태스크, 서비스, Express Mode, Managed Instances)
Amazon ECS 의 클러스터, 태스크 정의, 서비스 구조와 세 가지 실행 방식(Fargate, EC2, 2025-09 에 나온 ECS Managed Instances), 태스크 역할과 실행 역할의 차이, 배포 방식, 2025-11 의 ECS Express Mode 까지 정리합니다.
구조
Amazon ECS 는 AWS 가 만든 컨테이너 오케스트레이터입니다. 쿠버네티스보다 개념이 적고 AWS 서비스와 깊게 엮여 있어서, "컨테이너를 돌리고 싶지 쿠버네티스를 운영하고 싶지는 않은" 팀에 잘 맞습니다.
| 개념 | 뜻 |
|---|---|
| 클러스터 | 태스크가 도는 논리적 묶음. 그 자체로는 비용이 없음 |
| 태스크 정의 | 컨테이너 이미지, CPU와 메모리, 포트, 환경 변수, 비밀, 로그 설정, 역할을 담은 버전 문서 |
| 태스크 | 태스크 정의로 띄운 실행 단위(컨테이너 묶음). 배치 작업은 태스크만 돌리고 끝냄 |
| 서비스 | 원하는 태스크 수를 유지하고 ELB 에 붙이며 배포를 관리 |
| 용량 공급자 | 태스크가 어디서 돌지(Fargate, Fargate Spot, EC2 ASG, Managed Instances)와 비율 |
세 가지 실행 방식
| 방식 | 서버 관리 | 요금 | 맞는 곳 |
|---|---|---|---|
| Fargate | 없음. 태스크마다 격리된 환경 | 태스크의 vCPU, 메모리, 시간 | 대부분의 웹, API, 배치. 첫 선택 |
| EC2 (ASG 용량 공급자) | AMI, 패치, 확장을 직접 | EC2 인스턴스 요금 | GPU, 특수 커널 설정, 큰 바이너리 캐시, 최대 비용 효율 |
| ECS Managed Instances | AWS 가 프로비저닝, 패치, 확장 | EC2 요금 + 관리 요금 | EC2 의 모든 유형(GPU 포함)이 필요하지만 노드 운영은 싫을 때 |
ECS Managed Instances(2025-09-30)는 Fargate 처럼 편하면서 EC2 유형을 고를 수 있는 중간 지대입니다. 태스크 요구 사항에 맞는 인스턴스를 내 계정에 띄우고, 14 일마다 보안 패치를 하며, EC2 이벤트 창으로 패치 시간을 정할 수 있습니다. 인스턴스 요금에는 Savings Plans 같은 EC2 할인이 적용됩니다.
Fargate Spot 은 Fargate 를 스팟 용량으로 싸게 돌립니다. 회수 2 분 전에 SIGTERM 이 오니, 컨테이너가 신호를 받아 정리하고 끝나도록 stopTimeout 을 맞춥니다.
태스크 정의 예
{
"family": "orders-api",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"runtimePlatform": { "cpuArchitecture": "ARM64", "operatingSystemFamily": "LINUX" },
"executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::111122223333:role/orders-api-task",
"containerDefinitions": [{
"name": "app",
"image": "111122223333.dkr.ecr.ap-northeast-2.amazonaws.com/orders-api:1.8.2",
"portMappings": [{ "containerPort": 8080 }],
"secrets": [{ "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:ap-northeast-2:111122223333:secret:prod/orders/db" }],
"logConfiguration": {
"logDriver": "awslogs",
"options": { "awslogs-group": "/ecs/orders-api", "awslogs-region": "ap-northeast-2", "awslogs-stream-prefix": "app" }
},
"healthCheck": { "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"], "interval": 15, "retries": 3 }
}]
}실행 역할과 태스크 역할
헷갈리기 쉬운 두 역할입니다.
- 실행 역할(execution role): ECS 에이전트가 쓰는 역할. ECR 에서 이미지 가져오기, CloudWatch Logs 에 쓰기, Secrets Manager 와 SSM 파라미터에서 비밀 읽어 주입하기.
- 태스크 역할(task role): 컨테이너 안의 애플리케이션이 쓰는 역할. S3, DynamoDB, SQS 호출 권한.
이미지 풀 실패(CannotPullContainerError)나 비밀 주입 실패는 실행 역할 문제이고, 애플리케이션의 AccessDenied 는 태스크 역할 문제입니다.
네트워크
Fargate 는 awsvpc 모드만 씁니다. 태스크마다 ENI 와 프라이빗 IP 가 하나씩 붙고, 보안 그룹도 태스크 단위로 겁니다. 그래서 태스크가 많으면 서브넷 IP 가 빨리 줄어듭니다. 프라이빗 서브넷에 두고, 이미지를 받으려면 NAT Gateway 나 ECR, S3, CloudWatch Logs 용 VPC 엔드포인트가 있어야 합니다. 엔드포인트 구성은 보안 그룹과 VPC 엔드포인트 문서를 봅니다.
서비스 사이 호출은 Service Connect 로 이름 기반 디스커버리, 재시도, 지표를 붙일 수 있습니다.
배포 방식
| 방식 | 동작 |
|---|---|
| 롤링 업데이트 (기본) | minimumHealthyPercent, maximumPercent 범위 안에서 새 태스크를 띄우고 옛 태스크를 뺌. 배포 서킷 브레이커로 실패 시 자동 롤백 |
| 블루/그린 (ECS 내장) | 새 버전을 따로 띄우고 테스트 트래픽으로 확인한 뒤 한 번에 전환. 2025-07 부터 CodeDeploy 없이 ECS 자체 기능으로 가능 |
| 외부 배포 컨트롤러 | 직접 만든 도구로 제어 |
aws ecs update-service --cluster prod --service orders-api \
--task-definition orders-api:42 \
--deployment-configuration '{"deploymentCircuitBreaker":{"enable":true,"rollback":true},"minimumHealthyPercent":100,"maximumPercent":200}'
ECS Express Mode (2025-11)
ECS Express Mode 는 컨테이너 이미지만 주면 서비스, ALB, 확장 설정, HTTPS 가 되는 AWS 제공 도메인까지 한 번에 만들어 주는 기능입니다. 하나의 ALB 뒤에 최대 25 개 서비스를 규칙 기반 라우팅으로 나눠 붙여 ALB 비용을 아낍니다. 기능 자체는 무료이고 만들어진 리소스 요금만 냅니다. 만들어진 리소스는 모두 내 계정에 보이니 나중에 직접 고쳐 쓸 수 있고, 2026-07 부터는 사용자 지정 태스크 정의도 쓸 수 있습니다. App Runner 가 2026-04-30 부터 신규 고객을 받지 않는 Maint 단계로 들어갔기 때문에, 간단한 웹 앱을 올릴 곳으로 Express Mode 가 자주 거론됩니다.
확장
서비스 자동 확장은 Application Auto Scaling 으로 CPU, 메모리, ALB 요청 수에 대상 추적을 겁니다. 2026-06 AWS Summit New York 에서는 20 초 단위 고해상도 지표로 확장을 더 빨리 시작하는 개선이 발표됐습니다(AWS 벤치마크 기준 확장 시작까지 363 초에서 86 초). 확장 속도가 아쉬웠다면 서비스 설정에서 해당 옵션을 확인합니다.
증상, 원인, 해결
| 증상 | 원인 | 해결 |
|---|---|---|
CannotPullContainerError | 실행 역할에 ECR 권한 없음, 프라이빗 서브넷에 NAT 나 ECR 엔드포인트 없음 | 실행 역할 정책, ecr.api, ecr.dkr, S3 게이트웨이 엔드포인트 확인 |
태스크가 뜨자마자 Essential container exited | 애플리케이션 시작 실패, 메모리 부족(OOM, 종료 코드 137) | CloudWatch Logs 확인, 메모리 상향 |
| 서비스가 계속 태스크를 교체 | ALB 상태 확인 실패, 유예 시간 부족 | healthCheckGracePeriodSeconds, 대상 그룹 헬스 경로 확인 |
| 태스크가 PENDING 에 멈춤 | 서브넷 IP 부족, EC2 용량 부족 | 서브넷 여유 IP 확인, 용량 공급자 상태 확인 |