1. CLI 세팅하기
로컬 개발 환경에서 Amazon ECS의 프로덕션용 컨테이너형 애플리케이션을 명령줄 인터페이스로 구축하기 위해 AWS CLI와 ECS CLI를 설치합니다.
아래 공식문서를 참고하여 OS에 맞는 CLI를 설치합니다.
- 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 시작유형의 클러스터 생성할 때 인프라 정보, 인스턴스 네트워크 설정 두 가지로 나누어 볼 수 있습니다.
인프라
인프라 정보를 나열하자면 아래와 같은 것들이 있습니다.
- 오토스케일링 그룹(ASG)
- 운영체제/아키텍처
- EC2 인스턴스 유형
- 클러스터에서 시작할 인스턴스의 원하는 용량(최소, 최대)
- ssh 키페어
- 루트 EBS 볼륨 크기 (루트 EBS 볼륨의 크기를 늘려 더 큰 이미지 및 컨테이너 스토리지를 확보할 수 있습니다.)
EC2 인스턴스 네트워크 설정
네트워크 설정에서는 아래 네가지를 설정할 수 있습니다.
- VPC
- 서브넷
- 보안그룹
- 퍼블릭 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: 사용할 클러스터 설정의 이름을 지정합니다.
작성중…