티스토리 뷰

728x90
반응형

 포스팅에서는 AWS ECS를 구성해 보는 세션입니다.


Amazon ECS는 Cloud 환경에 적용 가능한 Container Service로 OS를 포함하지 않아 가볍고, 빠른 배포, 빠른 기동이 가능한 컨테이너 오케스트레이션 서비스입니다.

컨테이너 오케스트레이션 도구에는 Docker에서 만든 Docker Swarm, 구글의 Kubernetes, 하시코프의 Nomad등 다양한 오케스트레이션 도구가 있습니다.


본 세션에서는 ECS의 Instance 형태인 Serverless기반의 Fargate와 VM기반의 EC2에 대해 각각 다뤄볼 예정입니다.

AWS EC2의 경우 컨테이너를 EC2 서버에 배치하고 이를 클러스터로 묶어서 관리하며, Fargate의 경우 서버 또는 클러스터를 관리할 필요없이 컨테이너를 논리적으로 관리하는 형태입니다.


본 실습은 총 세번에 걸쳐 진행될 예정입니다.

AWS ECS의 기본 개념 및 VPC & IAM 구성

㉡ Docker Image 생성 및 ECR Private Registry 반영

㉢ ECS Cluster 생성 및 구성

이번 포스팅에서는 그 첫번째 AWS ECS의 기본 개념 및 VPC & IAM 구성 방법에 대해 살펴보겠습니다.



AWS ECS 구성요소 및 주요개념

① ec2

- 이미지 생성 과정 설명

- ab를 사용한 성능 측정

- ELB를 활용한 ab 성능 측정

- Auto Scale를 활용한 Container 증가 감소 시연 과정


ecs (Amazon Elastic Container Service(ECS))

엘라스틱 컨테이너 서비스는 아마존 웹서비스에서 제공하는 매니지드 컨테이너 오케스트레이션 서비스입니다.

이를 사용하기에 앞서 핵심 개념들에 대해서 알아보겠습니다.


③ 도커와 Dockerfile

엘리스틱 컨테이너 서비스라는 이름에서 알 수 있듯이 이 서비스는 컨테이너 가상화를 기반으로 하고 있습니다. 컨테이너 가상화 도구에는 여러가지가 있습니다만 그 중에서 도커를 지원하고 있습니다. 이 글은 도커를 소개하는 글이 아니므로 독자분들이 도커를 어느 정도 사용해봤고, 이미지 생성을 위한 Dockerfile 작성법도 숙지하고 있다고 가정합니다. 


④ 태스크와 태스크 디피니션

ECS에서 컨테이너를 실행하는 최소 단위는 태스크입니다. 태스크는 컨테이너와는 조금 차이가 있습니다. 태스크는 하나 이상의 컨테이너로 구성됩니다. 일반적으로 하나의 필수 컨테이너만으로 구성됩니다. 하지만 필요에 따라 하나의 필수 컨테이너와 n개의 추가적인 컨테이너 조합이 될 수도 있습니다. 이 때 같은 태스크로 실행되는 컨테이너들은 모두 같은 컨테이너 인스턴스에서 실행되는 것이 보장됩니다.

태스크를 실행하려면 태스크 디피니션이 필요합니다. 태스크를 실행할 때 컨테이너 네트워크 모드, 태스크 역할, 도커 이미지, 실행 명령어, CPU 제한, 메모리 제한 등 다수의 설정이 필요합니다. 컨테이너 오케스트레이션에서는 컨테이너가 필요에 따라서 자동적으로 실행되거나 종료될 수 있습니다. 따라서 매번 이러한 설정들을 지정하기보다는, 미리 설정들의 집합을 하나의 단위로 정의해놓고 사용합니다. 이 단위가 바로 태스크 디피니션입니다. 한 번 태스크 디피니션을 만들면 이 태스크 디피니션을 기반으로 특정 설정을 변경할 수 있습니다. 이렇게 변경된 내용들은 모두 리비전으로 저장됩니다.


⑤ 서비스

클러스터에는 두 가지 방식으로 태스크를 실행할 수 있습니다. 먼저 첫 번째 방식은 태스크 디피니션으로 직접 태스크를 실행하는 방식입니다. 이 태스크는 곧바로 실행되며 실행이 된 이후에는 더 이상 관리되지 않습니다. 일회성 명령어라면 한 번 실행된 후 종료되며, 데몬 프로세스라면 태스크를 명시적으로 종료할 때까지 컨테이너가 남아있습니다. 직접 태스크를 실행하는 방법은 특별한 이유가 있을 때 외에는 거의 사용되지 않습니다.

