ECS는 컨테이너화된 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있게 해주는 완전관리형 컨테이너 오케스트레이션 서비스입니다.
쉽게 말하자면, 개발자는 애플리케이션 코드를 Docker 이미지로 만들어서 ECS에 올리기만 하면 컨테이너 운영에 필요한 복잡한 작업들(컨테이너 생성, 종료, 복제, 로드 밸런싱, 장애 복구 등)을 ECS가 자동으로 처리해줍니다.
특히 Fargate를 사용하면 서버 관리도 신경 쓸 필요 없이, 필요한 만큼만 리소스를 사용하고 그만큼의 비용만 지불하면 됩니다.
처음에는 AWS Lightsail을 사용하여 서비스를 배포하려 했습니다. Lightsail은 간단한 웹 애플리케이션을 배포하기에는 적합하지만, 다음과 같은 제한사항들이 존재합니다:
이러한 한계들이 존재하여 이를 극복하기 위해 ECS를 선택하게 되었습니다. ECS는 자동 스케일링, 장애 복구, 다양한 배포 전략을 기본적으로 지원하며, AWS의 다른 서비스들과도 긴밀하게 통합되어 있습니다.
Task Definition은 컨테이너를 실행하기 위해 정의한 명세서입니다. 어떤 도커 이미지를 사용할지, CPU/메모리 할당량, 환경 변수, 네트워크 설정, 볼륨 마운트 등 컨테이너 실행에 필요한 설정을 정의합니다. 이를 기반으로 실제 동작하는 컨테이너 인스턴스가 바로 Task입니다.
Service는 Task들의 수명주기를 관리합니다. 예를 들어, 특정 Task가 죽으면 자동으로 새로운 Task를 생성하여 지정된 개수를 유지합니다. 또한 ALB(Application Load Balancer)와 연동하여 트래픽을 분산시킬 수 있으며, CPU 사용량이나 메모리 사용량에 따른 자동 스케일링도 설정할 수 있습니다.
Task와 Service가 실행되는 논리적 그룹입니다. 수많은 컨테이너들을 개별적으로 관리하는 것은 매우 복잡하고 비효율적이므로 이들을 하나의 단위로 묶어서 관리할 필요가 있습니다. ECS Cluster는 이러한 목적으로 생성된 컨테이너들의 하나의 그룹이며, 이를 통해 리소스를 관리, 모니터링, 보안 설정 등을 수행할 수 있습니다.
지금까지 ECS란 무엇이고 왜 ECS를 선택하게 되었는지, 그리고 ECS의 주요 구성 요소들에 대해 알아보았습니다. 다음 글에서는 프로젝트의 인프라 아키텍처를 어떻게 구성했는지 간단하게 소개해보겠습니다.