클라우드/AWS

[클라우드] AWS ECS 개념과 구성요소

Cloud Engineer 2022. 3. 9. 17:03

1. 들어가기 전

과거에는 애플리케이션 규모가 크지 않았고, 이를 구동하는데 대규모의 컴퓨팅 자원이 필요하지 않았습니다. 따라서 한 개의 애플리케이션을 하나의 프로젝트로 구성하고 해당 애플리케이션을 구동하는데 WEB-WAS-DB 시스템을 구축하여 운영했습니다. 하지만 점점 애플리케이션 규모가 커지고 IT 기술이 발전함에 따라 여러 개의 서비스를 한 개의 애플리케이션으로 구성하며 다양한 문제점이 수반하게 됩니다. 예를 들면 소규모의 코드 수정 후 빌드를 하거나 다량의 코드를 한 번에 배포할 때 애플리케이션 전체를 테스트/빌드해야되기 때문에 엄청난 시간이 투입되게 되죠. 하나의 애플리케이션에 여러 개의 서비스를 구성하여 발생하는 문제점을 해결하기 위해 MSA(Micro Service Architecture)라는 아키텍처가 탄생하게 됩니다. MSA 기반의 시스템을 가장 효과적으로 구현할 수 있는 기술이 컨테이너 기술이구요. 본 포스팅에서는 AWS에서 제공하는 매니지드 컨테이너 서비스인 ECS(Elastic Container Service)에 대해 알아보겠습니다.

1.1. 사전지식

  • 컨테이너/이미지와 도커에 대한 이해
  • 클라우드에 대한 기초적인 이해

2. AWS ECS란?

2.1. 개념

  • 확장성이 뛰어나고 빠른 컨테이너 관리 서비스
  • AWS 사용자는 ECS 콘솔에서 직접 클러스터를 생성하고 컨테이너를 실행/중지 및 관리

2.2. 실행 유형

2.2.1. Fargate 모델 (CaaS)

Serverless 기반 종량제(구독형) 옵션입니다. CaaS(Container as a Service)라 생각하면 되며, 사용자가 인프라를 관리할 필요 없이 즉시 컨테이너를 구동할 수 있습니다. 즉, 클라우드 사업자가 Middleware 단까지 직접 관리를 해주며 사용자는 원할 때 Docker-Compose 등을 통해 컨테이너를 구동시킬 수 있는 Runtime 환경을 이용할 수 있습니다.

2.2.2. EC2 모델 (IaaS)

사용자가 직접 클러스터에서 EC2 인스턴스를 구성 및 배포하여 컨테이너를 실행하는 옵션입니다. IaaS(Infrastructure as a Service)라 생각하면 되며, 클라우드 사업자가 가상화까지 직접 관리해주고 사용자는 컨테이너 Runtime 환경을 구성에 필요한 EC2 노드를 생성/구성 후 컨테이너 클러스터를 구축합니다.

2.3. 구성요소

2.3.1. 클러스터

작업(task) 또는 서비스의 논리적 그룹입니다. 클러스터를 통해 독립적인 애플리케이션을 구축할 수 있습니다. 1개 이상의 EC2 노드가 필요하며 다수의 EC2 노드를 하나의 논리적 그룹으로 구성하고 해당 클러스터에서 컨테이너를 구동할 수 있습니다. Fargate의 경우에는 사용자가 EC2 노드를 신경쓰지 않아도 됩니다.

2.3.2. 컨테이너와 이미지

이미지는 일반적으로 Dockerfile에서 빌드됩니다. 빌드된 이미지는 AWS ECR, Docker Hub 등과 같은 Docker Registry에 저장되며 사용자는 클러스터에 저장된 이미지를 불러와 컨테이너로 구동시킬 수 있습니다.

2.3.3. 작업 정의 (Task Definition)

JSON 파일을 기반으로 여러 개의 컨테이너를 정의합니다. Docker-Compose를 떠올리시면 되며, 1개의 작업 정의 파일에 최대 10개의 컨테이너를 정의할 수 있습니다. 본 파일을 통해 컨테이너 통신에 사용될 포트, 컨테이너에서 사용할 볼륨 및 리소스(CPU, Memory 등)을 지정할 수 있습니다.

2.3.4. 작업 (Task)

클러스터 내에서 JSON 파일로 작성한 작업 정의를 인스턴스화한 것으로, 사용자는 클러스터에서 구동시킬 작업 개수를 지정할 수 있습니다. "Docker-compose에 작성한 파일을 클러스터에 반영하여 컨테이너로 구동시키겠다"라고 생각하시면 됩니다.

2.3.5. 서비스 (Service)

클러스터에 지정된 개수 만큼의 작업을 동시에 실행 및 관리할 수 있게 해주는 스케줄러이며, 배포 방식(롤링 업데이트, 블루/그린 배포, 카나리 등), 네트워크 구성, 로드밸런싱, Auto-Scaling 등의 기능을 적용할 수 있게 해줍니다.

3. 마무리

AWS ECS를 통해 컨테이너 시스템을 구성할 경우 사용자는 아래과 같은 순서로 구성됩니다.

* 그림을 참고하며 보시면 이해에 도움이 됩니다.

  1. AWS ECS 콘솔에서 클러스터를 생성
  2. Dockerfile을 통해 빌드된 초기 이미지를 Docker Registry에 Push
  3. 작업 정의(Task Definition)를 작성 (GUI 또는 JSON 파일, Docker-Compose와 비슷한 역할)
  4. 작업 생성 (작업 정의에 명세된 내용을 적용하여 컨테이너화)
  5. 서비스 구성 (컨테이너 버전 관리를 위한 배포 방식, 로드밸런싱, 오토스케일링, 노드 개수 등)

AWS ECS 아키텍처 (출처: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/welcome-features.html)