두 번째 방법은 서비스를 정의하는 방법입니다. 서비스는 하나의 태스크 디피니션(리비전)과 연결됩니다. 서비스는 크게 리플리카 타입과 데몬 타입이 있습니다.* 데몬 타입으로 실행하는 경우 모든 컨테이너 인스턴스에 해당하는 태스크가 하나씩 실행됩니다. 이 타입은 인스턴스 관리를 위한 용도로 많이 사용됩니다. 리플리카 타입을 사용하면 실행하려는 태스크의 개수Number of tasks를 지정해야합니다. 서비스는 클러스터에서 이 개수만큼 태스크가 실행되도록 자동적으로 관리해줍니다. 리플리카 타입은 웹서버를 비롯한 실제 서비스에서 주로 사용됩니다.


# ECS의 장점

EC2와 같은 컴퓨팅 자원을 직접 사용해서 프로세스를 배치하는 경우 서버 운영자가 직접 어떤 인스턴스에 어떤 프로세스를 언제 배치할지 결정해야합니다. 오케스트레이션에서는 이러한 관리를 담당하는 스케줄러가 존재합니다. ECS에서는 서비스가 이러한 스케줄링을 담당하고 있습니다. ECS 서비스는 각 인스턴스들에 설치된 ecs-client에서 수집된 정보를 기반으로 어디에 어떤 태스크를 언제 실행할지 결정합니다. 따라서 리플리카 타입 서비스의 경우, 다수의 컨테이너 인스턴스가 있을 때 언제 어디에서 태스크가 실행될지 알 수 없습니다. 서비스가 직접 태스크 배치 스케줄링을 수행합니다.*


⑥ 엘라스틱 컨테이너 레지스트리

AWS ECS에서는 엘라스틱 컨테이너 레지스트리 ECR이라는 프라이빗 도커 레지스트리 서비스를 제공하고 있습니다. 도커 레지스트리는 도커 이미지를 저장 및 관리하는 서비스입니다. 일반적으로 도커에서 공식적으로 제공하는 도커허브가 많이 이용됩니다. 이미지를 비공개적로 푸시하거나 풀하는 경우에는 도커 허브의 유료 플랜을 이용하거나 직접 도커 레지스트리 서비스를 운용해야합니다. ECR을 사용해서 프라이빗 도커 레지스트리를 대체할 수 있으며, IAM과 조합함으로서 세세한 권한 관리가 가능합니다.


# 주요 개념

지금까지 설명한 주요 개념들을 정리하면 다음과 같습니다.

Docker : 컨테이너 가상화 도구.

Dockerfile : 도커의 이미지 생성 과정을 정의한 DSL 형식으로 작성된 파일.

클러스터 : ECS의 가장 기본적인 단위. 서비스나 태스크가 실행되는 공간을 나누는 논리적인 공간.

컨테이너 인스턴스 : 클러스터에서 속한 인스턴스. 클러스터에 서비스나 태스크 실행을 요청하면 클러스터에 속한 컨테이너 인스턴스 중 하나에서 실행된다.

서비스 :     태스크를 관리하는 단위. 내부적으로 태스크 실행을 위한 스케줄러를 가지고 있으면 서비스의 정의한 대로 태스크(들)이 실행되는 상태를 유지시키려고 한다.

엘라스틱 컨테이너 서비스 : AWS에서 제공하는 프라이빗 도커 레지스트리(이미지 저장소). 



테스트 과정

1. Github에서 Image를 생성할 소스를 Pull합니다.

2. Docker Image를 생성합니다.

3. 생성된 Container Image를 AWS ECR에 Push합니다.

4. AWS ECS는 해당 Container Image를 ECS Cluster Instance에 배포합니다.

5. 해당 서비스들은 Elastic Load Balancer를 이용해서 테스트 가능합니다.



ECS 네트워크 구성

1) 리전 설정

AWS 콘솔에 로그인하여 VPC를 선택합니다. 서울은 리전번호(ap-northeast-2)를 의미합니다.


2) VPC 마법사로 VPC 기본구성

