목적
AWS ECS를 사용하여 서비스를 배포할 때 Auto Scailing을 적용하는 방법에 대해 기술한다.
배경지식
먼저 ECS가 어떠한 형태로 돌아가는지 부터 살펴봐야 한다.
ECS가 돌아가기 위해서는 다음과 같은 4개가 필요하다.
- Cluster
- Service
- Task Definition
- EC2 Instance(Launched by Cluster)
기본적으로 Cluster부터 생성한다.
Cluster를 생성할 때 원하는 인스턴스의 개수를 정할 수 있는데, 이때 정의한 개수만큼 클러스터 생성과 동시에 EC2 Instance가 구동된다.
Service는 정의한 Task Definition을 묶어서 실행해준다고 보면 될 것 같다.
Task Definition은 그냥 쉽게 생각해서 Docker-compose라고 생각해도 될 것 같다. (개인적인 생각)
보통 Task Definition을 ecs-cli를 통해 생성할 때 아래와 같은 명령어를 사용한다.
ecs-cli compose --project-name 작업정의이름 --file docker-compose-ecs.yml --ecs-params ecs-params.yml --region ap-northeast-2 create --launch-type EC2
docker-compose.yml은 일반적인 도커 컴포즈의 형태와 같으므로 생략하고, ecs-params.yml를 살펴본다.
version: 1
task_definition:
task_size:
cpu_limit: 512
mem_limit: 0.5GB
services:
web:
cpu_shares: 100
mem_limit: 208435456
nginx:
cpu_shares: 100
mem_limit: 208435456
형태는 위와 같은 형태이다.
딱보면 알겠지만 docker-compose-ecs.yml에 web, nginx에 관해 정의되어있다.
정의되어 있는 서비스들과 Task Definition이 가져갈 메모리, CPU에 대해서 정의해주는 것이다.
이렇게 정의한 Task Definition들이 Service안에서 하나의 덩어리로 돌아간다고 생각하면 이해가 빠를것이다.
ECS Auto Scailing 적용 방법
먼저 ECS에서 Auto Scailing을 적용하는 방법은 다음과 같이 2가지가 있다.
- 하나의 인스턴스에서 여러개의 컨테이너를 스케일링 하는 방법
- 하나의 인스턴스에서는 하나의 컨테이너만을 구동시키고 인스턴스 자체를 스케일링 하는 방법
1번의 방법으로 구현하면 항상 스케일링을 위한 여유분의 리소스가 존재해야 하는 단점이 있다. (리소스 낭비)
2번의 방법으로 구현하면 인스턴스가 구동될때까지 어느정도 시간이 걸리기 때문에 그동안은 스케일링을 적용할 수 없는 단점이 있다.
여러곳에서 정보를 찾아본 결과, 각 방법들의 장단점으로 인해 어느 하나의 방법이 아닌 적절히 섞어서 사용하는 형태가 이상적이라는 답변이 있었다.
하지만 본 포스팅에서는 2번의 방법을 채택할 것이다.
스케일업하는 단계를 엄격하게(50% 정도로) 지정하여 미리 인스턴스를 구동시키는 방법으로 진행하면 어느정도 해결법이 될 것이라고 판단했기 때문이다.
(물론 서비스 폭주상태인 경우 대처가 힘들겠지만, 이는 1+2번의 혼합으로 가도 마찬가지일것)
시작하기전에 이것부터 알고가자.
서비스와 인스턴스 모두에 Auto Scailing을 걸어두어야 한다. 서비스만 걸어둘경우 여유분의 인스턴스가 존재하지 않기 때문에 새로운 작업정의를 실행할 수 없고, 인스턴스만 걸어둘경우 인스턴스는 여유분이 구동되지만 새로운 작업정의가 자동으로 붙지 않는다.
먼저 Scail in/out에 대한 경보를 설정해줘야 한다.
CloudWatch 콘솔로 들어가서 경보 생성을 누른다.
지표 선택을 누르고 ECS - ClusterName으로 들어간다.
그리고 우리가 생성한 클러스터의 이름들중에 지표 이름이 CPUUtilization인것을 체크하고 지표 선택 버튼을 누른다.
(Cluster는 미리 생성해뒀다고 가정한다)
조건을 걸어준다.
위같은 경우 CPU사용률이 50프로 이상일때로 걸어뒀다.
경보에 대한 추가설정은 원하면 설정한다.
그리고 경보를 생성한다.
마찬가지로 사용률이 낮을때의 경보도 생성해준다.
이제 EC2콘솔 - AutoScailing Group으로 들어간다.
그룹 목록을 확인해보면 클러스터 생성 시 같이 생성된 스케일링 그룹이 존재할 것이다.
클릭하고 작업 - 편집을 누른다.
대상 그룹에 Application Load Balancer의 그룹을 지정하고 상태 검사 유예기간은 300정도로 잡아준다.
그리고 목표 용량, 최소, 최대를 설정하고 저장해준다.
그리고 클릭한 그대로 아래쪽에서 조정 정책 탭으로 이동한다.
정책 추가 버튼을 누르고 단계를 사용하여 조정 정책 생성을 누른다.
정책 실행 요건에 위에서 생성한 정책을 선택하고 해당 경보 발생 시 몇개를 추가/제거할것인지 명시하고 생성 버튼을 누른다.
다음으로 서비스에도 걸어줘야한다.
ECS콘솔에서 기존에 생성한 클러스터를 누르고 서비스 탭으로 이동, 생성을 누른다.
서비스 생성 단계3에서 Auto Scailing 설정이 나온다.
서비스 Auto Scaling을 구성하여 원하는 서비스 개수를 조정합니다. 를 선택한다.
그리고 조정 정책 유형에서 단계 조정을 선택하고 규모 확대, 축소 시 우리가 위에서 생성한 경보를 엮어준다.
또한 조정 작업부분에서 몇개의 작업을 추가/제거할지 선택해준다.
위같이 설정하면 ECS에 Auto Scailing 설정이 완료된다.
'Coding > DevOps' 카테고리의 다른 글
Django + Uwsgi + Supervisor + Nginx Docker-compose와 연동하는 방법 (0) | 2019.02.26 |
---|---|
AWS SecretManager를 이용한 도커 환경변수 적용 방법 (0) | 2019.02.26 |
AWS Lambda + API Gateway로 API 만드는 방법 (0) | 2019.01.21 |
ECS Multiple Instance구동 및 ALB적용 방법 (0) | 2019.01.15 |
Docker Hot reload 적용하는 방법 (0) | 2019.01.08 |