AWS에서 배포할 때 보통 조합으로 구성해서 배포를 해봤었다.
그리고 로컬에서 Docker는 한 번 연습해본 정도였는데,
AWS ECS 라는 걸 찾아보고
왜? 어떻게? 쓰는지?
Docker를 사용하면, 우리가 만든 앱을 컨테이너라는 작은 단위로 포장해서 실행할 수 있게되는데
하지만 컨테이너를 단순히 실행하는 걸 넘어서,
서비스가 커지고 컨테이너가 많아질수록
누가 배포해주고, 죽으면 살리고, 확장도 해주는 자동화된 시스템이 필요하게 됨
이걸 해주는 게 바로 오케스트레이션, 그리고 AWS에서는 ECS이다.
ECS(Amazon Elastic Container Service)는
AWS에서 제공하는 Docker 컨테이너 전용 배포/관리 서비스
Docker로 만든 앱을 AWS에서 자동으로 배포하고, 실행하고, 확장하고, 복구까지 해주는 도구
| 비교 항목 | EC2 | ECS |
|---|---|---|
| 직접 서버 띄움 | ✅ 직접 띄움 | ❌ 필요 없음 (Fargate 사용 시) |
| 앱 실행 방식 | 코드 직접 실행 (Node, PM2 등) | Docker 이미지로 실행 |
| 확장/배포/복구 | 수동 관리 | 자동 관리 (스케일링, 롤링 업데이트 등) |
| 용도 | 가상 머신 | 컨테이너 오케스트레이션 도구 |
ECS는 단순히 컨테이너 실행기 이상
이런 것들을 자동으로 처리해줘요:
ECS에는 2가지 실행 방식이 있습니다:
| 방식 | 설명 |
|---|---|
| EC2 방식 | EC2 서버 위에 컨테이너를 올림 (서버 직접 관리 필요) |
| Fargate 방식 | 서버 없이 컨테이너만 실행 (완전 서버리스) ← 요즘 대세 |
고급 프로젝트에서 배포했던 Express 앱 기준:
project/
├── app.js
├── package.json
└── Dockerfile
이 앱을 Docker 이미지로 만들고 ECS에 배포하면 다음과 같은 구조로 실행
ECS Cluster
└── Service (예: express-service)
└── Task (예: express-task)
└── Container (예: my-express-app:latest)
express-service가 3개의 Task를 유지하도록 구성했다고 가정하면:
[express-service]
├─ Task 1 → [my-express-app Container]
├─ Task 2 → [my-express-app Container]
└─ Task 3 → [my-express-app Container]
[브라우저 요청]
↓
[로드 밸런서(ALB)]
↓
[ECS 서비스]
↓
[Express 컨테이너(app.js)]
/api 요청을 보내면