VPC 대시보드

AWS Services 중 VPC로 이동합니다.

먼저 상단의 VPC 마법사 시작 버튼을 클릭합니다.

먼저 테스트를 진행한 VPC는 단일 퍼블릭 서브넷이 있는 VPC입니다.

선택 버튼을 누릅니다.

이후 생성한 VPC와 서브넷을 확인하기 위한 VPC 이름과 서브넷 이름을 지정합니다.

VPC 생성 버튼을 누릅니다.

VPC 마법사를 통해 VPC를 생성할 경우 기본으로 다음 리소스가 함께 생성됩니다.

① 생성한 NrsSingleVPC

② 생성시 명시한 퍼블릭 서브넷

Main Route Table & Subnet과 연동 된 Sub Route Table

④ NrsSingVPC와 연동 된 인터넷 게이트웨이


3) 추가 Subnet  생성

VPC 대시보드 -> 서브넷

먼저 Subnet을 추가로 생성합니다.

서브넷 생성 버튼을 클릭합니다.

아래와 같이 이후 생성한 서브넷을 구분하기 위한 태그 이름, VPC, AZ, IPv4 CIDR 블록을 지정한 이후 생성 버튼을 클릭합니다.


4) 라우팅 테이블 & 서브넷 연동

VPC 대시보드 -> 라우팅 테이블

생성한 서브넷을 라우팅 테이블에 연결합니다.

VPC 마법사로 생성된 Sub Route Table에 Subnet을 할당합니다. (Edit subnet associations)

추가한 subnet을 선택하고 Save를 클릭합니다.


각 모듈의 Tag를 다음과 같이 수정합니다.

VPC : NrsonPublicVPC

Subnet : NrsonPublicSubnet a, NrsonPublicSubnet b

RouteTable : NrsonMainRoute, NrsonPublicRoute

Internet Gateway : NrsonInternetGateway


ECS IAM Role, Security Group 설정

1) Role 생성

Docker Instance를 생성하기 위한 Instance를 위한 Role과 실제 EC2를 기동할때 사용할 Role을 구분하여 생성합니다.

IAM 대시보드 -> 역할

먼저 Docker Instance를 생성하기 위한 역할을 생성합니다.

역할 만들기 버튼을 클릭합니다.

AWS 서비스 -> EC2를 선택하고 권한 설정으로 넘어갑니다.

정책필터에 AmazonEC2ContainerRegistryFullAccess를 조회하여 선택 후 다음으로 이동합니다.

설정 내용을 검토하고 역할 만들기 버튼을 클릭합니다.

이와 마찬가지로 Instance를 기동하기 위한 Role을 생성합니다.

AmazonEC2ContainerServiceAutoscaleRule, AmazonEC2ContainerServiceforEC2Role를 조회하여 선택 후 역할을 생성합니다.


2) Secutiry Group 생성

EC2 대시보드 -> 네트워크 및 보안 -> 보안 그룹

보안 그룹을 생성합니다. 보안 그룹은 ACL을 설정하여 Inbound, Outbound 제한을 설정합니다.

보안 그룹 생성을 클릭합니다.

먼저 Public 보안 그룹을 생성합니다. (NrsonPublicSecurity)

하단의 설정은 HTTP 80 Port에 대한 Inbound를 허용하는 설정입니다. 기본으로 Outbound는 모두 허용되어 있습니다.

다음으로 Docker Instance를 생성한 EC2 인스턴스에 접속하기 위한 두번째 Security Group을 생성합니다. (NrsonDockerSecurity)

하단의 설정은 HTTP 22 Port에 대한 Inbound를 허용하는 설정입니다. 기본으로 Outbound는 모두 허용되어 있습니다.

마지막으로 Cluster를 생성하기 위한 세번째 Security Group을 생성합니다. (NrsonClusterSecurity)

하단의 설정은 HTTP 80 Port에 대한 Inbound를 허용하는 설정과 NrsonPublicSecurity에서 NrsonClusterSecurity쪽으로 모든 TCP를 허용하는 설정입니다. 기본으로 Outbound는 모두 허용되어 있습니다.


AWS ECS VPC & IAM를 구성해 보았습니다.

다음 포스팅에서는 Docker Image 생성 및 ECR에 반영하는 방법에 대해 살펴보겠습니다.

728x90
반응형