AWS ECS (Elastic Container Service)
컨테이너 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있도록 도와주는 완전 관리형(fully managed) 컨테이너 오케스트레이션 서비스
- Amazon ECS에는 세 가지 계층이 있다.
- Capacity : 컨테이너가 실행되는 인프라
- Controller : 컨테이너에서 실행되는 애플리케이션을 배포하고 관리
- Provisioning : 스케줄러와 함께 애플리케이션 및 컨테이너를 배포 및 관리하는 데 사용할 수 있는 도구
(출처 : https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)
Capacity
컨테이너가 실행되는 인프라
1. EC2 인스턴스
- 인스턴스 타입을 선택하고
- 인스턴스 개수를 결정하며
- capacity를 직접 관리 (CPU / 메모리, 스토리지, Auto Scaling 여부, 패치 / 재부팅 / 장애 대응 등)
2. Fargate
AWS 클라우드에서의 서버리스 방식
- Fargate는 사용한 만큼 비용을 지불하는(serverless, pay-as-you-go) 컴퓨팅 엔진입니다.
- Fargate를 사용하면 다음이 필요 없다:
- 서버 관리
- capacity 계획
- 컨테이너 워크로드 간 보안을 위한 격리 작업
3. ECS Managed Instances
가장 최근(25.09.30)에 출시됨 - 관련 문서
- AWS가 기반 인프라의 프로비저닝, 패치, 스케일링, 유지보수를 처리해주는 동안 여러 유형의 Amazon EC2 인스턴스에서 컨테이너화된 워크로드를 실행할 수 있도록 해준다.
- 쉽게 말해, EC2를 쓰긴 쓰는데, 서버 관리(설치·패치·증설·교체)는 AWS가 대신 해주고, 개발자는 ‘어떤 성능의 서버에서 컨테이너를 돌릴지만’ 고르면 된다.
- Amazon ECS Managed Instances를 사용하면 다음과 같은 특정 컴퓨팅 기능에 접근할 수 있다:
- GPU 가속
- 특정 CPU 아키텍처
- 높은 네트워크 성능
- 특수 목적 인스턴스 타입
- 예를 들면,
- 특정 컨테이너는 GPU 있는 서버에서 실행
- 또 다른 컨테이너는 고속 네트워크 서버에서 실행
- 즉, 컨테이너 실행 위치를 고급 사양으로 지정 가능
4.온프레미스 가상 머신(VM) 또는 서버
Amazon ECS Anywhere는 온프레미스 서버나 가상 머신(VM)과 같은 외부 인스턴스를 Amazon ECS 클러스터에 등록할 수 있도록 지원
비교 요약
| 구분 | ECS + EC2 | ECS + Managed Instances | ECS + Fargate |
|---|---|---|---|
| 개념 한 줄 요약 | EC2 위에 ECS를 올리고 서버를 직접 운영 | EC2는 쓰되 서버 운영은 AWS가 대행 | 서버 개념 없이 컨테이너만 실행 |
| 서버 관리 책임 | 사용자 | AWS | AWS |
| EC2 인스턴스 선택 | 직접 선택 | 선택 가능 | 불가 |
| 서버 패치 / 교체 | 직접 | AWS | AWS |
| Auto Scaling | 직접 구성 | AWS | 자동 |
| 서버 장애 대응 | 직접 | AWS | AWS |
| 서버 접근(SSH) | 가능 | 불가 | 불가 |
| CPU / 메모리 지정 | (EC2 단위) | (EC2 단위) | (Task 단위) |
| GPU 사용 | 가능 | 가능 | 불가 |
| 특수 인스턴스 | 가능 | 가능 | 불가 |
Provisioning
컨테이너를 실행하기 전에, ECS가 동작할 수 있도록 필요한 것들을 미리 만들어 두는 작업
- Provisioning : 시스템 자원(서버, 네트워크, 스토리지, 소프트웨어 등)을 사용할 수 있는 상태로 준비하고 설정하는 모든 절차
- ECS가 동작하려면 필요한 것들:
- 클러스터
- 태스크 정의
- (필요하면) 서비스
- 네트워크 설정
- IAM Role
- 로그 설정
- Capacity (EC2 / Fargate / Managed)
- 이걸 만들어 두는 행위 전체가 ECS 프로비저닝
Amazon ECS를 프로비저닝하기 위한 여러 가지 옵션
- AWS Management 콘솔
- Amazon ECS 리소스 액세스에 사용할 수 있는 웹 인터페이스를 제공
- AWS Command Line Interface(AWS CLI)
- Amazon ECS를 포함하여 다양한 AWS 서비스에 대한 명령을 제공
- AWS SDK
- 언어별 API를 제공하고 많은 연결 세부 정보를 처리
- AWS CDK
- 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 모델링하고 프로비저닝하는 데 사용할 수 있는 오픈 소스 소프트웨어 개발 프레임워크를 제공
ECS 구성 요소
1. Task Definition
컨테이너를 “어떻게 실행할지”에 대한 설계서
- 일반적으로 다음이 포함됨:
- Docker 이미지
- CPU / 메모리
- 환경 변수
- 포트
- 로그 설정
- 볼륨(EFS 등)
- 예시
1
2
3
4
5
6
Task Definition: api-server-task
- image: my-api-server:1.0
- cpu: 512
- memory: 1024
- port: 8080
- env: SPRING_PROFILES=prod
2. Cluster
컨테이너를 올려둘 실행 환경 (ECS를 쓰면 무조건 클러스터는 존재)
- 서버 묶음(EC2)일 수도 있고, 서버 개념 없는 Fargate일 수도 있음
- 예시
1
2
Cluster: api-cluster
- capacity: Fargate
3. Task
Task Definition을 바탕으로 실행된 컨테이너
- 실행되고, 일하고 끝나면 종료될 수도 있음
- 상태 있음 (RUNNING / STOPPED)
1
2
3
4
5
api-cluster
├─ Task #1 (RUNNING)
│ └─ API Server Container
└─ Task #2 (RUNNING)
└─ API Server Container
4. Service
Task를 지정한 개수만큼 유지해주는 관리자
- Task가 죽으면 자동으로 새 Task 실행
- 특징:
- 장기 실행
- Stateless 전제
- desired count 개념 존재
1
2
3
Service: api-server-service
- task definition: api-server-task
- desired count: 2
5. Account Settings
ECS 계정 전체에 적용되는 설정
- 개별 서비스나 태스크가 아니라 계정 전체 기준
- 특정 ECS 기능 활성화, 로그/권한 관련 설정 등
- ECS Exec 사용 여부
- IAM role 사용 설정
6. Cluster Auto Scaling
클러스터에 등록된 EC2 인스턴스 수를 자동 조절 (EC2 기반 ECS에서만 해당)
- 컨테이너는 늘어나는데, 올릴 서버가 부족할 때
- ex : 현재 EC2 2대 - Task 증가 → EC2 4대로 자동 확장
7. Service Auto Scaling
Service가 관리하는 Task 개수를 자동 조절 (CPU / 메모리 / 요청량 등을 기준으로)
- ex : CPU 70% 초과 → Task 2개 → 5개로 증가