Hide

기존에 ECS를 사용하여 docker-compose를 배포하는 방법(https://hides.kr/1016)에 대해 포스팅했었다. 일반적인 ECS는 EC인스턴스 위에 컨테이너가 돌아가는 형태이므로 EC2에 대한 디펜던시를 가져갈 수 밖에 없다. 하지만 큰 문제가 없어서 계속 사용을 하던 중 Fargate 비용 인하 소식을 듣게 되었다. (https://aws.amazon.com/ko/about-aws/whats-new/2019/01/announcing-aws-fargate-price-reduction-by-up-to-50-)


최대 50% 요금을 인하한다고 하는데, 그래도 EC2를 이용하는 방법보다는 비용이 비싼 편이다. EC2 Container Service와 Fargate Container Service에 대한 비교글은 인터넷에 이미 많이 공개가 되어 있으므로 오늘 포스팅에서는 실제로 어떠한 형태로 배포하는지에 대해 알아보고 더 나아가서 서비스 중단없이 무중단으로 배포하는 Blue/Green Deployment까지 알아본다.


1. 클러스터 생성

먼저 클러스터를 생성해야한다. ECS콘솔로 들어가서 클러스터 생성을 누른다.



가장 왼쪽에 있는 유형이 Fargate 전용 클러스터이다. 선택하고 다음 단계로 넘어간다.



원하는 클러스터 이름을 적는다. 그리고 VPC를 생성하고 싶으면 생성에 체크한다. 나는 기존에 존재하는 VPC를 사용할 것이므로 따로 생성하지 않았다. 아래쪽에 있는 생성 버튼을 누르면 클러스터가 생성된다. (VPC를 함께 생성하면 약간의 시간이 소요된다)


2. ALB(Application Load Balancer) 생성

다음으로 로드 밸런서를 생성할 차례이다. EC2 콘솔 - 로드밸런서로 들어가서 로드밸런서 생성 버튼을 누른다.



우리는 Application Load Balancer를 사용할 것이므로 가장 왼쪽에 있는 로드 밸런서를 선택한다.



이름에는 원하는 이름을 적는다.



사용할 VPC를 선택하면 아래에 등록된 서브넷 두개가 나온다. 체크하고 다음으로 넘어간다. (보안 설정 구성은 건너뛴다)



사용할 보안 그룹을 설정한다. 나는 기존에 생성된 보안 그룹을 선택했다.



라우팅을 위해 그룹을 생성해야한다. 어차피 생성한 이후에 제거하고 서비스 생성당시에 다시 붙일 것이므로 원하는 이름을 적고 다음으로 넘어간다. 그 다음 페이지에서는 로드 밸런서에 붙일 인스턴스를 선택하는 페이지인데 일단 나중에 붙일 것이므로 계속 넘어가서 최종적으로 로드 밸런서를 생성시킨다.


3. 도커 이미지 빌드 및 ECR 푸시

먼저 docker-compose.yml 파일은 작성해놨다고 가정한다. 작성한 파일을 아래의 명령어를 통해 빌드한다.


docker-compose -f docker-compoer.yml build


그리고 ECR에 푸시한다.


docker tag 빌드된_이미지_이름 ECR주소

docker push ECR주소


4. 작업 정의(Task Definition) 생성

이제 작업 정의를 생성해줘야 한다. ECS는 클러스터 내부에 여러개의 서비스가 존재하고 하나의 서비스에 여러개의 작업 정의가 실행되는 형태이다. 먼저 docker-compose-fargate.yml 라는 파일을 생성하고 아래의 내용으로 채워넣는다.


version: "3"

services:
web_service:
image: ECR이미지 주소
ports:
- "8000:8000"
logging:
driver: awslogs
options:
awslogs-group: demo-web
awslogs-region: ap-northeast-2
awslogs-stream-prefix: demo-web

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


본 예제에서는 Django 어플리케이션이 들어있는 web_service 이미지와 Nginx두개를 돌릴 예정이다. 각 이미지의 ECR주소를 적어준 형태이다. 다음으로 ecs-params-fargate.yml 파일을 만들고 아래의 내용을 넣는다.


version: 1
task_definition:
task_execution_role: ecsTaskExecutionRole
ecs_network_mode: awsvpc
task_size:
mem_limit: 0.5GB
cpu_limit: 256
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- "서브넷1"
- "서브넷2"
security_groups:
- "보안그룹"
assign_public_ip: ENABLED


서브넷과 보안 그룹을 채워넣어준다. 그리고 아래의 명령어로 작업 정의를 생성한다.


ecs-cli compose --project-name fargate-task --file docker-compose-fargate.yml --ecs-params ecs-params-fargate.yml --region ap-northeast-2 create --launch-type FARGATE


여기서 주의할 점이 한가지 있다. 나같은 경우 Django와 Nginx를 엮어주는 형태의 docker-compose파일을 작성했다. 예를 들어 장고 어플리케이션의 이름을 위와 같이 web_service로 지정해줬을 경우 Nginx쪽에서 links를 통해 web_service를 걸어줄텐데, Fargate유형의 ECS는 links를 사용할 수 없다. 아니, 엄밀히 말하면 links를 사용할 필요가 없다. Fargate로 올라가는 docker-compose의 경우 모두 같은 Namespace를 공유하므로 localhost로 포트만 다르게 접근하면 되기 때문이다.


5. 서비스(Service) 생성

위에서 말했듯이 ECS는 하나의 서비스 안에 여러개의 작업 정의가 실행되는 형태이다. 따라서 4번에서 생성한 작업 정의를 서비스를 통해 실행시켜줘야 한다. 먼저 1번에서 생성한 클러스터로 들어가서 서비스 생성 버튼을 누른다.



유형은 Fargate로 선택하고 우리가 생성한 작업 정의를 선택한다. (나는 테스트하면서 작업 정의를 여러번 생성했기에 Revision번호가 13이다) 그리고 클러스터의 이름을 적고 작업 개수를 지정해준다.



배포 방식은 Rolling Update로 선택해준다. 어차피 나중에 서비스를 업데이트하여 새로운 버전을 배포하면 자동으로 Blue/Green Deployment가 진행된다. 다만 이 부분에서 Blue/Green을 선택하면 Codedeploy와 연동하여 배포 전 테스트, 배포 도중 실패했을 시 롤백하는 기능을 사용할 수 있다. 다음 단계로 넘어간다.



VPC, 서브넷, 보안그룹을 설정해준다.



위에서 Application Load Balancer를 생성해줬으므로 ALB를 선택한다. 또한 컨테이너에서 로드 밸런싱해줄 컨테이너를 선택한다. (나는 Nginx를 선택했다) 그리고 ELB에 추가 버튼을 누르면 아래에 설정하는 공간이 추가적으로 생긴다.



리스너 포트에 80을 적어준다. 대상 그룹등은 자동적으로 적혀있을 것이다. 다음 단계로 넘어간다.



여기서는 일단 오토 스케일링을 적용하지 않을 것이므로 다음 단계로 넘어가서 서비스를 생성시킨다.



서비스를 생성하면 아마 위와 같은 상태일 것이다. 오른쪽 새로 고침 버튼을 누르다 보면 마지막 상태가 PROVISIONING에서 PENDING으로, PENDING에서 RUNNING으로 바뀐다. 그러면 서비스가 정상적으로 올라간 상태라고 보면 된다.


6. Blue/Green Deployment


클러스터로 들어가서 업데이트할 서비스를 선택한 후 업데이트 버튼을 누른다.



작업 정의를 업데이트했다면 새로운 작업 정의를 선택하고 그렇지 않다면 새 배포 적용에 체크를 해준다. 다음 단계로 넘어가서 로드 밸런싱도 다시 잡아주고 배포를 진행하면 된다.



다른 사람들이 많이 읽은 글

댓글 보기