AWS ECS란?
AWS ECS(Elastic Container Service)는 컨테이너화된 애플리케이션을 정의하고 배포, 확장, 운영, 실행하는 관리하는 완전 관리형 컨테이너 오케스트레이션 서비스입니다.
ECS 구성 요소
ECS의 구성 요소는 태스크 정의, 태스크, 서비스, 클러스터 .. 등으로 나뉩니다.
Task Definition (태스크 정의)
태스크 정의는 컨테이너 설정에 필요한 설정을 JSON으로 정의한 문서입니다. 컨테이너 이미지, 리소스, 네트워킹, 볼륨 등을 정의할 수 있고, 이를 기반으로 ECS가 태스크를 실행합니다. 다음은 Task Definition JSON 예제입니다.
{
"family": "my-app-task", // 태스크 정의 이름
"networkMode": "awsvpc", // 네트워크 모드
"requiresCompatibilities": ["FARGATE"], // 실행 환경
"cpu": "256", // CPU
"memory": "512", // 메모리 (MB)
"executionRoleArn": "arn:aws:iam::ACCOUNT_ID:role/taskExecutionRole", // 실행 시 role
"containerDefinitions": [
{
"name": "web-server",
"image": "nginx:latest",
"cpu": 128, // 컨테이너별 CPU
"memory": 256, // 컨테이너별 메모리
"essential": true, // 필수 컨테이너 여부
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"environment": [ // 환경 변수
{
"name": "NODE_ENV",
"value": "production"
}
],
"secrets": [ // 환경 변수 (Secret Key)
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:ssm:REGION:ACCOUNT_ID:parameter/db-password"
}
]
}
]
}
네트워크 모드는 다음을 사용할 수 있습니다.
- awsvpc : 각 태스크가 고유한 ENI를 가짐
- bridge : Docker의 기본 브릿지 네트워크
- host : 호스트의 네트워크 사용
- none : 네트워킹 비활성화
Task (태스크)
태스크는 태스크 정의의 실행 인스턴스입니다. 즉, 실제로 실행되는 컨테이너들의 그룹입니다. 태스크는 다음 4가지 상태를 가집니다.
- Pending : 태스크가 생성되고 리소스를 할당받기 위해 대기하는 상태
- Running : 컨테이너가 성공적으로 시작된 상태
- Stopping : 태스크 중지가 진행되고 있는 상태
- Stopped : 모든 컨테이너가 중지된 상태
태스크는 특정 태스크 정의를 기반으로 실행되는 1회성 인스턴스이며, 정의된 컨테이너들이 함께 실행됩니다.
Service (서비스)
지정된 수의 태스크가 항상 실행되도록 보장하는 관리 레이어입니다. 원하는 태스크의 수를 유지할 수 있고, ALB/NLB와 통합하여 트래픽을 분산시키는 로드밸런싱 기능도 제공합니다. 또한 무중단 배포 (기본 : 롤링 배포) 및 오토스케일링을 지원합니다. CodeDeply 서비스를 사용하면 블루/그린 배포또한 가능합니다.
Cluster (클러스터)
Task와 Service가 논리적으로 모이는 공간입니다. 이는 여러 가용 영역에 걸쳐 생성이 가능합니다. 태스크 실행 시 Fargate, EC2 또는 둘을 모두 사용할 수 있으며, 이를 Capacity Provider를 통해 관리할 수 있습니다. 다시 말해 하나의 클러스터에서 fargate와 EC2를 같이 사용할 수 있습니다. Fargate 기반 클러스터는 서버리스 기반이라 인프라 관리가 필요하지 않고, 사용한 리소스만큼 과금량이 부여됩니다. 또한 하나의 클러스터에는 여러 서비스가 존재할 수 있습니다.
Comments
목차