Hide

목적

ECS를 사용하여 서비스를 구성할 때 여러개의 인스턴스를 구동하고 해당 인스턴스를 ALB를 통해 로드밸런싱 해주는 방법에 대해 기술한다.

전제 조건

구현에서 사용할 이미지들은 모두 ECR에 푸시해놓은 상태라고 가정한다.

본문에서는 docker-compose를 통해 이미지를 빌드하고 푸시하는 과정에 대해서는 생략한다.

사전 지식

ALB는 설정해놓은 로드밸런싱 그룹에 인스턴스가 포함되면 자동으로 해당 인스턴스도 라우팅 목록에 포함시킨다.

따라서 우리는 ECS 서비스를 생성할 때 미리 생성해놓은 로드밸런서와 로드밸런싱 그룹을 설정해줘야 한다.

추가적으로 배포할 때 어떠한 형태로 진행하는지 미리 숙지할 필요가 있다.

2가지의 방법이 존재할 것이다.


방법 1

  1. 기존에 A와 B라는 인스턴스가 돌고 있다고 가정한다.
  2. C, D인스턴스를 새로 구동하고 업데이트된 소스를 배포한다.
  3. C, D인스턴스에 대한 오류가 없다면 로드밸런싱 그룹에 추가한다.
  4. A, B에 대한 연결을 끊는다.


방법 2

  1. 기존에 A와 B라는 인스턴스가 돌고 있다고 가정한다.
  2. B를 로드밸런싱 그룹에서 제외하여 라우팅을 끊고 업데이트된 소스를 배포한다.
  3. B인스턴스에 대한 오류가 없다면 로드밸런싱 그룹에 추가한다.
  4. A를 로드밸런싱 그룹에서 제외하여 라우팅을 끊고 업데이트된 소스를 배포한다.
  5. A인스턴스에 대한 오류가 없다면 로드밸런싱 그룹에 추가한다.


여기서 우리는 방법 2를 통해 진행할 예정이다.

클러스터(Cluster) 생성

ECS콘솔 - 클러스터로 들어가서 생성을 누르면 3가지의 클러스터 템플릿이 존재한다.

첫번째는 Fargate전용이고 2번째는 Linux이미지, 3번째는 Windows이미지이다.

2번째를 선택하고 다음 단계를 누른다.


클러스터 이름에는 원하는 이름을 적는다.

아래쪽에 있는 키페어 부분에 사용하는 키페어를 골라줘야 나중에 SSH로 붙을 수 있다.


VPC는 Default VPC를 사용했다.

해당 VPC를 선택하면 아래에 서브넷도 2가지가 나올텐데, 2가지의 서브넷을 모두 추가해준다.

그리고 보안그룹도 Default 보안그룹을 선택했다.

나머지는 건들지 않고 생성을 누르면 클러스터가 생성된다.

작업 정의(Task Definition) 생성

이제 작업 정의를 생성해줘야 한다.

웹을 통해서도 작업정의를 실행할 수 있지만 우리는 json파일로 따로 작성을 해준 후 ecs-cli를 통해 등록해줄것이다.

웹을 통해서 작업정의를 생성할때는 depends_on등을 설정할 수 없는 것 같다. (정확한것은 아님)

현재 내가 올리는 서비스는 파이썬 웹서버가 정상적으로 구동된 이후에 Nginx가 구동되야하는 형태인데,

depends_on이 설정되지 않으면 순서없이 동시에 서비스가 떠버리기 때문에 오류가 발생한다.

먼저 ecs-params.yml파일을 생성하고 아래의 내용을 채워넣는다.


version: 1
task_definition:
services:
web_project:
cpu_shares: 100
mem_limit: 208435456
nginx:
cpu_shares: 100
mem_limit: 208435456


그리고 ecs-docker-compose.yml파일을 생성하고 아래의 내용을 채워넣는다.


version: "3"
services:
web_project:
image: 이미지 ECR주소
ports:
- "5000:5000"
logging:
driver: awslogs
options:
awslogs-group: web_project
awslogs-region: ap-northeast-2
awslogs-stream-prefix: web_project

nginx:
image: 이미지 ECR주소
ports:
- "80:80"
links:
- web_project
logging:
driver: awslogs
options:
awslogs-group: web_project
awslogs-region: ap-northeast-2
awslogs-stream-prefix: web_project

