서론
AWS ECS 10주년 글을 확인했습니다. ECS를 사용하고 있지만, 그 개념 자체에 대해서는 깊게 공부해 본 적이 없다고 생각합니다. 그리하여 ECS를 사용하면서 가볍게 지나갔던 개념들을 첫 번째로 넓고 얕게 정리해 보고, 순차적으로 궁금했던 점들을 찾아내 구체적으로 하나씩 정리하여 여러 글에 담아내고자 합니다.
1. AWS ECS
1.1 AWS ECS란?
- 컨테이너 어플리케이션을 쉽게 배포, 관리할 수 있도록 도와주는 완전 관리형 컨테이너 오케스트레이션 서비스
- AWS, ECR, Docker 등의 서드 파티 도구와 통합되어 사용
- 오토 스케일링을 사용하여 높은 확장성 및 안정성을 확보
1.2 AWS ECS 용량?
컨테이너가 실행되는 인프라를 ECS 용량이라고 합니다. 구성 옵션은 다음과 같습니다.
- AWS EC2 인스턴스
- AWS 서버리스 (AWS Fargate)
- Onpremise 서버 또는 VM (AWS ECS Anywhere)
1.3 AWS ECS 프로비저닝?
- 애플리케이션 및 컨테이너를 배포 및 관리하는 데 사용할 수 있는 도구
- 도구로는 management Console, CLI, SDK, Copilot, CDK가 존재
1.4 AWS ECS Application Lifecycle
AWS ECS Application은 아래와 같은 Lifecycle을 가지고 있습니다.
- AWS ECR에 사용할 도커 이미지를 적재합니다.
- 어떻게 어플리케이션을 배포할지 정의한 어플리케이션(Task Definition)과 함께 ECR에서 도커 이미지를 가져옵니다.
- ECS 태스크 또는 서비스를 선택해 TaskDefinition을 바탕으로 어플리케이션을 배포합니다.
- 이때 용량은 Fargate, EC2, EC2 Anywhere을 사용할 수 있습니다.
- 배포된 어플리케이션을 모니터링합니다.
2. AWS ECS Cluster
2.1 ECS Cluster?
ECS Cluster는 AWS ECS의 테스크 또는 서비스들의 하나로 묶은 논리적 그룹을 의미합니다. 조금 더 풀면 컨테이너를 띄우기 위한 인프라를 구성할 수 있습니다. 해당 인프라 설정을 위해 ECS Cluster는 용량으로 EC2, Fargate를 선택할 수 있습니다.
2.2 AWS Fargate VS AWS EC2
Fargate 특징
- 서버리스(Serverless) 방식으로 사용자가 EC2 인스턴스 불필요
- 태스크의 CPU 및 메모리 사용량을 기준으로 과금
- 단순한 컨테이너 배포, 리소스 스케일링 및 관리 부담이 적은 환경을 원할 때 적합
ECS 특징
- 사용자가 EC2 인스턴스를 사용하여 직접 관리하기에 EC2 인스턴스의 크기와 수를 직접 선택 및 관리
- 높은 제어권이 필요하거나 고정 리소스가 요구되는 환경
- Fargate 보다 요금이 상대적으로 저렴한 경우가 많음
2.3 Auto Scaling Group(ASG)
ASG 특징
- EC2 인스턴스를 자동으로 조정 및 관리할 수 있는 하나의 그룹
- 최소 및 최대 용량과, 원하는 용량을 지정하고 이 범위안에서 Scale in/out이 발생
- 설정한 용량 범위 내에서 인스턴의 증감은 사용자가 지정한 조건을 토대로 발생
- 인스턴스가 증가될 때는 시작 템플릿을 사용하여 똑같은 환경으로 서버가 복제
2.4 Containter Insights
ECS Container Insights 설정
- AWS Management Console 또는 AWS CLI를 사용해서 ECS Container Insights를 설정
- 아래는 ECS Cluster 생성 및 업데이트 시, AWS Management Console을 이용해 설정한 경우입니다.
ECS Container Insights 특징
- 컨테이너화된 애플리케이션 및 마이크로서비스의 지표 및 로그를 수집하고 집계하며 요약
- ECS, EKS, Amazon EC2의 Kubernetes 플랫폼에서 사용
- AWS Fargate에 배포된 클러스터 지표 수집을 지원
Container Insight를 통해 얻을 수 있는 정보들
- 클러스터 CPU 및 메모리 사용량 (전체 클러스터의 사용률)
- 서비스별 리소스 사용량(CPU, Memory)
- 테스크 및 서비스 상태(실행 및 대기 중인 테스크 수)
- 컨테이너별 리소스 사용량(CPU 사용률, 메모리 사용량, 네트워크 I/O
3. AWS ECS Service
3.1 AWS ECS Service?
- ECS Service는 ECS Task를 묶어서 관리하는 논리적인 작업 단위
- AWS ECS Service를 활용해 Running Task들을 관리
- 로드밸런싱, 오토 스케일링, 배포 방식을 설정할 수 있음
3.2 AWS ECS 컴퓨팅 구성
용량 공급자 전략
- 용량공급자 전략을 사용하면 태스크가 하나 또는 여러 용량 공급자에 배포
- 사용자 지정 사용 시 여러 공급자를 추가하여 사용 가능
시작 유형
- 시작 유형을 지정하는 경우 태스크가 Fargate 또는 클러스터에 수동으로 등록한 EC2 인스턴스에서 시작
- External 인스턴스를 선택하여 ECS Anywhere 기능을 사용할 수 있음
3.3 배포 구성
애플리케이션 유형
서비스
- 서비스를 사용하면 ECS 클러스터에서 지정된 수의 작업 정의 인스턴스를 동시에 실행하고 관리
- 장기 실행 무상태 서비스 및 애플리케이션에 적합
- 서비스 테스크 중 하나라도 실패하거나 중지되면 서비스 스케줄러가 테스크 정의의 다른 인스턴스를 시작하여 이를 대체
테스크
- 기능을 수행한 다음 중지하는 배치 작업과 같은 프로세스에 가장 적합
테스크 정의(Task Definition)
- Task Definition은 컨테이너 작업의 구성을 정의하는 JSON 템플릿
- ECS에서 실행할 컨테이너들은 작성된 템플릿을 기반으로 실행됨
패밀리(Family)
- 패밀리는 테스크 정의(Task Definition)의 이름을 지정
- 같은 이름을 사용하여 여러 버전을 생성
테스크 정의(Task Definition)는 다음과 같은 형태를 띠고 있습니다.
{
"family": "my-task-family",
"taskRoleArn": "arn:aws:iam::123456789012:role/ecs-task-role",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecs-execution-role",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "web-container",
"image": "nginx:latest",
"cpu": 256,
"memory": 512,
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"environment": [
{
"name": "ENVIRONMENT",
"value": "production"
}
]
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024"
}
서비스 유형
복제본
- 복제본 전략은 클러스터에 원하는 작업 수를 배치하고 유지
- 원하는 작업 수를 입력하여 해당 작업들을 여러 인스턴스에 분배해 실행하는 방식
데몬
- 사용자가 클러스터에 지정하는 작업 배치 제약을 모두 충족하는 각 활성 컨테이너 인스턴스에 한 작업씩 정확히 배포
- 즉 모든 인스턴스에 1개씩 작업을 실행
- 고로 데몬 전략을 사용하는 경우 원하는 태스크 수, 작업 배치 전략을 지정하거나 서비스 Auto Scaling 정책을 사용할 필요가 없음
배포 옵션
롤링 업데이트
- 실행 중인 테스크의 백분율을 지정하여 롤링 업데이트를 진행함
- 예를 들어 최소 실행 작업 비율이 100%이고, 최대 실행 작업 비율이 200%인 경우
- 테스크 2개 중 하나를 종료하여 새로운 테스크를 실행
- 새로운 테스크에 문제가 없으면 다른 이전 버전의 테스크에 대해 새로운 버전을 실행
블루/그린 배포
- ECS에서는 정통적인 블루/그린 배포, 그리고 카나리 배포 방식을 지원
- 카나리 방식 또한 다양한 방식으로 트래픽을 분산시키도록 지원
배포 실패 감지
- 롤링 업데이트 방식을 사용한 경우 배포 실패 감지 기능 활성화 가능
- Amazon ECS 배포 회로 차단기를 사용해 지정한 횟수만큼 배포에 실패한 경우 자동으로 이전
서비스 연결(ECS Service Connect)
- 클러스터 내부의 분산된 서비스 간의 연결을 손쉽게 구축할 수 있는 서비스
- 서비스 간 통신을 위해 로드밸런서나 서비스 디스커버리 설정을 하지 않아도 통신 가능
- AWS CloudMap에서 네임스페이스를 설정해, 다른 서비스와 연결할 수 있음.
로드밸런싱
- ECS Service에 의해 생성된 ECS Task에 트래픽 전달
- Target Group, 엔드포인트를 활용해 원하는 방식으로 라우팅 할 수 있음
테스크 배치
- 클러스터 내 인스턴스에 작업이 배치되는 방식을 사용자가 지정하도록 도와준다.
- ECS Service의 EC2를 이용할 때 선택할 수 있음
- AZ Balanced Spread - 작업을 가용 영역과 가용 영역의 컨테이너 인스턴스에 분산
- AZ Balanced BinPack - 작업을 가용 영역과 가용 메모리가 최소인 컨테이너 인스턴스에 분산
- 이외에도 사용자가 커스텀하여 배치 전략을 짤 수 있음
맺음말
여기까지 크게 ECS Cluster, ECS Service에 대해서 얕고 넓게 알아보았습니다. 이후 제가 좀 더 궁금하게 찾아보고 있는 ECS Task Definition 및 Service Connect와 같이 깊은 부분들은 파트를 지정해서 다시 정리하고자 합니다. 읽어주셔서 감사합니다.
'AWS' 카테고리의 다른 글
ECS Network Mode, ENI, VPC Endpoint 정리 (0) | 2025.03.29 |
---|---|
분산환경에서 SQS 리스너 서버 고려점 (0) | 2025.02.01 |
AWS Lambda Java With SnapStart (2) | 2024.06.24 |
Route 53, DNS 그리고 레코드 (2) | 2024.05.30 |
AWS VPC, CIDR, Bastion Host (1) | 2024.04.22 |