이번 블로그 글의 목표는 AWS ECS에서 실행되고 있는 서비스를, 자동 배포할 수 있는 방법을 찾아보고 장단점을 비교하는 것입니다.
ECS 서비스를 생성하고 사용하고 있지만, 이미지를 업로드하는 시점에 ECS에서 자동으로 서비스를 배포하고 싶은 요구사항이 있는 사용자에게 적합합니다.
먼저 AWS의 ECS가 뭔지, 어떻게 동작하는지 간단하게 설명하겠습니다.
Amazon Elastic Container Service(Amazon ECS)는 컨테이너 애플리케이션을 쉽게 배포, 관리 및 확대할 수 있도록 도와주는 완전 관리형 컨테이너 오케스트레이션 서비스입니다. - AWS 개발자 가이드
ECS를 사용하개 되면, 컨테이너로 된 애플리케이션을 쉽게 관리하고 배포하고 확장할 수 있습니다.
ECS의 서비스 레이어는 다음과 같습니다.
여기에서 사용되는 용어는 용량, 컨트롤러, 프로비저닝이 있습니다.각각의 용어를 간단하게 설명하면 다음과 같습니다.
용량: 컨테이너가 실행되는 인프라로, 컨테이너를 어떤 환경에서 쓸지를 정할 수 있습니다.
컨트롤러: 컨테이너에서 실행되는 애플리케이션을 배포하고 관리합니다.
프로비저닝: 스케줄러와 함께 애플리케이션 및 컨테이너를 배포 및 관리하는데 사용할 수 있는 도구입니다.
컨트롤러와 프로비저닝의 설명이 유사하다고 느낄 수 있는데, 컨트롤러는 애플리케이션의 배포, 관리 측면에 집중되어 있는 반면 프로비저닝은 컨테이너와 애플리케이션이 실행될 때, 인프라 설정 및 리소스 관리 측면에 집중되어 있습니다.
자동 배포를 하기 위해서는 먼저, ECS 배포를 위한 초기 설정을 해주어야 합니다.
해당 작업은, ECR에 이미지를 올리고, 태스크를 정의하고, 클러스터를 생성한 후 원하는 서비스를 실행하는 것까지를 의미합니다. 해당 내용을 설명하기에는 내용이 이번 글의 목적과 거리가 있고, 길어질 것 같아 만드는 작업은 생략하도록 하겠습니다.
다음에 기회가 되면 블로그 글로 쓰겠습니다! 😉
자동배포라는 키워드의 목표는 다음과 같습니다.
자습서: CodePipeline을 사용한 Amazon ECS 표준 배포 - AWS CodePipeline
Pipeline에서 추가 작업이 없이, AWS 내부 설정만으로, ECR에 새로운 이미지가 올라오는 경우 배포하도록 설정이 가능합니다.
이미지 여러개를 구성하는 경우 구체적인 설정이 가능합니다.
배포 시 다른 작업을 추가로 파이프라인에 끼워넣을 수 있습니다.
AWS CodePipeline 사용에 대한 비용이 발생합니다.
러닝 커브가 존재합니다. AWS의 다른 서비스 사용법을 익혀야 합니다.
AWS CLI 명령어를 통해, 기존 ECR 업로드 이후, 서비스를 직접 업데이트를 하도록 합니다.
aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --task-definition TASK_DEFINITION:REVISION
가장 간단하게, ECR, ECS 접근 가능한 역할이 있는 IAM User를 이용해서 ecr에 있는 이미지로 업데이트 할 수 있습니다.
추가 비용이 발생하지 않습니다.
AWS 외부에서 Key를 가지고 사용하므로 키 관리에 대한 보안 이슈가 발생할 수 있습니다.
ECR 업로드 시점에 자동으로 이루어지지 않고, 직접 업데이트 시키도록 코드를 작성해야 합니다.
자동 배포 예시
# AWS 자격증명 필요
aws ecs update-service --cluster 'Test-Cluster' --service 'Testing' --task-definition 'Testing-Project' --region ap-northeast-2 --force-new-deployment
--cluster 'Test-Cluster'
: 클러스터 이름은 Test-Cluster--service 'Testing'
: 클러스터 내 서비스 이름은 Testing--task-definition 'Testing-Project'
: 사용할 Task 정의를 명시--region ap-northeast-2
: ap-northeast-2 리전을 사용--force-new-deployment
: 업데이트 시, 가장 최근 태그의 정보를 기반으로 서비스 내 태스크 재 시작Bitbucket ECS Deploy Pipeline 를 이용
Bitbucket Pipeline에서 지원하는 aws-ecs-deploy
장점
AWS 명령어 없이 단순하게 변수 설정과 작업 정의의 json 파일을 통해서 사용할 수 있습니다.
추가 비용이 발생하지 않습니다.
단점
배포를 위한 작업정의 파일이 서비스 내부에서 관리되어 집니다.
필요성에 따라서, 각각의 자동배포 방법을 이용하면 될 것 같습니다.
만약 보안적인 요소가 중요하고, 프로젝트 자체 내에서 설정하고 싶지 않다면, 1번 방법인 AWS CodePipeline을 사용하는게 좋을 것 같습니다.
하지만 개발조직에서 이러한 배포를 빠르게 적용해야 하고, 큰 러닝커브가 부담이 된다면 2번 방법인 AWS CLI를 이용해서 직접 서비스를 업데이트 방법이 좋을 것 같습니다.