ECS(Elastic Container Service)는 AWS에서 Docker 컨테이너를 실행하고 관리하는 완전 관리형 컨테이너 오케스트레이션 서비스입니다. 여러 서버에 분산된 컨테이너의 배포, 스케줄링, 스케일링, 헬스 체크를 자동으로 처리합니다.
컨테이너 하나를 수동으로 EC2에 올리는 것은 간단합니다. 그러나 수십 개의 컨테이너를 여러 서버에서 운영하면서 장애 시 자동 재시작, 트래픽에 따른 자동 스케일링, 무중단 배포를 구현하려면 오케스트레이션 도구가 필요합니다. ECS는 AWS 환경에 최적화된 이 역할을 담당합니다.
Cluster (컴퓨팅 자원 묶음)
|
+-- Service (장기 실행 작업 관리자)
| |
| +-- Task (실행 중인 컨테이너 묶음) [인스턴스 1]
| +-- Task (실행 중인 컨테이너 묶음) [인스턴스 2]
| +-- Task (실행 중인 컨테이너 묶음) [인스턴스 3]
|
+-- Task (독립 실행 배치 작업)
Task Definition (설계도 — Task 생성 시 참조)
Cluster는 ECS가 컨테이너를 실행할 수 있는 컴퓨팅 자원의 논리적 묶음입니다. EC2 인스턴스들의 그룹이거나, 서버가 없는 Fargate 환경일 수 있습니다.
EC2 Launch Type을 사용하는 경우, Cluster에 EC2 인스턴스를 등록하면 ECS Agent가 인스턴스 위에서 실행되며 ECS Control Plane과 통신합니다.
Task Definition은 컨테이너를 어떻게 실행할지 정의하는 JSON 형식의 설계도입니다. 한 번 정의하면 버전(revision)으로 관리됩니다.
Task Definition에 포함되는 주요 설정은 다음과 같습니다.
{
"family": "my-web-app",
"containerDefinitions": [
{
"name": "web",
"image": "123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:1.0.0",
"cpu": 256,
"memory": 512,
"portMappings": [
{ "containerPort": 3000, "hostPort": 3000 }
],
"environment": [
{ "name": "NODE_ENV", "value": "production" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-web-app",
"awslogs-region": "ap-northeast-2"
}
}
}
],
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512"
}
하나의 Task Definition 안에 여러 컨테이너(사이드카 패턴)를 정의할 수 있습니다. 예를 들어 웹 애플리케이션 컨테이너와 로그 수집 에이전트 컨테이너를 함께 정의하는 방식입니다.
Task는 Task Definition을 기반으로 실제로 실행 중인 컨테이너(또는 컨테이너 묶음)입니다. Task Definition이 Class라면 Task는 Instance에 비유할 수 있습니다.
Task는 두 가지 방식으로 실행됩니다.
Service는 지정한 수의 Task가 항상 Cluster 안에서 실행되도록 유지하고 관리하는 컨트롤러입니다.
Service의 핵심 기능은 다음과 같습니다.
[개발자]
|
| 1. Dockerfile 수정 & docker build
| 2. ECR에 새 이미지 push
| 3. Task Definition 새 revision 등록
| 4. ECS Service 업데이트 (새 Task Definition 지정)
v
[ECS Service]
|
| 5. 새 Task 시작 (새 이미지 사용)
| 6. 헬스 체크 통과 확인
| 7. 기존 Task 종료
v
[사용자] <- 무중단으로 새 버전 서비스 중
ECS는 Kubernetes보다 학습 곡선이 낮고 AWS 서비스와의 통합이 자연스러워, Kubernetes의 복잡성이 필요하지 않은 팀에 적합한 선택입니다.