기존에 사용하던 docker-compose.yml파일의 문법과 거의 유사하다고 보면 된다.

이제 아래의 명령어를 사용하여 위 파일 2개를 통해 작업정의를 생성한다.


ecs-cli compose --project-name 태스크이름 --file ecs-docker-compose.yml --ecs-params ecs-params.yml --region ap-northeast-2 create --launch-type EC2


태스크 이름을 채워넣고 위 명령어를 실행하면 작업정의 등록이 완료된다.

로드 밸런서(Load Balancer) 생성

EC2 콘솔로 들어가서 왼쪽 메뉴를 통해 로드 밸런싱 - 로드밸런서로 들어간다.


생성을 누르면 3가지 종류의 로드 밸런서를 고를 수 있다.

제일 왼쪽에 있는 ALB(Application Load Balancer)를 선택한다.


이름을 적고 아래쪽에 있는 가용영역에서 VPC를 선택한다. (여기서는 Default VPC를 선택)

그러면 해당 VPC와 연결된 서브넷 2개가 나올텐데, 빨간박스로 표시해놓은 체크박스를 모두 체크하고 다음으로 넘어간다.


2페이지는 보안 구성에 대한 부분으로 그냥 다음으로 넘어간다.

3페이지에서는 사용할 보안 그룹을 선택하고 다음으로 넘어간다. (여기서는 Default 보안그룹을 선택)


새 대상 그룹을 선택하고 원하는 그룹 이름을 적는다.

그리고 상태 검사의 경로부분에 200 OK Response가 뜨는 경로를 적고 다음으로 넘어간다.


5페이지는 대상을 등록하는 부분인데 일단은 아무 인스턴스도 등록하지 않고 다음으로 넘어간 후 생성한다.

서비스(Service) 생성

ECS - Cluster로 들어가면 우리가 위에서 생성한 클러스터가 보인다.

해당 클러스터를 클릭한 후 


생성을 누른다.


시작 유형은 EC2로 설정한다.

아마 작업 정의, 클러스터는 자동으로 설정되어 있을 것이다.

서비스 이름은 원하는 이름을 적고 서비스 유형은 REPLICA로 설정한다.

(Daemon유형은 새로운 인스턴스를 추가하는 형태로만 Scale up할 수 있다. 우리는 Auto Scailing을 할 예정이므로 REPLICA를 선택)

작업 개수는 일단 1개로 설정한다.


아래쪽은 건드리지 않고 다음 단계를 누른다.


여기서 이제 우리가 위에서 생성한 로드밸런서를 등록시켜줘야 한다.

Application Load Balancer에 체크한다.


IAM역할, ELB이름이 자동으로 선택되어 있을 것이다.

로드를 밸런싱할 컨테이너를 선택하고 ELB에 추가 버튼을 누른다. (여기서는 nginx를 선택)

그러면 아래쪽에 페이지가 조금 확장될텐데, 여기서 대상 그룹 이름에 우리가 위에서 생성한 대상 그룹을 선택한다.

아래쪽에 있는 서비스 검색 통합 활성화는 체크 해제하고 다음 단계 버튼을 누른다.


오토 스케일링 설정을 하는 부분이다.

일단은 원하는 서비스 개수를 조정하지 마십시오. 에 체크하고 다음 단계를 누른다.

(이 부분은 원하는 대로 설정하면 된다)

그리고 서비스 보기를 누르면 우리가 생성한 서비스가 보인다.

Multiple Instance

글의 처음에서 설명했던 것 처럼 배포를 위해서는 또다른 인스턴스를 새로 구동해줘야 한다.

ECS콘솔 - 생성한 클러스터를 클릭한다음 ECS 인스턴스 탭을 누른다.


조정할 인스턴스에 체크한다음 ECS 인스턴스 조정 버튼을 누르고 숫자를 하나 증가시킨다.

그리고 1분정도 기다리고 새로고침을 해보면 또 하나의 새로운 인스턴스가 추가된 모습을 볼 수 있다.

업데이트 된 상태를 적용하려면 작업 정의를 다시 한번 생성해줘야 한다.

아래의 플로우로 진행한다.

  1. 새로운 작업 정의를 생성한다.
  2. 해당 작업정의를 서비스로 등록한다.

위에서 설명한 내용을 반복한다면 자동으로 ALB에 등록됨과 동시에 라우팅이 진행될 것이다.




다른 사람들이 많이 읽은 글

댓글 보기