Skip to main content

Amazon ECS

Amazon ECS(Amazon Elastic Container Service)란, 배포 및 운영, 그리고 컨테이너 서비스를 확장을 가능하게 해주는 fully-managed 서비스이다.

주요 구성

1. Capacity

컨테이너가 실행되는 인프라 구조를 가리킨다. 예를 들어, Amazon EC2, Serverless(AWS Fargate), 온프레미스 가상 머신 등으로 구성 된다.

이때, default mode는 Amazon Fargate인데, 만약 특정 기능(GPU 등)이 필요할 경우에는 Amazon EC2에 배포해야 한다.

또는, Amazon Fargate에서는 Host Bind Mounts를 지원하지 않기 때문에, Dockerfile에서 다음과 같은 기능을 사용할 수 없다.

volumes:
- ./local/db.conf:/etc/db.conf
info

Fargate 인프라는 프리티어 적용이 안 된다.

2. Controller

컨테이너에서 실행되는 애플리케이션을 배포 및 운영을 담당한다.

3. Provisioning

애플리케이션과 컨테이너의 배포 및 운영 시 스케쥴링 등의 도구를 제공하는 인터페이스이다. 예를 들어, AWS CLI, AWS SDK 등으로 구성된다.


동작 방식

이미지 빌드 및 저장

read-only template인 이미지로부터 컨테이너가 생성되는데, 이때 이미지는 주로 Dockerfile로부터 생선된다.

Dockerfile은 plaintext 파일이며, 이곳에 작성되는 모든 구성 요소들은 컨테이너에 포함된다.

이미지가 빌드되고 나면, Amazon ECR라고 하는 레지스트리에 저장되어 다운로드 받을 수 있게 된다.

태스크 정의 및 배포

이미지가 빌드 되고 나면, Amazon ECS task definition을 작성하게 되는데, 이때부터 Controller에 해당하는 Amazon ECS Scheduler가 관리하게 된다. 여기에서 애플리케이션 실행에 필요한 파라미터나 운영체제, 포트 등을 정할 수 있다.

태스크가 정의되고 나면 클러스터에 태스크를 배포하게 된다. 이때 태스크 또는 서비스가 등록된 Capacity에서 동작하게 되는데, 이 논리적인 그룹 단위를 클러스터라고 한다.

태스크 정의는 default인 경우, 루트 디렉토리의 ecs-params.yml(또는 ecs-params.json)을 찾는다. 이는 다음과 같이 구성할 수 있다.

# Check https://github.com/aws/amazon-ecs-cli/blob/mainline/README.md

version: 1

# Generates new task definition version
task_definition:
ecs_network_mode: bridge
services:
my_service:
cpu_shares: 1024
mem_limit: 950m

태스크 실행

클러스터 내의 각 태스크를 실행할 때, Amazon ECS Scheduler에 의해 특정 태스크가 실패하거나 중단되면, 다른 인스턴스를 실행해 태스크 정의 파일을 따르도록 한다.


서비스

ECS Service는 태스크 정의에 정의된 인스턴스의 개수만큼 관리하고 실행하는 역할을 한다. 만약 특정 인스턴스 실행에 실패할 경우, ECS Scheduler가 다른 인스턴스로 교체하도록 한다.

이러한 점에서 Auto Scaling과 유사하지만, 인스턴스의 전체 리소스 크기를 늘리거나 줄이지 않고 특정 수의 리소스만큼 유지시킨다.

Related Links