Deploy scalable django on ECS (part 2)

박준영
7 min readNov 23, 2023

--

Photo by Faisal on Unsplash

part 1에서는 ECS 서비스에 대한 설명과 프로젝트를 도커화시키는 내용에 대해 다루었습니다. 자세한 내용이 궁금하신 분들은 이전 기사를 읽어보세요.

part2에서는 실제 클라우드 환경에 프로젝트를 올려볼 것입니다.
하나씩 시작해봅시다.

1. CLI 세팅하기

로컬 개발 환경에서 Amazon ECS의 프로덕션용 컨테이너형 애플리케이션을 명령줄 인터페이스로 구축하기 위해 AWS CLI와 ECS CLI를 설치합니다.

아래 공식문서를 참고하여 OS에 맞는 CLI를 설치합니다.

  1. AWS CLI 설치

AWS CLI를 설치 후 AWS 기능을 이용하기 위한 자격 증명(Credential) 설정을 해야 합니다.

IAM Console 에서 사용자 추가프로그래밍 방식 액세스를 선택합니다.
[기존 정책 직접 연결]에서 아래 정책들을 추가해주시면 됩니다.

  • AmazonEC2ContainerRegistryFullAccess
  • AmazonECS_FullAccess
  • AmazonEC2FullAccess
  • IAMFullAccess

자격 증명 정보가 담긴 CSV 파일을 다운로드 후 아래와 같이 설정을 합니다.

> aws configure
# AWS Access Key ID: ...
# AWS Secret Access Key: ...
# Default region name: ap-northeast-2
# Default output format: json

2. ECS CLI 설치

2. ECR 리포지토리 생성

AWS에서 ECR은 완전관리형 컨테이너 레지스트리로, 이미지와 아티팩트를 어디서나 쉽게 보관, 관리, 공유 및 배포하도록 지원한다고 설명합니다. AWS만의 Docker Hub라고 생각하면 됩니다.

aws ecr create-repository --repository-name base-python-prod
aws ecr create-repository --repository-name django-prod
aws ecr create-repository --repository-name nginx-prod

AWS Console의 ECR에 들어가면 ECR 리포지토리가 생성된 것을 확인할 수 있습니다.

3. 클러스터 생성

클러스터는 ECS의 가장 기본적인 단위입니다. 도커 컨테이너를 실행시킬 수 있는 가상의 공간으로 논리적인 단위입니다.

클러스터는 논리적인 단위이기 때문에 이름만 있어도 클러스터생성이 가능합니다.

클러스터는 앞서 얘기했듯이 두가지 유형으로 시작할 수 있는데 EC2 시작유형으로 진행했습니다. 왜냐하면 Fargate는 서버리스로 많은 이점을 제공해주지만 EC2 시작유형보다 비싸기 때문입니다.

EC2 시작유형의 클러스터 생성할 때 인프라 정보, 인스턴스 네트워크 설정 두 가지로 나누어 볼 수 있습니다.

인프라

인프라 정보를 나열하자면 아래와 같은 것들이 있습니다.

  1. 오토스케일링 그룹(ASG)
  2. 운영체제/아키텍처
  3. EC2 인스턴스 유형
  4. 클러스터에서 시작할 인스턴스의 원하는 용량(최소, 최대)
  5. ssh 키페어
  6. 루트 EBS 볼륨 크기 (루트 EBS 볼륨의 크기를 늘려 더 큰 이미지 및 컨테이너 스토리지를 확보할 수 있습니다.)

EC2 인스턴스 네트워크 설정

네트워크 설정에서는 아래 네가지를 설정할 수 있습니다.

  1. VPC
  2. 서브넷
  3. 보안그룹
  4. 퍼블릭 IP 자동 설정

퍼블릭 IP 자동 설정옵션은 Amazon EC2 인스턴스에 퍼블릭 IPv4 주소를 할당할지 여부를 결정합니다. 인터넷에서 인스턴스에 액세스할 수 있어야 하는 경우 퍼블릭 IP 주소가 필요합니다.

다음과 같은 옵션을 사용할 수 있습니다.

  • 서브넷 설정 사용 — 인스턴스가 시작되는 서브넷이 퍼블릭 서브넷인 경우 인스턴스에 퍼블릭 IP 주소를 할당합니다.
  • 켜기 — 인스턴스에 퍼블릭 IP 주소를 할당합니다.
  • 끄기 — 인스턴스에 퍼블릭 IP 주소를 할당하지 않습니다.

많은 설정들이 있지만 필요한 부분만 ecs-cli를 통해 클러스터 생성을 해보겠습니다.

클러스터 설정 세팅

ecs-cli configure \
--config-name your-config-name \
--cluster your-cluster-name \
--default-launch-type EC2 \
--region ap-northeast-2

- config-name: 클러스터 설정 이름을 설정합니다.

- cluster: 클러스터 이름을 설정합니다.

- default-launch-type: 클러스터 시작유형을 설정합니다.

- region: 클러스터를 설정할 리전을 설정합니다.

클러스터 생성하기

ecs-cli up \
--cluster-config your-config-name \
--size 2 \
--instance-type t3.large \
--vpc vpc-XXXXXXXX \
--subnets subnet-XXXXXXXX,subnet-XXXXXXXX,subnet-XXXXXXXX,subnet-XXXXXXXX \
--keypair your-key-pair \
--capability-iam

- cluster-config: 위에서 config-name으로 설정한 이름을 지정해줍니다.

- size: 클러스터에서 시작할 인스턴스의 원하는 용량을 지정합니다.

- instance-type: EC2 인스턴스 타입을 지정합니다.

- vpc: 해당 옵션이 없어도 자동으로 생성되지만 명시적으로 기본 vpc id를 세팅하여 혼란을 막을 수 있습니다.

- subnets: vpc 옵션을 사용했다면 필수로 입력해야하는 값으로 프로덕션에서는 3개의 서브넷을 사용하는 것을 권장하고 있습니다.

- keypair: 키 페어 파일의 이름을 지정하는 곳이며 홈 디렉토리의 .ssh 디렉토리에 위치해야 합니다.
키 페어를 지정하지 않으면 사용자가 다른 방법으로 로그인할 수 있도록 구성된 AMI를 선택하지 않는 한 SSH를 통해 인스턴스에 연결할 수 없습니다.

이제 AWS ECS Console에 가면 클러스터가 생성되어 있는 것을 확인할 수 있습니다.

4. 작업정의

작업정의는 ECS 서비스에게 한 개 혹은 다수의 도커 컨테이너를 실행하는 방법을 알려줍니다. 작업정의당 최대 10개의 컨테이너를 정의할 수 있으며 json 형식으로 정의가 됩니다.

작업정의에는 중요한 정보들이 포함되어 있습니다. 이미지 이름, 컨테이너에 바인딩된 포트, EC2 상에 있는 경우에는 호스트, 컨테이너에 요구되는 메모리와 CPU, 환경변수 및 네트워킹 정보, 태스크 정의로 연결된 IAM 역할, CloudWatch와 같은 로깅 구성 등이 있습니다.

다음과 같이 ecs-cli compose 명령어를 실행하면 docker-compose 설정 파일을 읽어서 작업 정의를 자동으로 생성합니다.

ecs-cli compose \
-f docker-compose.django-prod.yml \
-p django-task-prod \
create --cluster-config your-config-name

-f: docker-compose 설정 파일의 경로를 입력합니다.
-p: 작업 정의의 이름을 지정합니다.
— cluster-config: 사용할 클러스터 설정의 이름을 지정합니다.

작성중…

--

--