ECS란(Elastic Container Service)?
ECS는 *클러스터에서 컨테이너를 쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스이다.
*클러스터 : 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합이다.
쉽게 말해 여러 대의 컴퓨터 집합으로 컨테이너의 생명주기를 관리해준다.
시작 유형(Launch Type)
ECS서비스를 이용하기 위해 클러스터를 생성하면 시작 유형(Launch Type)을 선택해야한다.
말그대로 클러스터에 포함될 컴퓨터를 어떤 타입으로 선택할지 고르는것이다. 두 가지 모두 선택한다면 클러스터 내에서 Fargate와 EC2 인스턴스를 함께 사용할 수 있게된다.
대표적으로 EC2와 Fargate가 있다.
- EC2(Elastic Compute Cloud) : AWS 한번만 해보면 모두가 아는 그 유명한 EC2이다. 가상 서버를 제공한다.
- Fargate : EC2 서버를 관리할 필요 없이 컨테이너를 실행하기 위해 ECS에 사용할 수 있는 기술이다. 쉽게말해 따로 서버를 만들지 않고 간단하게 실행할 수 있게해준다.
위 설명만 봤을때 EC2를 굳이 왜쓰나 싶지만, 정책과 관련한 문제가 있을 수 있고, GPU사용을 필요로 할시 Fargate는 해당 기능을 지원하지 않는다.
위 사진은 ECS가 EC2와 Fargate 두 가지 Launch Type을 이용하여 컨테이너를 관리해주는 모습을 나타낸다.
작업 정의(Task Definition)
작업 정의는 클러스터 내에서 실행되는 컨테이너의 구성과 설정을 정의한다.
이 작업 정의를 토대로 컨테이너가 클러스터에서 실행되며 , 작업 정의를 설정하면 추후에 클러스터에 배포하여 해당 클러스터에서 실행되게 할 수 있다.
작업 정의에선 빌드할 도커이미지를 설정할 수 있으며 보통 ECR을 사용한다면 ECR의 도커 이미지 URL을 입력받아 사용한다.
또한 작업 정의에선 컨테이너 이미지와 리소스(메모리나 CPU등), 네트워크 같은 설정이 포함되어 있다.
* 권한 관련 참고사항
참고로 작업 정의 설정시 Task execution role 즉 권한을 설정하는 부분이 있는데
ECS를 처음 사용하는 경우 escTaskExcutionRole 권한이 없기 때문에 Create new role을 선택하면 자동으로 escTaskExcutionRole IAM 권한이 생성된다.
서비스(Service)
서비스 생성시 배포 구성에서 어플리케이션 유형을 선택할 수 있는데 유형은 서비스와 태스크 두 가지가 있다.
Application type에 있는 서비스를 선택했을때, 이것이 ECS에서 말하는 서비스를 의미하며
서비스는 미리 만든 작업 정의를 기반으로 한 논리적인 개념으로, 여러 작업을 실행하고 관리하는 역할을 한다.
간단하게 태스크를 관리한다고 보면된다.
예를 들어 Desired tasks를 2개로 생성시 하나가 꺼졌다고 가정하면 다른 하나의 태스크를 가져다 사용할 수 있게한다.
이해가 되지않는다면 가장 아래의 그림을 참조하면 된다.
태스크 선택시 작업은 단일로 만들어져 한 번만 실행되고, 서비스로 만들어지지 않는다.
또한 자동으로 복제되거나 유지되지 않기에 별도의 관리나 스케일링이 없다.
또한 서비스 생성시 로드 밸런싱을 선택할 수 있는데 이를 사용하여 서비스의 네트워크 트래픽을 분산시킬 수 있다.
정리
하나의 그림으로 표현하자면 아래와 같다.
뭔가 만들고나니 복잡해 보이지만 최대한 알기 쉽게 색을 입혀봤다.😅
1. 클러스터는 여러대의 서버로 이루어져 있고 그 서버는 Fargate 또는 EC2가 될 수 있다.
2. 작업 정의(Task Definitions)는 컨테이너 환경을 구성하고 가져올 도커 이미지의 경로를 설정할 수 있다.
3. 작업 정의(Task Definitions)를 바탕으로 클러스터에서 서비스(Service) 또는 작업(Task)을 생성할 수 있다.
여기서 작업(Task)은 하나의 컨테이너 인스턴스를 의미한다. 간단하게 작업당 하나의 컨테이너!
4. 서비스(Service)는 작업(Task)들을 관리해주는 기능이며 Replica같은 기능을 지원해준다.
참고로 위에선 서비스가 동일한 인스턴스 내에서 task를 관리해주는 경우이다. 이는 서비스 구성시 Service type - Deamon의 경우이며, Replica의 경우 다른 EC2에도 동일한 task가 복제된다.
💡ECR에 빌드된 이미지가 들어있는것 까진 알겠는데 ECR에 있는 이미지를 PULL하고 실행하는 주체는 누구고 언제 일어날까?
실제 이미지 pull 및 컨테이너 실행은 ECS 에이전트에 의해 이루어진다.
ECS 에이전트는 클러스터 내부에 있는 서버에 모두 설치되어 있으며, 작업 정의에 명시된대로 ECR에서 이미지를 가져와 컨테이너를 실행한다.
실행 시점은 작업(Task)을 시작할 때, 위 작업을 실행하게 된다.
결론적으로 ECS를 사용하게 되면 단 하나의 서버도 구성하지 않고 관리,패치,리부팅할 필요 없이 간단한 컨테이너 어플리케이션을 배포할 수 있다.
💡 만약 새로운 소스 반영으로 도커를 재시작하고 싶다면?
다시 새로운 작업 정의를 생성하여 ECR의 이미지 경로를 지정해주고 작업 정의를 토대로 작업(Task)을 생성하면 된다.
💡자동으로 배포할순 없을까?
이는 AWS에서 제공하는 파이프라인을 이용하면 된다.
소스가 수정될시 CodeCommit에서 변경을 감지하게 되고, 파이프라인 설정의 Deploy stage에서 ECS로 설정해준다면 자동화할 수 있다.