본문 바로가기
Coding/DevOps

AWS ECS Fargate에 docker-compose 배포하는 방법

by Hide­ 2019. 3. 25.
반응형

기존에 ECS를 사용하여 docker-compose를 배포하는 방법(https://hides.tistory.com/1016)에 대해 포스팅했었다. 일반적인 ECS는 EC2 인스턴스 위에 컨테이너가 돌아가는 형태이므로 EC2에 대한 디펜던시를 가져갈 수 밖에 없다. 하지만 큰 문제가 없어서 계속 사용을 하던 중 Fargate의 비용 인하 소식을 듣게 되었다. (https://aws.amazon.com/ko/about-aws/whats-new/2019/01/announcing-aws-fargate-price-reduction-by-up-to-50-/) 최대 50% 요금을 인하한다고 하는데, 그래도 EC2를 이용하는 ECS보단 가격이 있는 편이다. EC2 Container Service와 Fargate Container Service에 대한 비교글은 인터넷에 이미 많이 공개가 되었으므로 오늘 포스팅에서는 실제로 어떤 방법으로 배포를 할 수 있는지에 대해 알아본다.


ECS 클러스터(Cluster) 생성

먼저 AWS ECS콘솔 - 클러스터 생성으로 들어간다.



첫번째 템플릿이 Fargate 전용 템플릿이다. 선택하고 다음 단계로 넘어간다.



원하는 클러스터의 이름을 적는다. (여기서는 TestCluster) VPC는 새로 생성할것이면 VPC 생성에 체크하고 아니면 그대로 생성을 누른다.


작업 정의(Task Definition) 생성

다음으로 작업 정의를 생성해줘야 한다. 작업 정의 - 새 작업 정의 생성으로 들어간다.



클러스터와 마찬가지로 작업 정의도 어떠한 형태의 작업 정의를 생성할 것인지 골라줘야 한다. 왼쪽에 있는 FARGATE를 선택하고 다음 단계를 누른다.



원하는 작업 정의를 고른다. 작업 역할에는 실제 컨테이너에서 필요한 AWS 권한을 가진 역할을 정해주면 된다. 예를 들어 컨테이너에서 AWS Secret Manager를 사용한다고 가정하면 해당 Policy를 특정 역할에 포함시키고 작업 역할에 해당 역할을 선택해주면 된다. 여기서는 특별한 작업이 없으므로 작업 역할은 특별하게 명시하지 않고 진행한다.



다음으로 작업 실행 IAM역할이다. 나는 기존에 ECS를 사용했기때문에 ecsTaskExecutionRole이 생성되어있지만 처음 시작하는 경우 해당 역할이 없을수도 있다. 하지만 명시되어있는 것처럼 없다면 자동으로 생성해준다.




이제 작업 메모리와 작업 CPU를 정해줘야 한다. 본 포스팅에서는 테스팅 용도이므로 작업 메모리/작업 CPU모두 가장 낮은 단위를 선택했다. 그리고 아래에 있는 컨테이너 추가를 누른다.



컨테이너 이름과 ECR에 푸시되어있는 이미지의 URL을 입력한다. 그리고 원하는 정도의 메모리와 열어둬야할 포트를 입력한다. 아래쪽에 있는 고급 컨테이너 구성은 특별히 건드리지 않고 생성을 누른다. 그리고 최종적으로 생성을 누른다.



위와 같이 나온다면 성공적으로 작업 정의를 생성한 것이다. 


ALB(Application Load Balancer) 생성

EC2 콘솔 - 로드 밸런서 생성으로 들어가면 위처럼 총 3개의 로드 밸런서 유형이 나올 것이다. 우리는 Application Load Balancer를 생성할 것이므로 가장 왼쪽에 있는 것을 선택하고 생성을 누른다.



원하는 로드 밸런서의 이름을 적는다.



이제 리스너 포트를 지정해줘야 한다. 나중에 ECS 서비스를 ALB에 등록하면 위에 Health Check를 통해 연결된 서비스가 제대로 동작하는지 확인하는데, 이 때 사용할 포트를 같이 적어줘야 한다. 기본적으로 80 포트를 사용하지만 추후 Blue/Green Deployment를 위해 8080포트도 추가해준다.



사용할 VPC와 서브넷 2개를 골라준다. (서브넷에는 왼쪽 체크박스에 꼭 체크해줘야 한다)



2단계 보안 설정 구성을 건너뛰면 위처럼 보안 그룹을 설정하는 화면이 나온다. 새로 생성하거나 기존 보안 그룹을 선택하고 다음 단계로 넘어간다.



이제 사용자가 들어오면 어디로 라우팅해주는지 설정해줘야 한다. 나는 80포트로 설정해줬다. 그리고 Health Check를 위한 경로도 설정해줘야 하는데 나는 기본적인 / 경로를 설정해줬다. 다음 단계로 넘어가서 5단계 대상 등록은 아무것도 등록하지말고 일단 건너뛴다.



위와 같은 화면이 나온다면 성공적으로 ALB를 생성한 것이다.


서비스(Service) 생성

기존에 생성한 클러스터 - 서비스로 가서 생성을 누른다.



시작 유형에 FARGATE를 선택하고 작업 정의에 위에서 생성한 작업 정의를 선택한다. (아마 기본적으로 선택되어 있을 것이다) 다음으로 서비스 이름을 명시해주고 원하는 작업 개수를 입력한다.



본 포스팅에서는 Blue/Green Deployment를 진행할 것이므로 해당 설정을 골라줬다.



사용할 VPC와 서브넷을 골라준다. 보안 그룹도 기존 보안 그룹을 사용할 예정이라면 편집을 누르고 해당 보안 그룹을 선택한다.


조금 아래로 내리다보면 로드 밸런서를 선택하는 부분이 나온다. Application Load Balancer를 선택하면 아래 ELB 이름에 우리가 생성한 로드 밸런서의 이름이 나올 것이다.



이제 실제 사용자 요청이 들어오면 어떤 컨테이너로 라우팅해줄 지 골라줘야 한다. 나는 Django - Nginx 두개의 컨테이너를 띄운 형태인데, Nginx에서 사용자의 요청을 받고 uwsgi를 통해 Django로 넘겨주는 형태이기에 Nginx를 골라줬다. 컨테이너를 선택했으면 ELB에 추가 버튼을 누른다.



리스너 포트는 80으로 지정하고 테스트 포트는 이전에 로드 밸런서에 추가했던 8080을 적어준다. 그리고 다음 단계를 눌러서 끝까지 이동한다음 최종적으로 서비스를 생성한다. (오토 스케일링은 건너뛴다) 


서비스까지 생성하고 위에서 생성한 ALB주소로 들어가보면 정상적으로 접속이 되는것을 확인할 수 있다. 이제 Blue/Green Deployment쪽을 설정해줘야 한다.


--추가중 --